From 69c804a0f40ea1c5f3bd8a9807567afd2ce558af Mon Sep 17 00:00:00 2001
From: Yury Delendik <ydelendik@mozilla.com>
Date: Fri, 9 Jun 2017 20:07:51 -0500
Subject: [PATCH] Fixes duplicate creation of PDFWorker for the same port.

---
 src/display/api.js | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/display/api.js b/src/display/api.js
index 137e8594a..fcde21d49 100644
--- a/src/display/api.js
+++ b/src/display/api.js
@@ -264,7 +264,7 @@ function getDocument(src, pdfDataRangeTransport,
     // Worker was not provided -- creating and owning our own. If message port
     // is specified in global settings, using it.
     var workerPort = getDefaultSetting('workerPort');
-    worker = workerPort ? new PDFWorker(null, workerPort) : new PDFWorker();
+    worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker();
     task._worker = worker;
   }
   var docId = task.docId;
@@ -1160,7 +1160,7 @@ class LoopbackPort {
  * @class
  */
 var PDFWorker = (function PDFWorkerClosure() {
-  var nextFakeWorkerId = 0;
+  let nextFakeWorkerId = 0;
 
   function getWorkerSrc() {
     if (typeof workerSrc !== 'undefined') {
@@ -1177,7 +1177,7 @@ var PDFWorker = (function PDFWorkerClosure() {
     error('No PDFJS.workerSrc specified');
   }
 
-  var fakeWorkerFilesLoadedCapability;
+  let fakeWorkerFilesLoadedCapability;
 
   // Loads worker code into main thread.
   function setupFakeWorkerGlobal() {
@@ -1229,7 +1229,13 @@ var PDFWorker = (function PDFWorkerClosure() {
     return URL.createObjectURL(new Blob([wrapper]));
   }
 
+  let pdfWorkerPorts = new WeakMap();
+
   function PDFWorker(name, port) {
+    if (pdfWorkerPorts.has(port)) {
+      throw new Error('Cannot use more than one PDFWorker per port');
+    }
+
     this.name = name;
     this.destroyed = false;
 
@@ -1239,6 +1245,7 @@ var PDFWorker = (function PDFWorkerClosure() {
     this._messageHandler = null;
 
     if (port) {
+      pdfWorkerPorts.set(port, this);
       this._initializeFromPort(port);
       return;
     }
@@ -1444,6 +1451,13 @@ var PDFWorker = (function PDFWorkerClosure() {
     },
   };
 
+  PDFWorker.fromPort = function (port) {
+    if (pdfWorkerPorts.has(port)) {
+      return pdfWorkerPorts.get(port);
+    }
+    return new PDFWorker(null, port);
+  };
+
   return PDFWorker;
 })();