[Pkg-javascript-commits] [pdf.js] 51/115: Adds peer communication between MessageHandlers.

David Prévot taffit at moszumanska.debian.org
Wed Dec 16 20:03:14 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit acdd49f48097ffcb27332673a8b51cd653f6de88
Author: Yury Delendik <ydelendik at mozilla.com>
Date:   Tue Oct 27 10:07:20 2015 -0500

    Adds peer communication between MessageHandlers.
---
 src/core/worker.js | 81 ++++++++++++++++++++++++++++++++----------------------
 src/display/api.js | 68 ++++++++++++++++++++++++++++++++++++++-------
 src/shared/util.js | 37 +++++++++++++++----------
 3 files changed, 129 insertions(+), 57 deletions(-)

diff --git a/src/core/worker.js b/src/core/worker.js
index 1e80d5a..82a4946 100644
--- a/src/core/worker.js
+++ b/src/core/worker.js
@@ -51,12 +51,49 @@ var WorkerTask = (function WorkerTaskClosure() {
 })();
 
 var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
-  setup: function wphSetup(handler) {
+  setup: function wphSetup(handler, port) {
+    handler.on('test', function wphSetupTest(data) {
+      // check if Uint8Array can be sent to worker
+      if (!(data instanceof Uint8Array)) {
+        handler.send('test', 'main', false);
+        return;
+      }
+      // making sure postMessage transfers are working
+      var supportTransfers = data[0] === 255;
+      handler.postMessageTransfers = supportTransfers;
+      // check if the response property is supported by xhr
+      var xhr = new XMLHttpRequest();
+      var responseExists = 'response' in xhr;
+      // check if the property is actually implemented
+      try {
+        var dummy = xhr.responseType;
+      } catch (e) {
+        responseExists = false;
+      }
+      if (!responseExists) {
+        handler.send('test', false);
+        return;
+      }
+      handler.send('test', {
+        supportTypedArray: true,
+        supportTransfers: supportTransfers
+      });
+    });
+
+    handler.on('GetDocRequest', function wphSetupDoc(data) {
+      return WorkerMessageHandler.createDocumentHandler(data, port);
+    });
+  },
+  createDocumentHandler: function wphCreateDocumentHandler(data, port) {
     var pdfManager;
     var terminated = false;
     var cancelXHRs = null;
     var WorkerTasks = [];
 
+    var mainHandlerName = data.docId;
+    var workerHandlerName = data.docId + '_worker';
+    var handler = new MessageHandler(workerHandlerName, mainHandlerName, port);
+
     function ensureNotTerminated() {
       if (terminated) {
         throw new Error('Worker was terminated');
@@ -262,35 +299,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
       return pdfManagerCapability.promise;
     }
 
-    handler.on('test', function wphSetupTest(data) {
-      // check if Uint8Array can be sent to worker
-      if (!(data instanceof Uint8Array)) {
-        handler.send('test', false);
-        return;
-      }
-      // making sure postMessage transfers are working
-      var supportTransfers = data[0] === 255;
-      handler.postMessageTransfers = supportTransfers;
-      // check if the response property is supported by xhr
-      var xhr = new XMLHttpRequest();
-      var responseExists = 'response' in xhr;
-      // check if the property is actually implemented
-      try {
-        var dummy = xhr.responseType;
-      } catch (e) {
-        responseExists = false;
-      }
-      if (!responseExists) {
-        handler.send('test', false);
-        return;
-      }
-      handler.send('test', {
-        supportTypedArray: true,
-        supportTransfers: supportTransfers
-      });
-    });
-
-    handler.on('GetDocRequest', function wphSetupDoc(data) {
+    var setupDoc = function(data) {
       var onSuccess = function(doc) {
         ensureNotTerminated();
         handler.send('GetDoc', { pdfInfo: doc });
@@ -366,7 +375,7 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
           });
         }, onFailure);
       }, onFailure);
-    });
+    };
 
     handler.on('GetPage', function wphSetupGetPage(data) {
       return pdfManager.getPage(data.pageIndex).then(function(page) {
@@ -548,6 +557,9 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
 
       return Promise.all(waitOn).then(function () {});
     });
+
+    setupDoc(data);
+    return workerHandlerName;
   }
 };
 
