Address more of brendan's comments

This commit is contained in:
Mack Duan 2013-04-18 10:41:33 -07:00
parent 27fe18e8c6
commit 2ce00279be
7 changed files with 95 additions and 66 deletions

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* globals assert, MissingDataException, isInt, NetworkManager, PDFJS,
/* globals assert, MissingDataException, isInt, NetworkManager, Promise,
isEmptyObj */
'use strict';
@ -233,7 +233,7 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
this.requestsByChunk = {};
this.callbacksByRequest = {};
this.loadedStream = new PDFJS.Promise();
this.loadedStream = new Promise();
}
ChunkedStreamManager.prototype = {

View File

@ -18,7 +18,7 @@
isArrayBuffer, isDict, isName, isStream, isString, Lexer,
Linearization, NullStream, PartialEvaluator, shadow, Stream,
StreamsSequenceStream, stringToPDFString, TODO, Util, warn, XRef,
MissingDataException, PDFJS */
MissingDataException, Promise */
'use strict';
@ -149,21 +149,22 @@ var Page = (function PageClosure() {
},
getOperatorList: function Page_getOperatorList(handler) {
var self = this;
var promise = new PDFJS.Promise();
var promise = new Promise();
var pageListPromise = new PDFJS.Promise();
var annotationListPromise = new PDFJS.Promise();
var pageListPromise = new Promise();
var annotationListPromise = new Promise();
var pdfManager = this.pdfManager;
var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
[]);
var resourcesPromise = pdfManager.ensure(this, 'resources');
var dataPromises = PDFJS.Promise.all(
var dataPromises = Promise.all(
[contentStreamPromise, resourcesPromise]);
dataPromises.then(function(data) {
var contentStream = data[0];
var resources = data[1];
var pe = self.pe = new PartialEvaluator(
pdfManager,
self.xref, handler, self.pageIndex,
'p' + self.pageIndex + '_');
@ -180,7 +181,7 @@ var Page = (function PageClosure() {
pdfManager.ensure(this, 'getAnnotationsForDraw', []).then(
function(annotations) {
var annotationEvaluator = new PartialEvaluator(
self.xref, handler, self.pageIndex,
pdfManager, self.xref, handler, self.pageIndex,
'p' + self.pageIndex + '_annotation');
pdfManager.ensure(annotationEvaluator, 'getAnnotationsOperatorList',
@ -194,7 +195,7 @@ var Page = (function PageClosure() {
}
);
PDFJS.Promise.all([pageListPromise, annotationListPromise]).then(
Promise.all([pageListPromise, annotationListPromise]).then(
function(datas) {
var pageData = datas[0];
var pageQueue = pageData.queue;
@ -221,12 +222,12 @@ var Page = (function PageClosure() {
var self = this;
var textContentPromise = new PDFJS.Promise();
var textContentPromise = new Promise();
var pdfManager = this.pdfManager;
var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
[]);
var resourcesPromise = new PDFJS.Promise();
var resourcesPromise = new Promise();
pdfManager.ensure(this, 'resources').then(function(resources) {
pdfManager.ensure(self.xref, 'fetchIfRef', [resources]).then(
function(resources) {
@ -235,12 +236,13 @@ var Page = (function PageClosure() {
);
});
var dataPromises = PDFJS.Promise.all([contentStreamPromise,
var dataPromises = Promise.all([contentStreamPromise,
resourcesPromise]);
dataPromises.then(function(data) {
var contentStream = data[0];
var resources = data[1];
var pe = new PartialEvaluator(
pdfManager,
self.xref, handler, self.pageIndex,
'p' + self.pageIndex + '_');

View File

@ -19,15 +19,17 @@
IDENTITY_MATRIX, info, isArray, isCmd, isDict, isEOF, isName, isNum,
isStream, isString, JpegStream, Lexer, Metrics, Name, Parser,
Pattern, PDFImage, PDFJS, serifFonts, stdFontMap, symbolsFonts,
TilingPattern, TODO, warn, Util, MissingDataException, globalScope */
TilingPattern, TODO, warn, Util, MissingDataException, Promise */
'use strict';
var PartialEvaluator = (function PartialEvaluatorClosure() {
function PartialEvaluator(xref, handler, pageIndex, uniquePrefix) {
function PartialEvaluator(pdfManager, xref, handler, pageIndex,
uniquePrefix) {
this.state = new EvalState();
this.stateStack = [];
this.pdfManager = pdfManager;
this.xref = xref;
this.handler = handler;
this.pageIndex = pageIndex;
@ -165,7 +167,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
buildFormXObject: function PartialEvaluator_buildFormXObject(resources,
xobj, smask) {
var self = this;
var promise = new PDFJS.Promise();
var promise = new Promise();
var fnArray = [];
var argsArray = [];
@ -302,7 +304,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
fn, args, resources, pattern, patternDict) {
var self = this;
// Create an IR of the pattern code.
var promise = new PDFJS.Promise();
var promise = new Promise();
var opListPromise = this.getOperatorList(pattern,
patternDict.get('Resources') || resources);
opListPromise.then(function(data) {
@ -324,7 +326,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
handleSetFont: function PartialEvaluator_handleSetFont(
resources, fontArgs, font) {
var promise = new PDFJS.Promise();
var promise = new Promise();
// TODO(mack): Not needed?
var fontName;
if (fontArgs) {
@ -413,7 +415,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
gStateObj.push([key, value]);
break;
case 'Font':
var promise = new PDFJS.Promise();
var promise = new Promise();
self.handleSetFont(resources, null, value[0]).then(function(data) {
var gState = ['Font', data.loadedName, value[1]];
promise.resolve({
@ -478,8 +480,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
}
}
var promise = new PDFJS.Promise();
PDFJS.Promise.all(promises).then(function(datas) {
var promise = new Promise();
Promise.all(promises).then(function(datas) {
for (var i = 0, n = datas.length; i < n; ++i) {
var data = datas[i];
var index = indices[i];
@ -500,7 +502,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
loadFont: function PartialEvaluator_loadFont(fontName, font, xref,
resources) {
var promise = new PDFJS.Promise();
var promise = new Promise();
var fontRes = resources.get('Font');
@ -551,7 +553,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
opListPromises.push(
this.getOperatorList(glyphStream, fontResources));
}
PDFJS.Promise.all(opListPromises).then(function(datas) {
Promise.all(opListPromises).then(function(datas) {
var charProcOperatorList = {};
var dependencies = {};
for (var i = 0, n = charProcKeys.length; i < n; ++i) {
@ -606,7 +608,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
// dictionary
var parser = new Parser(new Lexer(stream, OP_MAP), false, xref);
var promise = new PDFJS.Promise();
var promise = new Promise();
function parseCommands() {
try {
parser.restoreState();
@ -770,7 +772,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
subQueuePromises.push(argsArray[i][0]);
}
}
PDFJS.Promise.all(subQueuePromises).then(function(datas) {
Promise.all(subQueuePromises).then(function(datas) {
// TODO(mack): Optimize by using repositioning elements
// in original queue rather than creating new queue
@ -817,10 +819,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
throw e;
}
var streamManager = globalScope.pdfManager.streamManager;
streamManager.requestRange(e.begin, e.end, function() {
parseCommands();
});
self.pdfManager.requestRange(e.begin, e.end).then(parseCommands);
}
}
parser.saveState();
@ -832,7 +831,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
getAnnotationsOperatorList:
function PartialEvaluator_getAnnotationsOperatorList(annotations,
dependency) {
var promise = new PDFJS.Promise();
var promise = new Promise();
// 12.5.5: Algorithm: Appearance streams
function getTransformMatrix(rect, bbox, matrix) {
@ -878,13 +877,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
annotation.resources);
opListPromises.push(opListPromise);
} else {
var opListPromise = new PDFJS.Promise();
var opListPromise = new Promise();
opListPromise.resolve(createOperatorList());
opListPromises.push(opListPromise);
}
}
PDFJS.Promise.all(opListPromises).then(function(datas) {
Promise.all(opListPromises).then(function(datas) {
var fnArray = [];
var argsArray = [];
var dependencies = {};
@ -923,10 +922,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
var MULTI_SPACE_FACTOR = 1.5;
var self = this;
var statePromise = new PDFJS.Promise();
var statePromise = new Promise();
function handleSetFont(fontName, fontRef, resources) {
var promise = new PDFJS.Promise();
var promise = new Promise();
self.loadFont(fontName, fontRef, self.xref, resources).then(
function(data) {
promise.resolve(data.font.translated);
@ -969,7 +968,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
//.translated;
break;
case 'TJ':
var chunkPromise = new PDFJS.Promise();
var chunkPromise = new Promise();
chunkPromises.push(chunkPromise);
fontPromise.then(function(items, font) {
var chunk = '';
@ -994,7 +993,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
}.bind(null, args[0]));
break;
case 'Tj':
var chunkPromise = new PDFJS.Promise();
var chunkPromise = new Promise();
chunkPromises.push(chunkPromise);
fontPromise.then(function(charCodes, font) {
var chunk = fontCharsToUnicode(charCodes, font);
@ -1006,7 +1005,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
// For search, adding a extra white space for line breaks
// would be better here, but that causes too much spaces in
// the text-selection divs.
var chunkPromise = new PDFJS.Promise();
var chunkPromise = new Promise();
chunkPromises.push(chunkPromise);
fontPromise.then(function(charCodes, font) {
var chunk = fontCharsToUnicode(charCodes, font);
@ -1016,7 +1015,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
break;
case '"':
// Note comment in "'"
var chunkPromise = new PDFJS.Promise();
var chunkPromise = new Promise();
chunkPromises.push(chunkPromise);
fontPromise.then(function(charCodes, font) {
var chunk = fontCharsToUnicode(charCodes, font);
@ -1081,7 +1080,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
}
} // while
PDFJS.Promise.all(chunkPromises).then(function(datas) {
Promise.all(chunkPromises).then(function(datas) {
var bidiTexts = [];
for (var i = 0, n = datas.length; i < n; ++i) {
var bidiText = datas[i];
@ -1100,10 +1099,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
throw e;
}
var streamManager = globalScope.pdfManager.streamManager;
streamManager.requestRange(e.begin, e.end, function() {
parseCommands();
});
self.pdfManager.requestRange(e.begin, e.end).then(parseCommands);
}
}
parser.saveState();

View File

@ -17,8 +17,8 @@
/* globals assertWellFormed, bytesToString, CipherTransformFactory, error, info,
InvalidPDFException, isArray, isCmd, isDict, isInt, isName, isRef,
isStream, JpegStream, Lexer, log, Page, Parser, Promise, shadow,
stringToPDFString, stringToUTF8String, warn, isString, assert, PDFJS,
MissingDataException, XRefParseException, Stream */
stringToPDFString, stringToUTF8String, warn, isString, assert,
Promise, MissingDataException, XRefParseException, Stream */
'use strict';
@ -339,7 +339,7 @@ var Catalog = (function CatalogClosure() {
getPage: function Catalog_getPage(pageIndex) {
if (!(pageIndex in this.pagePromises)) {
this.pagePromises[pageIndex] = new PDFJS.Promise();
this.pagePromises[pageIndex] = new Promise();
}
return this.pagePromises[pageIndex];
},
@ -367,7 +367,7 @@ var Catalog = (function CatalogClosure() {
var page = new Page(this.pdfManager, this.xref, pageIndex, kid,
kidRef);
if (!(pageIndex in this.pagePromises)) {
this.pagePromises[pageIndex] = new PDFJS.Promise();
this.pagePromises[pageIndex] = new Promise();
}
this.pagePromises[pageIndex].resolve(page);

View File

@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* globals NotImplementedException, MissingDataException, PDFJS, Stream,
/* globals NotImplementedException, MissingDataException, Promise, Stream,
PDFDocument, ChunkedStream, ChunkedStreamManager */
'use strict';
@ -50,6 +50,10 @@ var BasePdfManager = (function BasePdfManagerClosure() {
return new NotImplementedException();
},
requestRange: function BasePdfManager_ensure(begin, end) {
return new NotImplementedException();
},
requestLoadedStream: function BasePdfManager_requestLoadedStream() {
return new NotImplementedException();
}
@ -62,7 +66,7 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
function LocalPdfManager(data, password) {
var stream = new Stream(data);
this.pdfModel = new PDFDocument(this, stream, password);
this.loadedStream = new PDFJS.Promise();
this.loadedStream = new Promise();
this.loadedStream.resolve(stream);
}
@ -71,7 +75,7 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
LocalPdfManager.prototype.ensure =
function LocalPdfManager_ensure(obj, prop, args) {
var promise = new PDFJS.Promise();
var promise = new Promise();
try {
var value = obj[prop];
var result;
@ -88,6 +92,13 @@ var LocalPdfManager = (function LocalPdfManagerClosure() {
return promise;
};
LocalPdfManager.prototype.requestRange =
function LocalPdfManager_requestRange(begin, end) {
var promise = new Promise();
promise.resolve();
return promise;
};
LocalPdfManager.prototype.requestLoadedStream =
function LocalPdfManager_requestLoadedStream() {
};
@ -126,7 +137,7 @@ var NetworkPdfManager = (function NetworkPdfManagerClosure() {
NetworkPdfManager.prototype.ensure =
function NetworkPdfManager_ensure(obj, prop, args) {
var promise = new PDFJS.Promise();
var promise = new Promise();
this.ensureHelper(promise, obj, prop, args);
return promise;
};
@ -155,6 +166,15 @@ var NetworkPdfManager = (function NetworkPdfManagerClosure() {
}
};
NetworkPdfManager.prototype.requestRange =
function NetworkPdfManager_requestRange(begin, end) {
var promise = new Promise();
this.streamManager.requestRange(begin, end, function() {
promise.resolve();
});
return promise;
};
NetworkPdfManager.prototype.requestLoadedStream =
function NetworkPdfManager_requestLoadedStream() {
this.streamManager.requestAllChunks();

View File

@ -112,7 +112,7 @@ var WorkerMessageHandler = {
var pdfManager;
function loadDocument(recoveryMode) {
var loadDocumentPromise = new PDFJS.Promise();
var loadDocumentPromise = new Promise();
var parseSuccess = function parseSuccess() {
var numPagesPromise = pdfManager.ensureModel('numPages');
@ -122,7 +122,7 @@ var WorkerMessageHandler = {
var metadataPromise = pdfManager.ensureCatalog('metadata');
var encryptedPromise = pdfManager.ensureXRef('encrypt');
var javaScriptPromise = pdfManager.ensureCatalog('javaScript');
PDFJS.Promise.all([numPagesPromise, fingerprintPromise, outlinePromise,
Promise.all([numPagesPromise, fingerprintPromise, outlinePromise,
infoPromise, metadataPromise, encryptedPromise,
javaScriptPromise]).then(
function onDocReady(results) {
@ -155,7 +155,7 @@ var WorkerMessageHandler = {
}
function getPdfManager(data) {
var pdfManagerPromise = new PDFJS.Promise();
var pdfManagerPromise = new Promise();
var source = data.source;
var disableRange = data.disableRange;
@ -285,7 +285,6 @@ var WorkerMessageHandler = {
};
getPdfManager(data).then(function() {
globalScope.pdfManager = pdfManager;
loadDocument(false).then(onSuccess, function(ex) {
// Try again with recoveryMode == true
if (!(ex instanceof XRefParseException)) {
@ -308,7 +307,7 @@ var WorkerMessageHandler = {
var refPromise = pdfManager.ensure(page, 'ref');
var viewPromise = pdfManager.ensure(page, 'view');
PDFJS.Promise.all([rotatePromise, refPromise, viewPromise]).then(
Promise.all([rotatePromise, refPromise, viewPromise]).then(
function(results) {
var page = {
pageIndex: data.pageIndex,

View File

@ -28,9 +28,12 @@ describe('evaluator', function() {
}
};
function PdfManagerMock() { }
describe('splitCombinedOperations', function() {
it('should reject unknown operations', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('qTT');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -44,7 +47,8 @@ describe('evaluator', function() {
});
it('should handle one operations', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('Q');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -57,7 +61,8 @@ describe('evaluator', function() {
});
it('should handle two glued operations', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var resources = new ResourcesMock();
resources.Res1 = {};
@ -73,7 +78,8 @@ describe('evaluator', function() {
});
it('should handle tree glued operations', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('qqq');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -88,7 +94,8 @@ describe('evaluator', function() {
});
it('should handle three glued operations #2', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var resources = new ResourcesMock();
resources.Res1 = {};
@ -105,7 +112,8 @@ describe('evaluator', function() {
});
it('should handle glued operations and operands', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('q5 Ts');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -122,7 +130,8 @@ describe('evaluator', function() {
});
it('should handle glued operations and literals', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('trueifalserinullq');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -145,7 +154,8 @@ describe('evaluator', function() {
describe('validateNumberOfArgs', function() {
it('should execute if correct number of arguments', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('5 1 d0');
console.log('here!');
@ -158,7 +168,8 @@ describe('evaluator', function() {
});
});
it('should execute if too many arguments', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('5 1 4 d0');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());
@ -171,7 +182,8 @@ describe('evaluator', function() {
});
});
it('should skip if too few arguments', function() {
var evaluator = new PartialEvaluator(new XrefMock(), new HandlerMock(),
var evaluator = new PartialEvaluator(new PdfManagerMock(),
new XrefMock(), new HandlerMock(),
'prefix');
var stream = new StringStream('5 d0');
var promise = evaluator.getOperatorList(stream, new ResourcesMock());