18
18
* @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
19
19
*/
20
20
PDFJS .getDocument = function getDocument (source ) {
21
- var url , data , headers , password , parameters = {};
21
+ var url , data , headers , password , parameters = {}, workerInitializedPromise ,
22
+ workerReadyPromise , transport ;
23
+
22
24
if (typeof source === 'string' ) {
23
25
url = source ;
24
26
} else if (isArrayBuffer (source )) {
@@ -37,8 +39,9 @@ PDFJS.getDocument = function getDocument(source) {
37
39
'string or a parameter object' );
38
40
}
39
41
40
- var promise = new PDFJS .Promise ();
41
- var transport = new WorkerTransport (promise );
42
+ workerInitializedPromise = new PDFJS .Promise ();
43
+ workerReadyPromise = new PDFJS .Promise ();
44
+ transport = new WorkerTransport (workerInitializedPromise , workerReadyPromise );
42
45
if (data ) {
43
46
// assuming the data is array, instantiating directly from it
44
47
transport .sendData (data , parameters );
@@ -48,24 +51,31 @@ PDFJS.getDocument = function getDocument(source) {
48
51
{
49
52
url : url ,
50
53
progress : function getPDFProgress (evt ) {
51
- if (evt .lengthComputable )
52
- promise .progress ({
54
+ if (evt .lengthComputable ) {
55
+ workerReadyPromise .progress ({
53
56
loaded : evt .loaded ,
54
57
total : evt .total
55
58
});
59
+ }
56
60
},
57
61
error : function getPDFError (e ) {
58
- promise .reject ('Unexpected server response of ' +
62
+ workerReadyPromise .reject ('Unexpected server response of ' +
59
63
e .target .status + '.' );
60
64
},
61
65
headers : headers
62
66
},
63
67
function getPDFLoad (data ) {
64
- transport .sendData (data , parameters );
68
+ // sometimes the pdf has finished downloading before the web worker-test
69
+ // has finished. In that case the rendering of the final pdf would cause
70
+ // errors. We have to wait for the WorkerTransport to finalize worker-
71
+ // support detection
72
+ workerInitializedPromise .then (function workerInitialized () {
73
+ transport .sendData (data , parameters );
74
+ });
65
75
});
66
76
}
67
77
68
- return promise ;
78
+ return workerReadyPromise ;
69
79
};
70
80
71
81
/**
@@ -426,8 +436,8 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
426
436
* For internal use only.
427
437
*/
428
438
var WorkerTransport = (function WorkerTransportClosure () {
429
- function WorkerTransport (promise ) {
430
- this .workerReadyPromise = promise ;
439
+ function WorkerTransport (workerInitializedPromise , workerReadyPromise ) {
440
+ this .workerReadyPromise = workerReadyPromise ;
431
441
this .objs = new PDFObjects ();
432
442
433
443
this .pageCache = [];
@@ -471,6 +481,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
471
481
globalScope .PDFJS .disableWorker = true ;
472
482
this .setupFakeWorker ();
473
483
}
484
+ workerInitializedPromise .resolve ();
474
485
}.bind (this ));
475
486
476
487
var testObj = new Uint8Array (1 );
@@ -486,6 +497,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
486
497
// Thus, we fallback to a faked worker.
487
498
globalScope .PDFJS .disableWorker = true ;
488
499
this .setupFakeWorker ();
500
+ workerInitializedPromise .resolve ();
489
501
}
490
502
WorkerTransport .prototype = {
491
503
destroy : function WorkerTransport_destroy () {
0 commit comments