@@ -557,6 +569,7 @@ var workerConsole = {
   log: function log() {
     var args = Array.prototype.slice.call(arguments);
     globalScope.postMessage({
+      targetName: 'main',
       action: 'console_log',
       data: args
     });
@@ -565,6 +578,7 @@ var workerConsole = {
   error: function error() {
     var args = Array.prototype.slice.call(arguments);
     globalScope.postMessage({
+      targetName: 'main',
       action: 'console_error',
       data: args
     });
@@ -594,11 +608,12 @@ if (typeof window === 'undefined') {
   // Listen for unsupported features so we can pass them on to the main thread.
   PDFJS.UnsupportedManager.listen(function (msg) {
     globalScope.postMessage({
+      targetName: 'main',
       action: '_unsupported_feature',
       data: msg
     });
   });
 
-  var handler = new MessageHandler('worker_processor', this);
-  WorkerMessageHandler.setup(handler);
+  var handler = new MessageHandler('worker', 'main', this);
+  WorkerMessageHandler.setup(handler, this);
 }
diff --git a/src/display/api.js b/src/display/api.js
index c9034fb..7e65ba6 100644
--- a/src/display/api.js
+++ b/src/display/api.js
@@ -17,7 +17,7 @@
            Promise, PasswordResponses, PasswordException, InvalidPDFException,
            MissingPDFException, UnknownErrorException, FontFaceObject,
            loadJpegStream, createScratchCanvas, CanvasGraphics, stringToBytes,
-           UnexpectedResponseException, deprecated */
+           UnexpectedResponseException, deprecated, UnsupportedManager */
 
 'use strict';
 
@@ -354,6 +354,12 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
     this._transport = null;
 
     /**
+     * Shows if loading task is destroyed.
+     * @type {boolean}
+     */
+    this.destroyed = false;
+
+    /**
      * Callback to request a password if wrong or no password was provided.
      * The callback receives two parameters: function that needs to be called
      * with new password and reason (see {PasswordResponses}).
@@ -383,6 +389,10 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
      *                   is completed.
      */
     destroy: function () {
+      this.destroyed = true;
+      if (!this._transport) {
+        return Promise.resolve();
+      }
       return this._transport.destroy();
     },
 
@@ -1042,8 +1052,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
         // Some versions of FF can't create a worker on localhost, see:
         // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
         var worker = new Worker(workerSrc);
-        var messageHandler = new MessageHandler('main', worker);
-        this.messageHandler = messageHandler;
+        var messageHandler = new MessageHandler('main', 'worker', worker);
 
         messageHandler.on('test', function transportTest(data) {
           var supportTypedArray = data && data.supportTypedArray;
@@ -1052,13 +1061,23 @@ var WorkerTransport = (function WorkerTransportClosure() {
             if (!data.supportTransfers) {
               PDFJS.postMessageTransfers = false;
             }
-            this.setupMessageHandler(messageHandler);
+            this.setupMainMessageHandler(messageHandler, worker);
             workerInitializedCapability.resolve();
           } else {
             this.setupFakeWorker();
           }
         }.bind(this));
 
+        messageHandler.on('console_log', function (data) {
+          console.log.apply(console, data);
+        });
+        messageHandler.on('console_error', function (data) {
+          console.error.apply(console, data);
+        });
+        messageHandler.on('_unsupported_feature', function (data) {
+          UnsupportedManager.notify(data);
+        });
+
         var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);
         // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
         // typed array. Also, checking if we can use transfers.
@@ -1141,23 +1160,41 @@ var WorkerTransport = (function WorkerTransportClosure() {
         warn('Setting up fake worker.');
         // If we don't use a worker, just post/sendMessage to the main thread.
         var fakeWorker = {
+          _listeners: [],
           postMessage: function WorkerTransport_postMessage(obj) {
-            fakeWorker.onmessage({data: obj});
+            var e = {data: obj};
+            this._listeners.forEach(function (listener) {
+              listener.call(this, e);
+            }, this);
+          },
+          addEventListener: function (name, listener) {
+            this._listeners.push(listener);
+          },
+          removeEventListener: function (name, listener) {
+            var i = this._listeners.indexOf(listener);
+            this._listeners.splice(i, 1);
           },
           terminate: function WorkerTransport_terminate() {}
         };
 
-        var messageHandler = new MessageHandler('main', fakeWorker);
-        this.setupMessageHandler(messageHandler);
+        var messageHandler = new MessageHandler('main', 'worker', fakeWorker);
+        this.setupMainMessageHandler(messageHandler, fakeWorker);
 
         // If the main thread is our worker, setup the handling for the messages
         // the main thread sends to it self.
-        PDFJS.WorkerMessageHandler.setup(messageHandler);
+        var workerHandler = new MessageHandler('worker', 'main', fakeWorker);
+        PDFJS.WorkerMessageHandler.setup(workerHandler, fakeWorker);
 
         this.workerInitializedCapability.resolve();
       }.bind(this));
     },
 
+    setupMainMessageHandler:
+        function WorkerTransport_setupMainMessageHandler(messageHandler, port) {
+      this.mainMessageHandler = messageHandler;
+      this.port = port;
+    },
+
     setupMessageHandler:
       function WorkerTransport_setupMessageHandler(messageHandler) {
       this.messageHandler = messageHandler;
@@ -1441,7 +1478,9 @@ var WorkerTransport = (function WorkerTransportClosure() {
         source.length = this.pdfDataRangeTransport.length;
         source.initialData = this.pdfDataRangeTransport.initialData;
       }
-      this.messageHandler.send('GetDocRequest', {
+      var docId = 'doc';
+      this.mainMessageHandler.sendWithPromise('GetDocRequest', {
+        docId: docId,
         source: source,
         disableRange: PDFJS.disableRange,
         maxImageSize: PDFJS.maxImageSize,
@@ -1450,7 +1489,16 @@ var WorkerTransport = (function WorkerTransportClosure() {
         disableFontFace: PDFJS.disableFontFace,
         disableCreateObjectURL: PDFJS.disableCreateObjectURL,
         verbosity: PDFJS.verbosity
-      });
+      }).then(function (workerId) {
+        if (this.destroyed) {
+          loadingTask._capability.reject(new Error('Loading aborted'));
+          this.destroyCapability.resolve();
+          return;
+        }
+
+        var messageHandler = new MessageHandler(docId, workerId, this.port);
+        this.setupMessageHandler(messageHandler);
+      }.bind(this), loadingTask._capability.reject);
     },
 
     getData: function WorkerTransport_getData() {
diff --git a/src/shared/util.js b/src/shared/util.js
index 6845a5f..299baf2 100644
--- a/src/shared/util.js
+++ b/src/shared/util.js
@@ -1518,26 +1518,20 @@ PDFJS.createObjectURL = (function createObjectURLClosure() {
   };
 })();
 
-function MessageHandler(name, comObj) {
-  this.name = name;
+function MessageHandler(sourceName, targetName, comObj) {
+  this.sourceName = sourceName;
+  this.targetName = targetName;
   this.comObj = comObj;
   this.callbackIndex = 1;
   this.postMessageTransfers = true;
   var callbacksCapabilities = this.callbacksCapabilities = {};
   var ah = this.actionHandler = {};
 
-  ah['console_log'] = [function ahConsoleLog(data) {
-    console.log.apply(console, data);
-  }];
-  ah['console_error'] = [function ahConsoleError(data) {
-    console.error.apply(console, data);
-  }];
-  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
-    UnsupportedManager.notify(data);
-  }];
-
-  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+  this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) {
     var data = event.data;
+    if (data.targetName !== this.sourceName) {
+      return;
+    }
     if (data.isReply) {
       var callbackId = data.callbackId;
       if (data.callbackId in callbacksCapabilities) {
@@ -1554,10 +1548,14 @@ function MessageHandler(name, comObj) {
     } else if (data.action in ah) {
       var action = ah[data.action];
       if (data.callbackId) {
+        var sourceName = this.sourceName;
+        var targetName = data.sourceName;
         Promise.resolve().then(function () {
           return action[0].call(action[1], data.data);
         }).then(function (result) {
           comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
             isReply: true,
             callbackId: data.callbackId,
             data: result
@@ -1568,6 +1566,8 @@ function MessageHandler(name, comObj) {
             reason = reason + '';
           }
           comObj.postMessage({
+            sourceName: sourceName,
+            targetName: targetName,
             isReply: true,
             callbackId: data.callbackId,
             error: reason
@@ -1579,7 +1579,8 @@ function MessageHandler(name, comObj) {
     } else {
       error('Unknown action from worker: ' + data.action);
     }
-  };
+  }.bind(this);
+  comObj.addEventListener('message', this._onComObjOnMessage);
 }
 
 MessageHandler.prototype = {
@@ -1598,6 +1599,8 @@ MessageHandler.prototype = {
    */
   send: function messageHandlerSend(actionName, data, transfers) {
     var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
       action: actionName,
       data: data
     };
@@ -1615,6 +1618,8 @@ MessageHandler.prototype = {
     function messageHandlerSendWithPromise(actionName, data, transfers) {
     var callbackId = this.callbackIndex++;
     var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
       action: actionName,
       data: data,
       callbackId: callbackId
@@ -1640,6 +1645,10 @@ MessageHandler.prototype = {
     } else {
       this.comObj.postMessage(message);
     }
+  },
+
+  destroy: function () {
+    this.comObj.removeEventListener('message', this._onComObjOnMessage);
   }
 };
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list