From 1e6d1f99221ff180ee8947dbb198f2119418b17d Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Fri, 28 Oct 2011 14:32:36 +0200
Subject: [PATCH 01/39] Make worker support work again after file split. Add
 PDFJS_WORKER_DIR/PDFJS_WORKER_FILE to specify where to load files if worker
 support is enabled

---
 examples/helloworld/hello.js   |  2 +-
 examples/helloworld/index.html | 43 +++++++++++++++------------
 src/core.js                    | 21 ++++++++++++-
 src/pdf.js                     |  1 -
 src/worker.js                  |  5 ++--
 src/worker_loader.js           | 54 ++++++++++++++++++++++------------
 web/viewer-snippet.html        |  5 ++++
 web/viewer.html                |  6 ++--
 8 files changed, 91 insertions(+), 46 deletions(-)

diff --git a/examples/helloworld/hello.js b/examples/helloworld/hello.js
index 45e61eb6f..c97b53c66 100644
--- a/examples/helloworld/hello.js
+++ b/examples/helloworld/hello.js
@@ -7,7 +7,7 @@
 
 'use strict';
 
-PDFJS.getPdf('helloworld.pdf', function getPdfHelloWorld(data) {
+getPdf('helloworld.pdf', function getPdfHelloWorld(data) {
   //
   // Instantiate PDFDoc with PDF data
   //
diff --git a/examples/helloworld/index.html b/examples/helloworld/index.html
index b10e9eaeb..0fa711fe4 100644
--- a/examples/helloworld/index.html
+++ b/examples/helloworld/index.html
@@ -3,27 +3,32 @@
 
 <head>
   <!-- In production, only one script (pdf.js) is necessary -->
-  <script type="text/javascript" src="../../src/core.js"></script> 
-  <script type="text/javascript" src="../../src/util.js"></script>  
-  <script type="text/javascript" src="../../src/canvas.js"></script>  
-  <script type="text/javascript" src="../../src/obj.js"></script>  
-  <script type="text/javascript" src="../../src/function.js"></script> 
-  <script type="text/javascript" src="../../src/charsets.js"></script>  
-  <script type="text/javascript" src="../../src/cidmaps.js"></script>  
-  <script type="text/javascript" src="../../src/colorspace.js"></script>  
-  <script type="text/javascript" src="../../src/crypto.js"></script>  
-  <script type="text/javascript" src="../../src/evaluator.js"></script>  
-  <script type="text/javascript" src="../../src/fonts.js"></script>  
-  <script type="text/javascript" src="../../src/glyphlist.js"></script>  
-  <script type="text/javascript" src="../../src/image.js"></script>  
-  <script type="text/javascript" src="../../src/metrics.js"></script>  
-  <script type="text/javascript" src="../../src/parser.js"></script>  
-  <script type="text/javascript" src="../../src/pattern.js"></script>  
-  <script type="text/javascript" src="../../src/stream.js"></script>  
-  <script type="text/javascript" src="../../src/worker.js"></script>  
+  <script type="text/javascript" src="../../src/core.js"></script>
+  <script type="text/javascript" src="../../src/util.js"></script>
+  <script type="text/javascript" src="../../src/canvas.js"></script>
+  <script type="text/javascript" src="../../src/obj.js"></script>
+  <script type="text/javascript" src="../../src/function.js"></script>
+  <script type="text/javascript" src="../../src/charsets.js"></script>
+  <script type="text/javascript" src="../../src/cidmaps.js"></script>
+  <script type="text/javascript" src="../../src/colorspace.js"></script>
+  <script type="text/javascript" src="../../src/crypto.js"></script>
+  <script type="text/javascript" src="../../src/evaluator.js"></script>
+  <script type="text/javascript" src="../../src/fonts.js"></script>
+  <script type="text/javascript" src="../../src/glyphlist.js"></script>
+  <script type="text/javascript" src="../../src/image.js"></script>
+  <script type="text/javascript" src="../../src/metrics.js"></script>
+  <script type="text/javascript" src="../../src/parser.js"></script>
+  <script type="text/javascript" src="../../src/pattern.js"></script>
+  <script type="text/javascript" src="../../src/stream.js"></script>
+  <script type="text/javascript" src="../../src/worker.js"></script>
 
+  <script type="text/javascript">
+    // Specify the directory of the source files, such that the web worker
+    // knows where to load them.
+    var PDFJS_WORKER_DIR = '../../src/';
+  </script>
   <script type="text/javascript" src="hello.js"></script>
-</head>  
+</head>
 
 <body>
   <canvas id="the-canvas" style="border:1px solid black;"/>
diff --git a/src/core.js b/src/core.js
index e7241acfa..8d3d6d434 100644
--- a/src/core.js
+++ b/src/core.js
@@ -471,7 +471,26 @@ var PDFDoc = (function() {
     this.pageCache = [];
 
     if (useWorker) {
-      var worker = new Worker('../src/worker_loader.js');
+      var worker;
+      if (typeof PDFJS_WORKER_DIR !== 'undefined') {
+        // If `PDFJS_WORKER_DIR` is specified, we assume the pdf.js files
+        // located all in that directory. Create a new worker and tell him
+        // the directory, such that he can load the scripts from there.
+        worker = new Worker(PDFJS_WORKER_DIR + 'worker_loader.js');
+        console.log('main: post dir');
+
+        worker.postMessage(PDFJS_WORKER_DIR);
+      } else if (typeof PDFJS_WORKER_FILE !== 'undefined') {
+        // If we build the worker using a worker file, then we assume, that
+        // everything the worker needs is already included in that file.
+        // Therefore the worker doesn't have to call `importScripts` to load
+        // all the single files and therefore it's not necessary to tell the
+        // worker a directory to laod the js files from.
+        // (Which is different from the PDFJS_WORKER_DIR case above.)
+        worker = new Worker(PDFJS_WORKER_FILE);
+      } else {
+        throw 'No worker file or directory specified.';
+      }
     } else {
       // If we don't use a worker, just post/sendMessage to the main thread.
       var worker = {
diff --git a/src/pdf.js b/src/pdf.js
index 34e163967..2ecd2fddc 100644
--- a/src/pdf.js
+++ b/src/pdf.js
@@ -4,7 +4,6 @@
 var PDFJS = {};
 
 (function pdfjsWrapper() {
-
   // Use strict in our context only - users might not want it
   'use strict';
 
diff --git a/src/worker.js b/src/worker.js
index a83f31668..5545fc459 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -174,10 +174,9 @@ var workerConsole = {
 
 // Worker thread?
 if (typeof window === 'undefined') {
-  globalScope.console = workerConsole;
+  this.console = workerConsole;
 
-  // Listen for messages from the main thread.
-  var handler = new MessageHandler('worker_processor', globalScope);
+  var handler = new MessageHandler('worker_processor', this);
   WorkerProcessorHandler.setup(handler);
 }
 
diff --git a/src/worker_loader.js b/src/worker_loader.js
index fb37ca9c4..69f7d55ba 100644
--- a/src/worker_loader.js
+++ b/src/worker_loader.js
@@ -3,22 +3,40 @@
 
 'use strict';
 
-importScripts('../src/core.js');
-importScripts('../src/util.js');
-importScripts('../src/canvas.js');
-importScripts('../src/obj.js');
-importScripts('../src/function.js');
-importScripts('../src/charsets.js');
-importScripts('../src/cidmaps.js');
-importScripts('../src/colorspace.js');
-importScripts('../src/crypto.js');
-importScripts('../src/evaluator.js');
-importScripts('../src/fonts.js');
-importScripts('../src/glyphlist.js');
-importScripts('../src/image.js');
-importScripts('../src/metrics.js');
-importScripts('../src/parser.js');
-importScripts('../src/pattern.js');
-importScripts('../src/stream.js');
-importScripts('../src/worker.js');
+this.onmessage = function(evt) {
+  // Reset the `onmessage` function as it was only set to call
+  // this function the first time a message is passed to the worker
+  // but shouldn't get called anytime afterwards.
+  delete this.onmessage;
 
+  // Directory the include files are contained is send as the
+  // first message to the worker.
+  var dir = evt.data;
+
+  // List of files to include;
+  var files = [
+    'core.js',
+    'util.js',
+    'canvas.js',
+    'obj.js',
+    'function.js',
+    'charsets.js',
+    'cidmaps.js',
+    'colorspace.js',
+    'crypto.js',
+    'evaluator.js',
+    'fonts.js',
+    'glyphlist.js',
+    'image.js',
+    'metrics.js',
+    'parser.js',
+    'pattern.js',
+    'stream.js',
+    'worker.js'
+  ];
+
+  // Load all the files.
+  for (var i = 0; i < files.length; i++) {
+    importScripts(dir + files[i]);
+  }
+}.bind(this);
diff --git a/web/viewer-snippet.html b/web/viewer-snippet.html
index c99897a44..4d2a4f7b7 100644
--- a/web/viewer-snippet.html
+++ b/web/viewer-snippet.html
@@ -1,2 +1,7 @@
 <!-- This snippet is used in production, see Makefile -->
 <script type="text/javascript" src="../build/pdf.js"></script>
+<script type="text/javascript">
+  // This specifies the location of the pdf.js file. This is necessary to
+  // spawn the web worker.
+  var PDFJS_WORKER_FILE = "../build/pdf.js";
+</script>
diff --git a/web/viewer.html b/web/viewer.html
index f7a5378ed..4505331d6 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -3,9 +3,9 @@
     <head>
         <title>Simple pdf.js page viewer</title>
         <link rel="stylesheet" href="viewer.css"/>
-        
+
         <!-- PDFJSSCRIPT_INCLUDE_BUILD -->
-        
+        <script type="text/javascript">var PDFJS_WORKER_DIR = "../src/"</script> <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/util.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/canvas.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
@@ -114,7 +114,7 @@
         </div>
      </div>
     </div>
-    
+
     <div id="loading">Loading... 0%</div>
     <div id="viewer"></div>
   </body>

From 5cb64fbab7f20a53b48582be5a582f6df8e5f747 Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Fri, 28 Oct 2011 14:10:10 -0700
Subject: [PATCH 02/39] Initial alpha transparency support.

---
 src/canvas.js            |  54 ++++++++++++++++++---------------------
 src/evaluator.js         |   4 +--
 test/pdfs/alphatrans.pdf | Bin 0 -> 16910 bytes
 3 files changed, 27 insertions(+), 31 deletions(-)
 create mode 100644 test/pdfs/alphatrans.pdf

diff --git a/src/canvas.js b/src/canvas.js
index 70dd65e3d..3c7551404 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -28,6 +28,9 @@ var CanvasExtraState = (function canvasExtraState() {
     // Default fore and background colors
     this.fillColor = '#000000';
     this.strokeColor = '#000000';
+    // Note: fill alpha applies to all non-stroking operations
+    this.fillAlpha = 1;
+    this.strokeAlpha = 1;
 
     this.old = old;
   }
@@ -206,6 +209,13 @@ var CanvasGraphics = (function canvasGraphics() {
           case 'Font':
             this.setFont(state[1], state[2]);
             break;
+          case 'CA':
+            this.current.strokeAlpha = state[1];
+            break;
+          case 'ca':
+            this.current.fillAlpha = state[1];
+            this.ctx.globalAlpha = state[1];
+            break;
         }
       }
     },
@@ -254,9 +264,13 @@ var CanvasGraphics = (function canvasGraphics() {
     rectangle: function canvasGraphicsRectangle(x, y, width, height) {
       this.ctx.rect(x, y, width, height);
     },
-    stroke: function canvasGraphicsStroke() {
+    stroke: function canvasGraphicsStroke(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
       var ctx = this.ctx;
       var strokeColor = this.current.strokeColor;
+      // For stroke we want to temporarily change the global alpha to the
+      // stroking alpha.
+      ctx.globalAlpha = this.current.strokeAlpha;
       if (strokeColor && strokeColor.hasOwnProperty('type') &&
           strokeColor.type === 'Pattern') {
         // for patterns, we transform to pattern space, calculate
@@ -268,14 +282,17 @@ var CanvasGraphics = (function canvasGraphics() {
       } else {
         ctx.stroke();
       }
-
-      this.consumePath();
+      if (consumePath)
+        this.consumePath();
+      // Restore the global alpha to the fill alpha
+      ctx.globalAlpha = this.current.fillAlpha;
     },
     closeStroke: function canvasGraphicsCloseStroke() {
       this.closePath();
       this.stroke();
     },
-    fill: function canvasGraphicsFill() {
+    fill: function canvasGraphicsFill(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
       var ctx = this.ctx;
       var fillColor = this.current.fillColor;
 
@@ -288,8 +305,8 @@ var CanvasGraphics = (function canvasGraphics() {
       } else {
         ctx.fill();
       }
-
-      this.consumePath();
+      if (consumePath)
+        this.consumePath();
     },
     eoFill: function canvasGraphicsEoFill() {
       var savedFillRule = this.setEOFillRule();
@@ -297,29 +314,8 @@ var CanvasGraphics = (function canvasGraphics() {
       this.restoreFillRule(savedFillRule);
     },
     fillStroke: function canvasGraphicsFillStroke() {
-      var ctx = this.ctx;
-
-      var fillColor = this.current.fillColor;
-      if (fillColor && fillColor.hasOwnProperty('type') &&
-          fillColor.type === 'Pattern') {
-        ctx.save();
-        ctx.fillStyle = fillColor.getPattern(ctx);
-        ctx.fill();
-        ctx.restore();
-      } else {
-        ctx.fill();
-      }
-
-      var strokeColor = this.current.strokeColor;
-      if (strokeColor && strokeColor.hasOwnProperty('type') &&
-          strokeColor.type === 'Pattern') {
-        ctx.save();
-        ctx.strokeStyle = strokeColor.getPattern(ctx);
-        ctx.stroke();
-        ctx.restore();
-      } else {
-        ctx.stroke();
-      }
+      this.fill(false);
+      this.stroke(false);
 
       this.consumePath();
     },
diff --git a/src/evaluator.js b/src/evaluator.js
index 5007394b4..ea152717a 100644
--- a/src/evaluator.js
+++ b/src/evaluator.js
@@ -405,6 +405,8 @@ var PartialEvaluator = (function partialEvaluator() {
                     case 'D':
                     case 'RI':
                     case 'FL':
+                    case 'CA':
+                    case 'ca':
                       gsStateObj.push([key, value]);
                       break;
                     case 'Font':
@@ -428,8 +430,6 @@ var PartialEvaluator = (function partialEvaluator() {
                     case 'SA':
                     case 'BM':
                     case 'SMask':
-                    case 'CA':
-                    case 'ca':
                     case 'AIS':
                     case 'TK':
                       TODO('graphic state operator ' + key);
diff --git a/test/pdfs/alphatrans.pdf b/test/pdfs/alphatrans.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..6274ce3ac67ad08df9f2097455db2679230086f9
GIT binary patch
literal 16910
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
bkWh2)z;Z?;Q)eBfB(DNv6&2ODG+_Nd7c+O^

literal 0
HcmV?d00001


From 11b843325b6e3412e67bdd98f884cf8567744f0a Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Fri, 28 Oct 2011 14:11:14 -0700
Subject: [PATCH 03/39] Add the alpha trans test pdf.

---
 test/pdfs/.gitignore    | 1 +
 test/test_manifest.json | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore
index e7eb0da43..09618a7e6 100644
--- a/test/pdfs/.gitignore
+++ b/test/pdfs/.gitignore
@@ -12,4 +12,5 @@
 !rotation.pdf
 !simpletype3font.pdf
 !sizes.pdf
+!alphatrans.pdf
 
diff --git a/test/test_manifest.json b/test/test_manifest.json
index d7ac34cef..1d51c935f 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -217,5 +217,11 @@
        "link": false,
        "rounds": 1,
        "type": "eq"
+    },
+    {  "id": "alphatrans",
+       "file": "pdfs/alphatrans.pdf",
+       "link": false,
+       "rounds": 1,
+       "type": "eq"
     }
 ]

From 0331847927a26449555843339a9c7060941563d8 Mon Sep 17 00:00:00 2001
From: Vivien Nicolas <21@vingtetun.org>
Date: Mon, 31 Oct 2011 13:18:30 +0100
Subject: [PATCH 04/39] Add support for disabling the firefox extension on the
 fly

---
 extensions/firefox/bootstrap.js                | 18 ++++++++++++++----
 .../firefox/components/pdfContentHandler.js    |  3 +++
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/extensions/firefox/bootstrap.js b/extensions/firefox/bootstrap.js
index 5384a05df..e51df28f8 100644
--- a/extensions/firefox/bootstrap.js
+++ b/extensions/firefox/bootstrap.js
@@ -16,21 +16,31 @@ function log(str) {
 
 function startup(aData, aReason) {
   let manifestPath = 'chrome.manifest';
-  let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
+  let manifest = Cc['@mozilla.org/file/local;1']
+                   .createInstance(Ci.nsILocalFile);
   try {
-    file.initWithPath(aData.installPath.path);
-    file.append(manifestPath);
-    Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);
+    manifest.initWithPath(aData.installPath.path);
+    manifest.append(manifestPath);
+    Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(manifest);
+    Services.prefs.setBoolPref('extensions.pdf.js.active', true);
   } catch (e) {
     log(e);
   }
 }
 
 function shutdown(aData, aReason) {
+  if (Services.prefs.getBoolPref('extensions.pdf.js.active'))
+    Services.prefs.setBoolPref('extensions.pdf.js.active', false);
 }
 
 function install(aData, aReason) {
   let url = 'chrome://pdf.js/content/web/viewer.html?file=%s';
   Services.prefs.setCharPref('extensions.pdf.js.url', url);
+  Services.prefs.setBoolPref('extensions.pdf.js.active', false);
+}
+
+function uninstall(aData, aReason) {
+  Services.prefs.clearUserPref('extensions.pdf.js.url');
+  Services.prefs.clearUserPref('extensions.pdf.js.active');
 }
 
diff --git a/extensions/firefox/components/pdfContentHandler.js b/extensions/firefox/components/pdfContentHandler.js
index 7746e41b6..a23461085 100644
--- a/extensions/firefox/components/pdfContentHandler.js
+++ b/extensions/firefox/components/pdfContentHandler.js
@@ -32,6 +32,9 @@ pdfContentHandler.prototype = {
     if (!(aRequest instanceof Ci.nsIChannel))
       throw NS_ERROR_WONT_HANDLE_CONTENT;
 
+    if (!Services.prefs.getBoolPref('extensions.pdf.js.active'))
+      throw NS_ERROR_WONT_HANDLE_CONTENT;
+
     let window = null;
     let callbacks = aRequest.notificationCallbacks ||
                     aRequest.loadGroup.notificationCallbacks;

From 0d02ab5098f3b3ae92ea710d27a43b2ad2132605 Mon Sep 17 00:00:00 2001
From: gigaherz <gigaherz@gmail.com>
Date: Mon, 31 Oct 2011 20:44:29 +0100
Subject: [PATCH 05/39] The extension should urlencode the pdf when sending it
 over to the viewer.

---
 extensions/firefox/components/pdfContentHandler.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/extensions/firefox/components/pdfContentHandler.js b/extensions/firefox/components/pdfContentHandler.js
index a23461085..5f659bd9c 100644
--- a/extensions/firefox/components/pdfContentHandler.js
+++ b/extensions/firefox/components/pdfContentHandler.js
@@ -56,7 +56,8 @@ pdfContentHandler.prototype = {
       throw NS_ERROR_WONT_HANDLE_CONTENT;
 
     aRequest.cancel(Cr.NS_BINDING_ABORTED);
-    window.location = url.replace('%s', targetUrl);
+    aRequest.cancel(Cr.NS_BINDING_ABORTED);
+    window.location = url.replace('%s', encodeURIComponent(targetUrl));
   },
 
   classID: Components.ID('{2278dfd0-b75c-11e0-8257-1ba3d93c9f1a}'),

From 2d8b0f767752f70568d35afa30c4f3d1b0205030 Mon Sep 17 00:00:00 2001
From: gigaherz <gigaherz@gmail.com>
Date: Mon, 31 Oct 2011 21:18:41 +0100
Subject: [PATCH 06/39] Properly fix the previous commit.

---
 extensions/firefox/components/pdfContentHandler.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/extensions/firefox/components/pdfContentHandler.js b/extensions/firefox/components/pdfContentHandler.js
index 5f659bd9c..444db1c1f 100644
--- a/extensions/firefox/components/pdfContentHandler.js
+++ b/extensions/firefox/components/pdfContentHandler.js
@@ -55,7 +55,6 @@ pdfContentHandler.prototype = {
     if (targetUrl.indexOf('?pdfjs.action=download') >= 0)
       throw NS_ERROR_WONT_HANDLE_CONTENT;
 
-    aRequest.cancel(Cr.NS_BINDING_ABORTED);
     aRequest.cancel(Cr.NS_BINDING_ABORTED);
     window.location = url.replace('%s', encodeURIComponent(targetUrl));
   },

From 46c0f6c23ec6b117a7272100d8e11bc8f57fa7b2 Mon Sep 17 00:00:00 2001
From: Alex Cornejo <acornejo@gmail.com>
Date: Mon, 31 Oct 2011 18:23:03 -0400
Subject: [PATCH 07/39] Slimmed down toolbar height, from 40 to 24px.

This matches the height of the regular Firefox toolbars, 40px takes too
much screenspace, and (in my opinion) unecessarily so, since the fonts
are not even larger.
---
 web/viewer.css  | 17 +++++++++--------
 web/viewer.html | 20 ++++++++++----------
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/web/viewer.css b/web/viewer.css
index 27ad0638a..c379e91c4 100644
--- a/web/viewer.css
+++ b/web/viewer.css
@@ -18,11 +18,11 @@ body {
   background: -moz-linear-gradient(center bottom, #eee 0%, #fff 100%);
   background: -webkit-gradient(linear, left bottom, left top, color-stop(0.0, #ddd), color-stop(1.0, #fff));
   border-bottom: 1px solid #666;
-  padding: 4px;
+  padding: 3px;
   position: fixed;
   left: 0px;
   top: 0px;
-  height: 40px;
+  height: 24px;
   width: 100%;
   z-index: 1;
   white-space:nowrap;
@@ -33,22 +33,23 @@ body {
   display: inline;
   border-left: 1px solid #d3d3d3;
   border-right: 1px solid #fff;
-  height: 32px;
+  height: 16px;
   width:0px;
   margin: 4px;
 }
 
 #controls > a > img {
-  margin: 2px;
+    margin: 4px;
+    height: 16px;
 }
 
 #controls > button {
-  line-height: 32px;
+  line-height: 16px;
 }
 
 #controls > button > img {
-  width: 32px;
-  height: 32px;
+  width: 16px;
+  height: 16px;
 }
 
 #controls > button[disabled] > img {
@@ -60,7 +61,7 @@ body {
 }
 
 #fileInput {
-  line-height: 32px;
+  line-height: 16px;
 }
 
 span#info {
diff --git a/web/viewer.html b/web/viewer.html
index 0c6ab385e..f329d3438 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -32,12 +32,12 @@
   <body>
     <div id="controls">
       <button id="previous" onclick="PDFView.page--;" oncontextmenu="return false;">
-        <img src="images/go-up.svg" align="top" height="32"/>
+        <img src="images/go-up.svg" align="top" height="16"/>
         Previous
       </button>
 
       <button id="next" onclick="PDFView.page++;" oncontextmenu="return false;">
-        <img src="images/go-down.svg" align="top" height="32"/>
+        <img src="images/go-down.svg" align="top" height="16"/>
         Next
       </button>
 
@@ -51,10 +51,10 @@
       <div class="separator"></div>
 
       <button id="zoomOut" title="Zoom Out" onclick="PDFView.zoomOut();" oncontextmenu="return false;">
-        <img src="images/zoom-out.svg" align="top" height="32"/>
+        <img src="images/zoom-out.svg" align="top" height="16"/>
       </button>
       <button id="zoomIn" title="Zoom In" onclick="PDFView.zoomIn();" oncontextmenu="return false;">
-        <img src="images/zoom-in.svg" align="top" height="32"/>
+        <img src="images/zoom-in.svg" align="top" height="16"/>
       </button>
 
       <div class="separator"></div>
@@ -74,12 +74,12 @@
       <div class="separator"></div>
 
       <button id="print" onclick="window.print();" oncontextmenu="return false;">
-        <img src="images/document-print.svg" align="top" height="32"/>
+        <img src="images/document-print.svg" align="top" height="16"/>
         Print
       </button>
 
       <button id="download" title="Download" onclick="PDFView.download();" oncontextmenu="return false;">
-        <img src="images/download.svg" align="top" height="32"/>
+        <img src="images/download.svg" align="top" height="16"/>
         Download
       </button>
 
@@ -89,8 +89,8 @@
 
       <div class="separator"></div>
 
-      <a href="#" id="viewBookmark" title="Current View (bookmark or copy the location)">
-        <img src="images/bookmark.svg" alt="Bookmark" align="top" height="32"/>
+      <a href="#" id="viewBookmark" title="Bookmark (or copy) current location">
+        <img src="images/bookmark.svg" alt="Bookmark" align="top" height="16"/>
       </a>
 
       <span id="info">--</span>
@@ -106,10 +106,10 @@
         </div>
         <div id="sidebarControls">
           <button id="thumbsSwitch" title="Show Thumbnails" onclick="PDFView.switchSidebarView('thumbs')" data-selected>
-            <img src="images/nav-thumbs.svg" align="top" height="32" alt="Thumbs" />
+            <img src="images/nav-thumbs.svg" align="top" height="16" alt="Thumbs" />
           </button>
           <button id="outlineSwitch" title="Show Document Outline" onclick="PDFView.switchSidebarView('outline')" disabled>
-            <img src="images/nav-outline.svg" align="top" height="32" alt="Document Outline" />
+            <img src="images/nav-outline.svg" align="top" height="16" alt="Document Outline" />
           </button>
         </div>
      </div>

From 1f80b0b26692617a72eae44fcd42f007dd964fa8 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Tue, 1 Nov 2011 08:46:39 -0400
Subject: [PATCH 08/39] Replace andreasgal/pdf.js --> mozilla/pdf.js

---
 Makefile                       |  2 +-
 README.md                      | 10 +++++-----
 extensions/firefox/install.rdf |  2 +-
 web/index.html.template        | 18 +++++++++---------
 4 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/Makefile b/Makefile
index 80003bdf6..3484ab414 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-REPO = git@github.com:andreasgal/pdf.js.git
+REPO = git@github.com:mozilla/pdf.js.git
 BUILD_DIR := build
 BUILD_TARGET := $(BUILD_DIR)/pdf.js
 DEFAULT_BROWSERS := resources/browser_manifests/browser_manifest.json
diff --git a/README.md b/README.md
index 42669da28..d6d2d886d 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ However, note that the extension might not reflect the latest source in our mast
 
 To get a local copy of the current code, clone it using git:
 
-    $ git clone git://github.com/andreasgal/pdf.js.git pdfjs
+    $ git clone git://github.com/mozilla/pdf.js.git pdfjs
     $ cd pdfjs
 
 Next, you need to start a local web server as some browsers don't allow opening
@@ -73,7 +73,7 @@ Additional resources are available in a separate section below.
 
 For a "hello world" example, take a look at:
 
-+ [examples/helloworld/hello.js](https://github.com/andreasgal/pdf.js/blob/master/examples/helloworld/hello.js)
++ [examples/helloworld/hello.js](https://github.com/mozilla/pdf.js/blob/master/examples/helloworld/hello.js)
 
 This example illustrates the bare minimum ingredients for integrating pdf.js
 in a custom project.
@@ -92,10 +92,10 @@ workings of PDF and pdf.js:
 
 pdf.js is a community-driven project, so contributors are always welcome. 
 Simply fork our repo and contribute away. A great place to start is our
-[open issues](https://github.com/andreasgal/pdf.js/issues). For better consistency and 
+[open issues](https://github.com/mozilla/pdf.js/issues). For better consistency and 
 long-term stability, please do look around the code and try to follow our conventions.
 More information about the contributor process can be found on the 
-[contributor wiki page](https://github.com/andreasgal/pdf.js/wiki/Contributing).
+[contributor wiki page](https://github.com/mozilla/pdf.js/wiki/Contributing).
 
 If you don't want to hack on the project or have little spare time, __you still
 can help!__ Just open PDFs in the 
@@ -104,7 +104,7 @@ any breakage in rendering.
 
 Our Github contributors so far:
 
-+ https://github.com/andreasgal/pdf.js/contributors
++ https://github.com/mozilla/pdf.js/contributors
 
 You can add your name to it! :)
 
diff --git a/extensions/firefox/install.rdf b/extensions/firefox/install.rdf
index 0dfd6bf57..26b2192b6 100644
--- a/extensions/firefox/install.rdf
+++ b/extensions/firefox/install.rdf
@@ -19,6 +19,6 @@
     <em:unpack>true</em:unpack>
     <em:creator>Vivien Nicolas</em:creator>
     <em:description>pdf.js uri loader</em:description>
-    <em:homepageURL>https://github.com/andreasgal/pdf.js/</em:homepageURL>
+    <em:homepageURL>https://github.com/mozilla/pdf.js/</em:homepageURL>
   </Description>
 </RDF>
diff --git a/web/index.html.template b/web/index.html.template
index 12e606371..44e9a0cbe 100644
--- a/web/index.html.template
+++ b/web/index.html.template
@@ -3,7 +3,7 @@
 <head>
   <meta charset='utf-8'>
 
-  <title>andreasgal/pdf.js @ GitHub</title>
+  <title>mozilla/pdf.js @ GitHub</title>
 
   <style type="text/css">
     body {
@@ -31,18 +31,18 @@
 </head>
 
 <body>
-  <a href="http://github.com/andreasgal/pdf.js"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
+  <a href="http://github.com/mozilla/pdf.js"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
 
   <div id="container">
 
     <div class="download">
-      <a href="http://github.com/andreasgal/pdf.js/zipball/master">
+      <a href="http://github.com/mozilla/pdf.js/zipball/master">
         <img border="0" width="90" src="http://github.com/images/modules/download/zip.png"></a>
-      <a href="http://github.com/andreasgal/pdf.js/tarball/master">
+      <a href="http://github.com/mozilla/pdf.js/tarball/master">
         <img border="0" width="90" src="http://github.com/images/modules/download/tar.png"></a>
     </div>
 
-    <h1><a href="http://github.com/andreasgal/pdf.js">pdf.js</a>
+    <h1><a href="http://github.com/mozilla/pdf.js">pdf.js</a>
       <span class="small">by <a href="http://github.com/andreasgal">andreasgal</a></span></h1>
 
     <div class="description">
@@ -69,16 +69,16 @@
     <h2>Download</h2>
     <p>
       You can download this project in either
-      <a href="http://github.com/andreasgal/pdf.js/zipball/master">zip</a> or
-      <a href="http://github.com/andreasgal/pdf.js/tarball/master">tar</a> formats.
+      <a href="http://github.com/mozilla/pdf.js/zipball/master">zip</a> or
+      <a href="http://github.com/mozilla/pdf.js/tarball/master">tar</a> formats.
     </p>
     <p>You can also clone the project with <a href="http://git-scm.com">Git</a>
       by running:
-      <pre>$ git clone git://github.com/andreasgal/pdf.js</pre>
+      <pre>$ git clone git://github.com/mozilla/pdf.js</pre>
     </p>
 
     <div class="footer">
-      get the source code on GitHub : <a href="http://github.com/andreasgal/pdf.js">andreasgal/pdf.js</a>
+      get the source code on GitHub : <a href="http://github.com/mozilla/pdf.js">mozilla/pdf.js</a>
     </div>
 
   </div>

From 75bac7d97cb5c18767d484fe5310394008722f0f Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Tue, 1 Nov 2011 08:49:47 -0400
Subject: [PATCH 09/39] andreasgal.github --> mozilla.github

---
 README.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index d6d2d886d..f57d63805 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ successful.
 
 For an online demo, visit:
 
-+ http://andreasgal.github.com/pdf.js/web/viewer.html
++ http://mozilla.github.com/pdf.js/web/viewer.html
 
 This demo provides an interactive interface for displaying and browsing PDFs
 using the pdf.js API.
@@ -31,7 +31,7 @@ using the pdf.js API.
 
 A Firefox extension is also available:
 
-+ http://andreasgal.github.com/pdf.js/extensions/firefox/pdf.js.xpi
++ http://mozilla.github.com/pdf.js/extensions/firefox/pdf.js.xpi
 
 However, note that the extension might not reflect the latest source in our master branch.
 
@@ -99,7 +99,7 @@ More information about the contributor process can be found on the
 
 If you don't want to hack on the project or have little spare time, __you still
 can help!__ Just open PDFs in the 
-[online demo](http://andreasgal.github.com/pdf.js/web/viewer.html) and report 
+[online demo](http://mozilla.github.com/pdf.js/web/viewer.html) and report 
 any breakage in rendering.
 
 Our Github contributors so far:
@@ -150,7 +150,7 @@ See the bot repo for details:
 
 Our demo site is here:
 
-+ http://andreasgal.github.com/pdf.js/web/viewer.html
++ http://mozilla.github.com/pdf.js/web/viewer.html
 
 You can read more about pdf.js here:
 

From 112115c0132c369fb53528d98f5b600b88c555ef Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Tue, 1 Nov 2011 14:27:02 -0300
Subject: [PATCH 10/39] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f57d63805..8414ad2a9 100644
--- a/README.md
+++ b/README.md
@@ -143,7 +143,7 @@ against reference images before merging pull requests.
 
 See the bot repo for details:
 
-+ https://github.com/arturadib/pdf.js-bot
++ https://github.com/mozilla/pdf.js-bot
 
 
 ## Additional resources

From 3b7829d057953204b6a6ef8474dfde4a7708acbc Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Tue, 1 Nov 2011 19:32:20 +0100
Subject: [PATCH 11/39] Address review comments. Use only one PDFJS.workerSrc
 variable to specify the worker source

---
 examples/helloworld/hello.js   |  2 +-
 examples/helloworld/index.html |  7 +++---
 src/core.js                    | 30 ++++++++++---------------
 src/pdf.js                     |  2 +-
 src/worker.js                  |  9 +++++++-
 src/worker_loader.js           | 16 ++++++++++----
 test/test_slave.html           | 40 +++++++++++++++++++---------------
 web/viewer-snippet.html        |  5 ++---
 web/viewer.html                |  3 ++-
 9 files changed, 63 insertions(+), 51 deletions(-)

diff --git a/examples/helloworld/hello.js b/examples/helloworld/hello.js
index c97b53c66..45e61eb6f 100644
--- a/examples/helloworld/hello.js
+++ b/examples/helloworld/hello.js
@@ -7,7 +7,7 @@
 
 'use strict';
 
-getPdf('helloworld.pdf', function getPdfHelloWorld(data) {
+PDFJS.getPdf('helloworld.pdf', function getPdfHelloWorld(data) {
   //
   // Instantiate PDFDoc with PDF data
   //
diff --git a/examples/helloworld/index.html b/examples/helloworld/index.html
index 0fa711fe4..a48e3705b 100644
--- a/examples/helloworld/index.html
+++ b/examples/helloworld/index.html
@@ -3,6 +3,7 @@
 
 <head>
   <!-- In production, only one script (pdf.js) is necessary -->
+  <!-- In production, change the content of PDFJS.workerSrc below -->
   <script type="text/javascript" src="../../src/core.js"></script>
   <script type="text/javascript" src="../../src/util.js"></script>
   <script type="text/javascript" src="../../src/canvas.js"></script>
@@ -23,9 +24,9 @@
   <script type="text/javascript" src="../../src/worker.js"></script>
 
   <script type="text/javascript">
-    // Specify the directory of the source files, such that the web worker
-    // knows where to load them.
-    var PDFJS_WORKER_DIR = '../../src/';
+    // Specify the main script used to create a new PDF.JS web worker.
+    // In production, change this to point to the combined `pdf.js` file.
+    PDFJS.workerSrc = '../../src/worker_loader.js';
   </script>
   <script type="text/javascript" src="hello.js"></script>
 </head>
diff --git a/src/core.js b/src/core.js
index 8d3d6d434..48b1d0591 100644
--- a/src/core.js
+++ b/src/core.js
@@ -471,26 +471,18 @@ var PDFDoc = (function() {
     this.pageCache = [];
 
     if (useWorker) {
-      var worker;
-      if (typeof PDFJS_WORKER_DIR !== 'undefined') {
-        // If `PDFJS_WORKER_DIR` is specified, we assume the pdf.js files
-        // located all in that directory. Create a new worker and tell him
-        // the directory, such that he can load the scripts from there.
-        worker = new Worker(PDFJS_WORKER_DIR + 'worker_loader.js');
-        console.log('main: post dir');
-
-        worker.postMessage(PDFJS_WORKER_DIR);
-      } else if (typeof PDFJS_WORKER_FILE !== 'undefined') {
-        // If we build the worker using a worker file, then we assume, that
-        // everything the worker needs is already included in that file.
-        // Therefore the worker doesn't have to call `importScripts` to load
-        // all the single files and therefore it's not necessary to tell the
-        // worker a directory to laod the js files from.
-        // (Which is different from the PDFJS_WORKER_DIR case above.)
-        worker = new Worker(PDFJS_WORKER_FILE);
-      } else {
-        throw 'No worker file or directory specified.';
+      var workerSrc = PDFJS.workerSrc;
+      if (typeof workerSrc === 'undefined') {
+        throw 'No PDFJS.workerSrc specified';
       }
+
+      var worker = new Worker(workerSrc);
+
+      // Tell the worker the file it was created from.
+      worker.postMessage({
+        action: 'workerSrc',
+        data: workerSrc
+      });
     } else {
       // If we don't use a worker, just post/sendMessage to the main thread.
       var worker = {
diff --git a/src/pdf.js b/src/pdf.js
index 2ecd2fddc..51f606548 100644
--- a/src/pdf.js
+++ b/src/pdf.js
@@ -10,5 +10,5 @@ var PDFJS = {};
   // Files are inserted below - see Makefile
   /* PDFJSSCRIPT_INCLUDE_ALL */
 
-})();
+}).call((typeof window === 'undefined') ? this : window);
 
diff --git a/src/worker.js b/src/worker.js
index 5545fc459..d46364f60 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -47,6 +47,13 @@ var WorkerProcessorHandler = {
   setup: function(handler) {
     var pdfDoc = null;
 
+    handler.on('workerSrc', function(data) {
+      // In development, the `workerSrc` message is handled in the
+      // `worker_loader.js` file. In production the workerProcessHandler is
+      // called for this. This servers as a dummy to prevent calling an
+      // undefined action `workerSrc`.
+    });
+
     handler.on('doc', function(data) {
       // Create only the model of the PDFDoc, which is enough for
       // processing the content of the pdf.
@@ -174,7 +181,7 @@ var workerConsole = {
 
 // Worker thread?
 if (typeof window === 'undefined') {
-  this.console = workerConsole;
+  globalScope.console = workerConsole;
 
   var handler = new MessageHandler('worker_processor', this);
   WorkerProcessorHandler.setup(handler);
diff --git a/src/worker_loader.js b/src/worker_loader.js
index 69f7d55ba..8eb1da7b2 100644
--- a/src/worker_loader.js
+++ b/src/worker_loader.js
@@ -7,11 +7,19 @@ this.onmessage = function(evt) {
   // Reset the `onmessage` function as it was only set to call
   // this function the first time a message is passed to the worker
   // but shouldn't get called anytime afterwards.
-  delete this.onmessage;
+  this.onmessage = null;
 
-  // Directory the include files are contained is send as the
-  // first message to the worker.
-  var dir = evt.data;
+  if (evt.data.action !== 'workerSrc') {
+    throw 'Worker expects first message to be `workerSrc`';
+  }
+
+  // Content of `PDFJS.workerSrc` as defined on the main thread.
+  var workerSrc = evt.data.data;
+
+  // Extract the directory that contains the source files to load.
+  // Assuming the source files have the same relative possition as the
+  // `workerSrc` file.
+  var dir = workerSrc.substring(0, workerSrc.lastIndexOf('/') + 1);
 
   // List of files to include;
   var files = [
diff --git a/test/test_slave.html b/test/test_slave.html
index 7ac886769..91852d5a5 100644
--- a/test/test_slave.html
+++ b/test/test_slave.html
@@ -3,25 +3,29 @@
   <head>
     <title>pdf.js test slave</title>
     <style type="text/css"></style>
-    <script type="text/javascript" src="/src/core.js"></script> 
-    <script type="text/javascript" src="/src/util.js"></script>  
-    <script type="text/javascript" src="/src/canvas.js"></script>  
-    <script type="text/javascript" src="/src/obj.js"></script>  
-    <script type="text/javascript" src="/src/function.js"></script> 
-    <script type="text/javascript" src="/src/charsets.js"></script>  
-    <script type="text/javascript" src="/src/cidmaps.js"></script>  
-    <script type="text/javascript" src="/src/colorspace.js"></script>  
-    <script type="text/javascript" src="/src/crypto.js"></script>  
-    <script type="text/javascript" src="/src/evaluator.js"></script>  
-    <script type="text/javascript" src="/src/fonts.js"></script>  
-    <script type="text/javascript" src="/src/glyphlist.js"></script>  
-    <script type="text/javascript" src="/src/image.js"></script>  
-    <script type="text/javascript" src="/src/metrics.js"></script>  
-    <script type="text/javascript" src="/src/parser.js"></script>  
-    <script type="text/javascript" src="/src/pattern.js"></script>  
-    <script type="text/javascript" src="/src/stream.js"></script>  
-    <script type="text/javascript" src="/src/worker.js"></script>  
+    <script type="text/javascript" src="/src/core.js"></script>
+    <script type="text/javascript" src="/src/util.js"></script>
+    <script type="text/javascript" src="/src/canvas.js"></script>
+    <script type="text/javascript" src="/src/obj.js"></script>
+    <script type="text/javascript" src="/src/function.js"></script>
+    <script type="text/javascript" src="/src/charsets.js"></script>
+    <script type="text/javascript" src="/src/cidmaps.js"></script>
+    <script type="text/javascript" src="/src/colorspace.js"></script>
+    <script type="text/javascript" src="/src/crypto.js"></script>
+    <script type="text/javascript" src="/src/evaluator.js"></script>
+    <script type="text/javascript" src="/src/fonts.js"></script>
+    <script type="text/javascript" src="/src/glyphlist.js"></script>
+    <script type="text/javascript" src="/src/image.js"></script>
+    <script type="text/javascript" src="/src/metrics.js"></script>
+    <script type="text/javascript" src="/src/parser.js"></script>
+    <script type="text/javascript" src="/src/pattern.js"></script>
+    <script type="text/javascript" src="/src/stream.js"></script>
+    <script type="text/javascript" src="/src/worker.js"></script>
     <script type="text/javascript" src="driver.js"></script>
+
+    <script type="text/javascript">
+      PDFJS.workerSrc = '/src/worker_loader.js';
+    </script>
   </head>
 
   <body>
diff --git a/web/viewer-snippet.html b/web/viewer-snippet.html
index 4d2a4f7b7..6b0c8821b 100644
--- a/web/viewer-snippet.html
+++ b/web/viewer-snippet.html
@@ -1,7 +1,6 @@
 <!-- This snippet is used in production, see Makefile -->
 <script type="text/javascript" src="../build/pdf.js"></script>
 <script type="text/javascript">
-  // This specifies the location of the pdf.js file. This is necessary to
-  // spawn the web worker.
-  var PDFJS_WORKER_FILE = "../build/pdf.js";
+  // This specifies the location of the pdf.js file.
+  PDFJS.workerSrc = "../build/pdf.js";
 </script>
diff --git a/web/viewer.html b/web/viewer.html
index 4505331d6..7dd81e0af 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -5,7 +5,6 @@
         <link rel="stylesheet" href="viewer.css"/>
 
         <!-- PDFJSSCRIPT_INCLUDE_BUILD -->
-        <script type="text/javascript">var PDFJS_WORKER_DIR = "../src/"</script> <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/util.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/canvas.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
@@ -25,6 +24,8 @@
         <script type="text/javascript" src="../src/stream.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/worker.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
 
+        <script type="text/javascript">PDFJS.workerSrc = '../../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
+
         <script type="text/javascript" src="compatibility.js"></script>
         <script type="text/javascript" src="viewer.js"></script>
   </head>

From 51d4a1723210359abfed47332d3d0352d4f9d7f4 Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Tue, 1 Nov 2011 22:23:16 +0100
Subject: [PATCH 12/39] Change workerSrc location

---
 src/core.js     | 2 +-
 web/viewer.html | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/core.js b/src/core.js
index 2bc4c50aa..5685cdf31 100644
--- a/src/core.js
+++ b/src/core.js
@@ -7,7 +7,7 @@ var globalScope = (typeof window === 'undefined') ? this : window;
 
 var ERRORS = 0, WARNINGS = 1, TODOS = 5;
 var verbosity = WARNINGS;
-var useWorker = false;
+var useWorker = true;
 
 // The global PDFJS object exposes the API
 // In production, it will be declared outside a global wrapper
diff --git a/web/viewer.html b/web/viewer.html
index 60eab8eab..3883804f0 100644
--- a/web/viewer.html
+++ b/web/viewer.html
@@ -26,7 +26,7 @@
         <script type="text/javascript" src="../src/stream.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
         <script type="text/javascript" src="../src/worker.js"></script>  <!-- PDFJSSCRIPT_REMOVE -->
 
-        <script type="text/javascript">PDFJS.workerSrc = '../../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
+        <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
 
         <script type="text/javascript" src="viewer.js"></script>
   </head>

From 090b4d6647c08f9b2a962966c892b84ef05fdd41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ionu=C8=9B=20G=2E=20Stan?= <ionut.g.stan@gmail.com>
Date: Wed, 2 Nov 2011 12:47:41 +0200
Subject: [PATCH 13/39] Fix same origin policy issue when adding @font-face
 rules

If the first stylesheet in the document is located on an external domain, then
trying to access the `cssRules` property of that `CSSStyleSheet` object will
result in a Security error being thrown in Firefox. In Safari, `cssRules` will
be null, which causes a null pointer exception in the `styleSheet.cssRules.length`
expression.
---
 src/fonts.js | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/fonts.js b/src/fonts.js
index b027b766a..f4f71c4f6 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -1787,12 +1787,11 @@ var Font = (function Font() {
       var url = ('url(data:' + this.mimetype + ';base64,' +
                  window.btoa(data) + ');');
       var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
-      var styleSheet = document.styleSheets[0];
-      if (!styleSheet) {
-        document.documentElement.firstChild.appendChild(
-          document.createElement('style'));
-        styleSheet = document.styleSheets[0];
-      }
+
+      document.documentElement.firstChild.appendChild(
+        document.createElement('style'));
+
+      var styleSheet = document.styleSheets[document.styleSheets.length - 1];
       styleSheet.insertRule(rule, styleSheet.cssRules.length);
 
       return rule;

From c8c5b4f8eac55d850effccb2e6a366a16d0be386 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Wed, 2 Nov 2011 14:43:27 -0400
Subject: [PATCH 14/39] First iteration, tracemonkey/ecma262 working

---
 src/canvas.js |  4 +--
 src/core.js   |  2 +-
 src/fonts.js  | 79 ++++++++++++++++++++++++++-------------------------
 3 files changed, 43 insertions(+), 42 deletions(-)

diff --git a/src/canvas.js b/src/canvas.js
index 474cc250f..1aeb851df 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -125,7 +125,7 @@ var CanvasGraphics = (function canvasGraphics() {
             this[fnArray[i]].apply(this, argsArray[i]);
           } else {
             var deps = argsArray[i];
-            for (var n = 0; n < deps.length; n++) {
+            for (var n = 0, depsLength = deps.length; n < depsLength; n++) {
               var depObjId = deps[n];
 
               // If the promise isn't resolved yet, add the continueCallback
@@ -184,7 +184,7 @@ var CanvasGraphics = (function canvasGraphics() {
       TODO('set flatness: ' + flatness);
     },
     setGState: function canvasGraphicsSetGState(states) {
-      for (var i = 0; i < states.length; i++) {
+      for (var i = 0, statesLength = states.length; i < statesLength; i++) {
         var state = states[i];
         var key = state[0];
         var value = state[1];
diff --git a/src/core.js b/src/core.js
index 09d665972..112883ba2 100644
--- a/src/core.js
+++ b/src/core.js
@@ -205,7 +205,7 @@ var Page = (function pagePage() {
 
     ensureFonts: function pageEnsureFonts(fonts, callback) {
       // Convert the font names to the corresponding font obj.
-      for (var i = 0; i < fonts.length; i++) {
+      for (var i = 0, fontsLength = fonts.length; i < fontsLength; i++) {
         fonts[i] = this.objs.objs[fonts[i]].data;
       }
 
diff --git a/src/fonts.js b/src/fonts.js
index b027b766a..7c753deb2 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -393,7 +393,7 @@ var FontLoader = {
 
   bind: function fontLoaderBind(fonts, callback) {
     function checkFontsLoaded() {
-      for (var i = 0; i < objs.length; i++) {
+      for (var i = 0, objsLength = objs.length; i < objsLength; i++) {
         var fontObj = objs[i];
         if (fontObj.loading) {
           return false;
@@ -409,7 +409,7 @@ var FontLoader = {
 
     var rules = [], names = [], objs = [];
 
-    for (var i = 0; i < fonts.length; i++) {
+    for (var i = 0, fontsLength = fonts.length; i < fontsLength; i++) {
       var font = fonts[i];
 
       // If there is already a fontObj on the font, then it was loaded/attached
@@ -490,7 +490,7 @@ var FontLoader = {
                        'width: 10px; height: 10px;' +
                        'position: absolute; top: 0px; left: 0px;');
       var html = '';
-      for (var i = 0; i < names.length; ++i) {
+      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
         html += '<span style="font-family:' + names[i] + '">Hi</span>';
       }
       div.innerHTML = html;
@@ -501,7 +501,7 @@ var FontLoader = {
           'message',
           function fontLoaderMessage(e) {
             var fontNames = JSON.parse(e.data);
-            for (var i = 0; i < objs.length; ++i) {
+            for (var i = 0, objsLength = objs.length; i < objsLength; ++i) {
               var font = objs[i];
               font.loading = false;
             }
@@ -517,13 +517,13 @@ var FontLoader = {
       // pdfjsFontLoadFailed?
       var src = '<!DOCTYPE HTML><html><head>';
       src += '<style type="text/css">';
-      for (var i = 0; i < rules.length; ++i) {
+      for (var i = 0, rulesLength = rules.length; i < rulesLength; ++i) {
         src += rules[i];
       }
       src += '</style>';
       src += '<script type="application/javascript">';
       var fontNamesArray = '';
-      for (var i = 0; i < names.length; ++i) {
+      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
         fontNamesArray += '"' + names[i] + '", ';
       }
       src += '  var fontNames=[' + fontNamesArray + '];\n';
@@ -531,7 +531,7 @@ var FontLoader = {
       src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
       src += '  }';
       src += '</script></head><body>';
-      for (var i = 0; i < names.length; ++i) {
+      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
         src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
       }
       src += '</body></html>';
@@ -673,7 +673,7 @@ var UnicodeRanges = [
 ];
 
 function getUnicodeRangeFor(value) {
-  for (var i = 0; i < UnicodeRanges.length; i++) {
+  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
     var range = UnicodeRanges[i];
     if (value >= range.begin && value < range.end)
       return i;
@@ -782,7 +782,7 @@ var Font = (function Font() {
 
   function stringToArray(str) {
     var array = [];
-    for (var i = 0; i < str.length; ++i)
+    for (var i = 0, strLength = str.length; i < strLength; ++i)
       array[i] = str.charCodeAt(i);
 
     return array;
@@ -790,7 +790,7 @@ var Font = (function Font() {
 
   function arrayToString(arr) {
     var str = '';
-    for (var i = 0; i < arr.length; ++i)
+    for (var i = 0, arrLength = arr.length; i < arrLength; ++i)
       str += String.fromCharCode(arr[i]);
 
     return str;
@@ -1116,11 +1116,11 @@ var Font = (function Font() {
     // Mac want 1-byte per character strings while Windows want
     // 2-bytes per character, so duplicate the names table
     var stringsUnicode = [];
-    for (var i = 0; i < strings.length; i++) {
+    for (var i = 0, stringsLength = strings.length; i < stringsLength; i++) {
       var str = strings[i];
 
       var strUnicode = '';
-      for (var j = 0; j < str.length; j++)
+      for (var j = 0, strLength = str.length; j < strLength; j++)
         strUnicode += string16(str.charCodeAt(j));
       stringsUnicode.push(strUnicode);
     }
@@ -1138,9 +1138,9 @@ var Font = (function Font() {
 
     // Build the name records field
     var strOffset = 0;
-    for (var i = 0; i < platforms.length; i++) {
+    for (var i = 0, platfLength = platforms.length; i < platfLength; i++) {
       var strs = names[i];
-      for (var j = 0; j < strs.length; j++) {
+      for (var j = 0, strsLength = strs.length; j < strsLength; j++) {
         var str = strs[j];
         var nameRecord =
           platforms[i] + // platform ID
@@ -1258,7 +1258,7 @@ var Font = (function Font() {
                     string32(table.offset);
           }
 
-          for (var i = 0; i < data.length; i++)
+          for (var i = 0, dataLength = data.length; i < dataLength; i++)
             cmap.data[i] = data.charCodeAt(i);
         }
 
@@ -1345,7 +1345,7 @@ var Font = (function Font() {
         if (numMissing > 0) {
           font.pos = (font.start ? font.start : 0) + metrics.offset;
           var entries = '';
-          for (var i = 0; i < hmtx.length; i++)
+          for (var i = 0, hmtxLength = hmtx.length; i < hmtxLength; i++)
             entries += String.fromCharCode(font.getByte());
           for (var i = 0; i < numMissing; i++)
             entries += '\x00\x00';
@@ -1549,18 +1549,18 @@ var Font = (function Font() {
       });
 
       // rewrite the tables but tweak offsets
-      for (var i = 0; i < tables.length; i++) {
+      for (var i = 0, tablesLength = tables.length; i < tablesLength; i++) {
         var table = tables[i];
         var data = [];
 
         var tableData = table.data;
-        for (var j = 0; j < tableData.length; j++)
+        for (var j = 0, dataLength = tableData.length; j < dataLength; j++)
           data.push(tableData[j]);
         createTableEntry(ttf, table.tag, data);
       }
 
       // Add the table datas
-      for (var i = 0; i < tables.length; i++) {
+      for (var i = 0, tablesLength = tables.length; i < tablesLength; i++) {
         var table = tables[i];
         var tableData = table.data;
         ttf.file += arrayToString(tableData);
@@ -1575,7 +1575,7 @@ var Font = (function Font() {
 
     convert: function font_convert(fontName, font, properties) {
       function isFixedPitch(glyphs) {
-        for (var i = 0; i < glyphs.length - 1; i++) {
+        for (var i = 0, glyphsMax = glyphs.length - 1; i < glyphsMax; i++) {
           if (glyphs[i] != glyphs[i + 1])
             return false;
         }
@@ -1657,7 +1657,7 @@ var Font = (function Font() {
         // Horizontal metrics
         'hmtx': (function fontFieldsHmtx() {
           var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
-          for (var i = 0; i < charstrings.length; i++) {
+          for (var i = 0, cstrMax = charstrings.length; i < cstrMax; i++) {
             hmtx += string16(charstrings[i].width) + string16(0);
           }
           return stringToArray(hmtx);
@@ -1729,8 +1729,8 @@ var Font = (function Font() {
       }
 
       encoding[0] = { unicode: 0, width: 0 };
-      var glyph = 1, i, j, k;
-      for (i = 0; i < cidToUnicode.length; ++i) {
+      var glyph = 1, i, j, k, cidLength;
+      for (i = 0, cidLength = cidToUnicode.length; i < cidLength; ++i) {
         var unicode = cidToUnicode[i];
         var width;
         if (isArray(unicode)) {
@@ -1844,7 +1844,7 @@ var Font = (function Font() {
         }
       }
       else {
-        for (var i = 0; i < chars.length; ++i) {
+        for (var i = 0, charsLength = chars.length; i < charsLength; ++i) {
           var charcode = chars.charCodeAt(i);
           var glyph = encoding[charcode];
           if ('undefined' == typeof(glyph)) {
@@ -2142,7 +2142,7 @@ var Type1Parser = function type1Parser() {
       count++;
 
     var array = str.substr(start, count).split(' ');
-    for (var i = 0; i < array.length; i++)
+    for (var i = 0, arrayLength = array.length; i < arrayLength; i++)
       array[i] = parseFloat(array[i] || 0);
     return array;
   }
@@ -2167,7 +2167,7 @@ var Type1Parser = function type1Parser() {
   this.extractFontProgram = function t1_extractFontProgram(stream) {
     var eexec = decrypt(stream, kEexecEncryptionKey, 4);
     var eexecStr = '';
-    for (var i = 0; i < eexec.length; i++)
+    for (var i = 0, eexecLength = eexec.length; i < eexecLength; i++)
       eexecStr += String.fromCharCode(eexec[i]);
 
     var glyphsSection = false, subrsSection = false;
@@ -2291,7 +2291,7 @@ var Type1Parser = function type1Parser() {
 
   this.extractFontHeader = function t1_extractFontHeader(stream, properties) {
     var headerString = '';
-    for (var i = 0; i < stream.length; i++)
+    for (var i = 0, streamLength = stream.length; i < streamLength; i++)
       headerString += String.fromCharCode(stream[i]);
 
     var token = '';
@@ -2318,7 +2318,7 @@ var Type1Parser = function type1Parser() {
             var matrix = readNumberArray(headerString, i + 1);
 
             // The FontMatrix is in unitPerEm, so make it pixels
-            for (var j = 0; j < matrix.length; j++)
+            for (var j = 0, matLength = matrix.length; j < matLength; j++)
               matrix[j] *= 1000;
 
             // Make the angle into the right direction
@@ -2479,7 +2479,7 @@ CFF.prototype = {
     }
 
     for (var i = 0; i < count; i++) {
-      for (var j = 0; j < objects[i].length; j++)
+      for (var j = 0, objLength = objects[i].length; j < objLength; j++)
         data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
                 objects[i][j];
     }
@@ -2507,7 +2507,7 @@ CFF.prototype = {
     var charstrings = [];
     var missings = [];
 
-    for (var i = 0; i < glyphs.length; i++) {
+    for (var i = 0, glLength = glyphs.length; i < glLength; i++) {
       var glyph = glyphs[i];
       var mapping = properties.glyphs[glyph.glyph];
       if (!mapping) {
@@ -2597,6 +2597,7 @@ CFF.prototype = {
   },
 
   flattenCharstring: function flattenCharstring(charstring, map) {
+    // charstring changes size - can't cache .length in loop
     for (var i = 0; i < charstring.length; i++) {
       var command = charstring[i];
       if (command.charAt) {
@@ -2641,7 +2642,7 @@ CFF.prototype = {
               '\x1c\x00\x00\x10'; // Encoding
 
           var boundingBox = properties.bbox;
-          for (var i = 0; i < boundingBox.length; i++)
+          for (var i = 0, boxLength = boundingBox.length; i < boxLength; i++)
             dict += self.encodeNumber(boundingBox[i]);
           dict += '\x05'; // FontBBox;
 
@@ -2731,7 +2732,7 @@ CFF.prototype = {
 
           if (isArray(value)) {
             data += self.encodeNumber(value[0]);
-            for (var i = 1; i < value.length; i++)
+            for (var i = 1, valLength = value.length; i < valLength; i++)
               data += self.encodeNumber(value[i] - value[i - 1]);
           } else {
             data += self.encodeNumber(value);
@@ -2752,7 +2753,7 @@ CFF.prototype = {
     var cff = [];
     for (var index in fields) {
       var field = fields[index];
-      for (var i = 0; i < field.length; i++)
+      for (var i = 0, fLength = field.length; i < fLength; i++)
         cff.push(field.charCodeAt(i));
     }
 
@@ -2849,7 +2850,7 @@ var Type2CFF = (function type2CFF() {
 
       // create the mapping between charstring and glyph id
       var glyphIds = [];
-      for (var i = 0; i < charstrings.length; i++)
+      for (var i = 0, cstrLength = charstrings.length; i < cstrLength; i++)
         glyphIds.push(charstrings[i].gid);
 
       this.charstrings = charstrings;
@@ -2867,7 +2868,7 @@ var Type2CFF = (function type2CFF() {
       var charstrings = [];
       var firstChar = properties.firstChar;
       var glyphMap = {};
-      for (var i = 0; i < charsets.length; i++) {
+      for (var i = 0, csetLength = charsets.length; i < csetLength; i++) {
         var glyph = charsets[i];
         for (var charcode in encoding) {
           if (encoding[charcode] == i)
@@ -2876,7 +2877,7 @@ var Type2CFF = (function type2CFF() {
       }
 
       var differences = properties.differences;
-      for (var i = 0; i < differences.length; ++i) {
+      for (var i = 0, diffLength = differences.length; i < diffLength; ++i) {
         var glyph = differences[i];
         if (!glyph)
           continue;
@@ -2887,7 +2888,7 @@ var Type2CFF = (function type2CFF() {
       }
 
       var glyphs = properties.glyphs;
-      for (var i = 1; i < charsets.length; i++) {
+      for (var i = 1, csetLength = charsets.length; i < csetLength; i++) {
         var glyph = charsets[i];
         var code = glyphMap[glyph] || 0;
 
@@ -2921,7 +2922,7 @@ var Type2CFF = (function type2CFF() {
       //   properties.glyphs[code] || properties.glyphs[glyph]
       var nextUnusedUnicode = kCmapGlyphOffset + 0x0020;
       var lastUnicode = charstrings[0].unicode, wasModified = false;
-      for (var i = 1; i < charstrings.length; ++i) {
+      for (var i = 1, cstrLength = charstrings.length; i < cstrLength; ++i) {
         if (lastUnicode != charstrings[i].unicode) {
           lastUnicode = charstrings[i].unicode;
           continue;
@@ -2966,7 +2967,7 @@ var Type2CFF = (function type2CFF() {
         var gid = 1;
         var baseEncoding = pos ? Encodings.ExpertEncoding.slice() :
                                  Encodings.StandardEncoding.slice();
-        for (var i = 0; i < charset.length; i++) {
+        for (var i = 0, csetLength = charset.length; i < csetLength; i++) {
           var index = baseEncoding.indexOf(charset[i]);
           if (index != -1)
             encoding[index] = gid++;

From 249385b4bb5b53c2f56ab4b69dbffeebccf58d62 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Wed, 2 Nov 2011 15:08:19 -0400
Subject: [PATCH 15/39] Progress

---
 src/crypto.js    |  4 ++--
 src/evaluator.js | 18 +++++++++---------
 src/function.js  |  4 ++--
 src/obj.js       |  6 +++---
 4 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/crypto.js b/src/crypto.js
index 2c86038f0..d4d36fb20 100644
--- a/src/crypto.js
+++ b/src/crypto.js
@@ -338,7 +338,7 @@ var AES128Cipher = (function aes128Cipher() {
   }
 
   function decryptBlock2(data) {
-    var i, j, sourceLength = data.length,
+    var i, j, ii, sourceLength = data.length,
         buffer = this.buffer, bufferLength = this.bufferPosition,
         result = [], iv = this.iv;
     for (i = 0; i < sourceLength; ++i) {
@@ -366,7 +366,7 @@ var AES128Cipher = (function aes128Cipher() {
       return result[0];
     // combining plain text blocks into one
     var output = new Uint8Array(16 * result.length);
-    for (i = 0, j = 0; i < result.length; ++i, j += 16)
+    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
       output.set(result[i], j);
     return output;
   }
diff --git a/src/evaluator.js b/src/evaluator.js
index b7a5ef583..cb10b200a 100644
--- a/src/evaluator.js
+++ b/src/evaluator.js
@@ -123,7 +123,7 @@ var PartialEvaluator = (function partialEvaluator() {
       function insertDependency(depList) {
         fnArray.push('dependency');
         argsArray.push(depList);
-        for (var i = 0; i < depList.length; i++) {
+        for (var i = 0, ii = depList.length; i < ii; i++) {
           var dep = depList[i];
           if (dependency.indexOf(dep) == -1) {
             dependency.push(depList[i]);
@@ -471,10 +471,10 @@ var PartialEvaluator = (function partialEvaluator() {
         var widths = xref.fetchIfRef(dict.get('W'));
         if (widths) {
           var start = 0, end = 0;
-          for (var i = 0; i < widths.length; i++) {
+          for (var i = 0, ii = widths.length; i < ii; i++) {
             var code = widths[i];
             if (isArray(code)) {
-              for (var j = 0; j < code.length; j++)
+              for (var j = 0, jj = code.length; j < jj; j++)
                 glyphsWidths[start++] = code[j];
               start = 0;
             } else if (start) {
@@ -515,7 +515,7 @@ var PartialEvaluator = (function partialEvaluator() {
 
         // Set encoding 0 to later verify the font has an encoding
         encoding[0] = { unicode: 0, width: 0 };
-        for (var j = 0; j < glyphsData.length; j++) {
+        for (var j = 0, jj = glyphsData.length; j < jj; j++) {
           var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
           if (glyphID == 0)
             continue;
@@ -545,7 +545,7 @@ var PartialEvaluator = (function partialEvaluator() {
           if (encoding.has('Differences')) {
             var diffEncoding = encoding.get('Differences');
             var index = 0;
-            for (var j = 0; j < diffEncoding.length; j++) {
+            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
               var data = diffEncoding[j];
               if (isNum(data))
                 index = data;
@@ -623,7 +623,7 @@ var PartialEvaluator = (function partialEvaluator() {
           var beginArrayToken = {};
 
           var cmap = cmapObj.getBytes(cmapObj.length);
-          for (var i = 0; i < cmap.length; i++) {
+          for (var i = 0, ii = cmap.length; i < ii; i++) {
             var byte = cmap[i];
             if (byte == 0x20 || byte == 0x0D || byte == 0x0A ||
                 byte == 0x3C || byte == 0x5B || byte == 0x5D) {
@@ -642,7 +642,7 @@ var PartialEvaluator = (function partialEvaluator() {
 
                 case 'endcidrange':
                 case 'endbfrange':
-                  for (var j = 0; j < tokens.length; j += 3) {
+                  for (var j = 0, jj = tokens.length; j < jj; j += 3) {
                     var startRange = tokens[j];
                     var endRange = tokens[j + 1];
                     var code = tokens[j + 2];
@@ -657,7 +657,7 @@ var PartialEvaluator = (function partialEvaluator() {
 
                 case 'endcidchar':
                 case 'endbfchar':
-                  for (var j = 0; j < tokens.length; j += 2) {
+                  for (var j = 0, jj = tokens.length; j < jj; j += 2) {
                     var index = tokens[j];
                     var code = tokens[j + 1];
                     var mapping = map[index] || {};
@@ -807,7 +807,7 @@ var PartialEvaluator = (function partialEvaluator() {
       var encoding = {};
       var widths = xref.fetchIfRef(dict.get('Widths'));
       if (widths) {
-        for (var i = 0, j = firstChar; i < widths.length; i++, j++)
+        for (var i = 0, j = firstChar, ii = widths.length; i < ii; i++, j++)
           glyphWidths[j] = widths[i];
         defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
       } else {
diff --git a/src/function.js b/src/function.js
index a8c797a29..80c5a5460 100644
--- a/src/function.js
+++ b/src/function.js
@@ -13,7 +13,7 @@ var PDFFunction = (function pdfFunction() {
     getSampleArray: function pdfFunctionGetSampleArray(size, outputSize, bps,
                                                        str) {
       var length = 1;
-      for (var i = 0; i < size.length; i++)
+      for (var i = 0, ii = size.length; i < ii; i++)
         length *= size[i];
       length *= outputSize;
 
@@ -254,7 +254,7 @@ var PDFFunction = (function pdfFunction() {
       var fnsIR = IR[4];
       var fns = [];
 
-      for (var i = 0; i < fnsIR.length; i++) {
+      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
         fns.push(PDFFunction.fromIR(fnsIR[i]));
       }
 
diff --git a/src/obj.js b/src/obj.js
index fd1579280..7aebb732a 100644
--- a/src/obj.js
+++ b/src/obj.js
@@ -178,7 +178,7 @@ var Catalog = (function catalogCatalog() {
       var kids = pagesDict.get('Kids');
       assertWellFormed(isArray(kids),
                        'page dictionary kids object is not an array');
-      for (var i = 0; i < kids.length; ++i) {
+      for (var i = 0, ii = kids.length; i < ii; ++i) {
         var kid = kids[i];
         assertWellFormed(isRef(kid),
                          'page dictionary kid is not a reference');
@@ -490,12 +490,12 @@ var XRef = (function xRefXRef() {
           position += token.length + 1;
       }
       // reading XRef streams
-      for (var i = 0; i < xrefStms.length; ++i) {
+      for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
           this.readXRef(xrefStms[i]);
       }
       // finding main trailer
       var dict;
-      for (var i = 0; i < trailers.length; ++i) {
+      for (var i = 0, ii = trailers.length; i < ii; ++i) {
         stream.pos = trailers[i];
         var parser = new Parser(new Lexer(stream), true);
         var obj = parser.getObj();

From 2c3991f8b03d6c64976de2459f3d899858da5878 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Wed, 2 Nov 2011 15:11:33 -0400
Subject: [PATCH 16/39] More progress, workers working

---
 src/util.js   | 2 +-
 src/worker.js | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/util.js b/src/util.js
index 41ae4cc96..4fb96f062 100644
--- a/src/util.js
+++ b/src/util.js
@@ -261,7 +261,7 @@ var Promise = (function promise() {
       this.data = data;
       var callbacks = this.callbacks;
 
-      for (var i = 0; i < callbacks.length; i++) {
+      for (var i = 0, ii = callbacks.length; i < ii; i++) {
         callbacks[i].call(null, data);
       }
     },
diff --git a/src/worker.js b/src/worker.js
index d62e0c86b..9860ef978 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -75,7 +75,7 @@ var WorkerProcessorHandler = {
 
       // Filter the dependecies for fonts.
       var fonts = {};
-      for (var i = 0; i < dependency.length; i++) {
+      for (var i = 0, ii = dependency.length; i < ii; i++) {
         var dep = dependency[i];
         if (dep.indexOf('font_') == 0) {
           fonts[dep] = true;

From ddf77cda6bc4bec6622ebdee34f1bca8c1754a81 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Wed, 2 Nov 2011 15:21:45 -0400
Subject: [PATCH 17/39] Using ii convention

---
 src/canvas.js |  4 +--
 src/core.js   |  2 +-
 src/fonts.js  | 80 +++++++++++++++++++++++++--------------------------
 3 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/src/canvas.js b/src/canvas.js
index 1aeb851df..43b10aeda 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -125,7 +125,7 @@ var CanvasGraphics = (function canvasGraphics() {
             this[fnArray[i]].apply(this, argsArray[i]);
           } else {
             var deps = argsArray[i];
-            for (var n = 0, depsLength = deps.length; n < depsLength; n++) {
+            for (var n = 0, nn = deps.length; n < nn; n++) {
               var depObjId = deps[n];
 
               // If the promise isn't resolved yet, add the continueCallback
@@ -184,7 +184,7 @@ var CanvasGraphics = (function canvasGraphics() {
       TODO('set flatness: ' + flatness);
     },
     setGState: function canvasGraphicsSetGState(states) {
-      for (var i = 0, statesLength = states.length; i < statesLength; i++) {
+      for (var i = 0, ii = states.length; i < ii; i++) {
         var state = states[i];
         var key = state[0];
         var value = state[1];
diff --git a/src/core.js b/src/core.js
index 112883ba2..c9be997d1 100644
--- a/src/core.js
+++ b/src/core.js
@@ -205,7 +205,7 @@ var Page = (function pagePage() {
 
     ensureFonts: function pageEnsureFonts(fonts, callback) {
       // Convert the font names to the corresponding font obj.
-      for (var i = 0, fontsLength = fonts.length; i < fontsLength; i++) {
+      for (var i = 0, ii = fonts.length; i < ii; i++) {
         fonts[i] = this.objs.objs[fonts[i]].data;
       }
 
diff --git a/src/fonts.js b/src/fonts.js
index 7c753deb2..16f09c495 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -393,7 +393,7 @@ var FontLoader = {
 
   bind: function fontLoaderBind(fonts, callback) {
     function checkFontsLoaded() {
-      for (var i = 0, objsLength = objs.length; i < objsLength; i++) {
+      for (var i = 0, ii = objs.length; i < ii; i++) {
         var fontObj = objs[i];
         if (fontObj.loading) {
           return false;
@@ -409,7 +409,7 @@ var FontLoader = {
 
     var rules = [], names = [], objs = [];
 
-    for (var i = 0, fontsLength = fonts.length; i < fontsLength; i++) {
+    for (var i = 0, ii = fonts.length; i < ii; i++) {
       var font = fonts[i];
 
       // If there is already a fontObj on the font, then it was loaded/attached
@@ -490,7 +490,7 @@ var FontLoader = {
                        'width: 10px; height: 10px;' +
                        'position: absolute; top: 0px; left: 0px;');
       var html = '';
-      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
+      for (var i = 0, ii = names.length; i < ii; ++i) {
         html += '<span style="font-family:' + names[i] + '">Hi</span>';
       }
       div.innerHTML = html;
@@ -501,7 +501,7 @@ var FontLoader = {
           'message',
           function fontLoaderMessage(e) {
             var fontNames = JSON.parse(e.data);
-            for (var i = 0, objsLength = objs.length; i < objsLength; ++i) {
+            for (var i = 0, ii = objs.length; i < ii; ++i) {
               var font = objs[i];
               font.loading = false;
             }
@@ -517,13 +517,13 @@ var FontLoader = {
       // pdfjsFontLoadFailed?
       var src = '<!DOCTYPE HTML><html><head>';
       src += '<style type="text/css">';
-      for (var i = 0, rulesLength = rules.length; i < rulesLength; ++i) {
+      for (var i = 0, ii = rules.length; i < ii; ++i) {
         src += rules[i];
       }
       src += '</style>';
       src += '<script type="application/javascript">';
       var fontNamesArray = '';
-      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
+      for (var i = 0, ii = names.length; i < ii; ++i) {
         fontNamesArray += '"' + names[i] + '", ';
       }
       src += '  var fontNames=[' + fontNamesArray + '];\n';
@@ -531,7 +531,7 @@ var FontLoader = {
       src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
       src += '  }';
       src += '</script></head><body>';
-      for (var i = 0, namesLength = names.length; i < namesLength; ++i) {
+      for (var i = 0, ii = names.length; i < ii; ++i) {
         src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
       }
       src += '</body></html>';
@@ -782,7 +782,7 @@ var Font = (function Font() {
 
   function stringToArray(str) {
     var array = [];
-    for (var i = 0, strLength = str.length; i < strLength; ++i)
+    for (var i = 0, ii = str.length; i < ii; ++i)
       array[i] = str.charCodeAt(i);
 
     return array;
@@ -790,7 +790,7 @@ var Font = (function Font() {
 
   function arrayToString(arr) {
     var str = '';
-    for (var i = 0, arrLength = arr.length; i < arrLength; ++i)
+    for (var i = 0, ii = arr.length; i < ii; ++i)
       str += String.fromCharCode(arr[i]);
 
     return str;
@@ -1116,11 +1116,11 @@ var Font = (function Font() {
     // Mac want 1-byte per character strings while Windows want
     // 2-bytes per character, so duplicate the names table
     var stringsUnicode = [];
-    for (var i = 0, stringsLength = strings.length; i < stringsLength; i++) {
+    for (var i = 0, ii = strings.length; i < ii; i++) {
       var str = strings[i];
 
       var strUnicode = '';
-      for (var j = 0, strLength = str.length; j < strLength; j++)
+      for (var j = 0, jj = str.length; j < jj; j++)
         strUnicode += string16(str.charCodeAt(j));
       stringsUnicode.push(strUnicode);
     }
@@ -1138,9 +1138,9 @@ var Font = (function Font() {
 
     // Build the name records field
     var strOffset = 0;
-    for (var i = 0, platfLength = platforms.length; i < platfLength; i++) {
+    for (var i = 0, ii = platforms.length; i < ii; i++) {
       var strs = names[i];
-      for (var j = 0, strsLength = strs.length; j < strsLength; j++) {
+      for (var j = 0, jj = strs.length; j < jj; j++) {
         var str = strs[j];
         var nameRecord =
           platforms[i] + // platform ID
@@ -1258,7 +1258,7 @@ var Font = (function Font() {
                     string32(table.offset);
           }
 
-          for (var i = 0, dataLength = data.length; i < dataLength; i++)
+          for (var i = 0, ii = data.length; i < ii; i++)
             cmap.data[i] = data.charCodeAt(i);
         }
 
@@ -1345,7 +1345,7 @@ var Font = (function Font() {
         if (numMissing > 0) {
           font.pos = (font.start ? font.start : 0) + metrics.offset;
           var entries = '';
-          for (var i = 0, hmtxLength = hmtx.length; i < hmtxLength; i++)
+          for (var i = 0, ii = hmtx.length; i < ii; i++)
             entries += String.fromCharCode(font.getByte());
           for (var i = 0; i < numMissing; i++)
             entries += '\x00\x00';
@@ -1549,18 +1549,18 @@ var Font = (function Font() {
       });
 
       // rewrite the tables but tweak offsets
-      for (var i = 0, tablesLength = tables.length; i < tablesLength; i++) {
+      for (var i = 0, ii = tables.length; i < ii; i++) {
         var table = tables[i];
         var data = [];
 
         var tableData = table.data;
-        for (var j = 0, dataLength = tableData.length; j < dataLength; j++)
+        for (var j = 0, jj = tableData.length; j < jj; j++)
           data.push(tableData[j]);
         createTableEntry(ttf, table.tag, data);
       }
 
       // Add the table datas
-      for (var i = 0, tablesLength = tables.length; i < tablesLength; i++) {
+      for (var i = 0, ii = tables.length; i < ii; i++) {
         var table = tables[i];
         var tableData = table.data;
         ttf.file += arrayToString(tableData);
@@ -1575,7 +1575,7 @@ var Font = (function Font() {
 
     convert: function font_convert(fontName, font, properties) {
       function isFixedPitch(glyphs) {
-        for (var i = 0, glyphsMax = glyphs.length - 1; i < glyphsMax; i++) {
+        for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
           if (glyphs[i] != glyphs[i + 1])
             return false;
         }
@@ -1657,7 +1657,7 @@ var Font = (function Font() {
         // Horizontal metrics
         'hmtx': (function fontFieldsHmtx() {
           var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
-          for (var i = 0, cstrMax = charstrings.length; i < cstrMax; i++) {
+          for (var i = 0, ii = charstrings.length; i < ii; i++) {
             hmtx += string16(charstrings[i].width) + string16(0);
           }
           return stringToArray(hmtx);
@@ -1730,7 +1730,7 @@ var Font = (function Font() {
 
       encoding[0] = { unicode: 0, width: 0 };
       var glyph = 1, i, j, k, cidLength;
-      for (i = 0, cidLength = cidToUnicode.length; i < cidLength; ++i) {
+      for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
         var unicode = cidToUnicode[i];
         var width;
         if (isArray(unicode)) {
@@ -1844,7 +1844,7 @@ var Font = (function Font() {
         }
       }
       else {
-        for (var i = 0, charsLength = chars.length; i < charsLength; ++i) {
+        for (var i = 0, ii = chars.length; i < ii; ++i) {
           var charcode = chars.charCodeAt(i);
           var glyph = encoding[charcode];
           if ('undefined' == typeof(glyph)) {
@@ -2142,7 +2142,7 @@ var Type1Parser = function type1Parser() {
       count++;
 
     var array = str.substr(start, count).split(' ');
-    for (var i = 0, arrayLength = array.length; i < arrayLength; i++)
+    for (var i = 0, ii = array.length; i < ii; i++)
       array[i] = parseFloat(array[i] || 0);
     return array;
   }
@@ -2167,7 +2167,7 @@ var Type1Parser = function type1Parser() {
   this.extractFontProgram = function t1_extractFontProgram(stream) {
     var eexec = decrypt(stream, kEexecEncryptionKey, 4);
     var eexecStr = '';
-    for (var i = 0, eexecLength = eexec.length; i < eexecLength; i++)
+    for (var i = 0, ii = eexec.length; i < ii; i++)
       eexecStr += String.fromCharCode(eexec[i]);
 
     var glyphsSection = false, subrsSection = false;
@@ -2291,7 +2291,7 @@ var Type1Parser = function type1Parser() {
 
   this.extractFontHeader = function t1_extractFontHeader(stream, properties) {
     var headerString = '';
-    for (var i = 0, streamLength = stream.length; i < streamLength; i++)
+    for (var i = 0, ii = stream.length; i < ii; i++)
       headerString += String.fromCharCode(stream[i]);
 
     var token = '';
@@ -2318,7 +2318,7 @@ var Type1Parser = function type1Parser() {
             var matrix = readNumberArray(headerString, i + 1);
 
             // The FontMatrix is in unitPerEm, so make it pixels
-            for (var j = 0, matLength = matrix.length; j < matLength; j++)
+            for (var j = 0, jj = matrix.length; j < jj; j++)
               matrix[j] *= 1000;
 
             // Make the angle into the right direction
@@ -2479,7 +2479,7 @@ CFF.prototype = {
     }
 
     for (var i = 0; i < count; i++) {
-      for (var j = 0, objLength = objects[i].length; j < objLength; j++)
+      for (var j = 0, jj = objects[i].length; j < jj; j++)
         data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
                 objects[i][j];
     }
@@ -2507,7 +2507,7 @@ CFF.prototype = {
     var charstrings = [];
     var missings = [];
 
-    for (var i = 0, glLength = glyphs.length; i < glLength; i++) {
+    for (var i = 0, ii = glyphs.length; i < ii; i++) {
       var glyph = glyphs[i];
       var mapping = properties.glyphs[glyph.glyph];
       if (!mapping) {
@@ -2642,7 +2642,7 @@ CFF.prototype = {
               '\x1c\x00\x00\x10'; // Encoding
 
           var boundingBox = properties.bbox;
-          for (var i = 0, boxLength = boundingBox.length; i < boxLength; i++)
+          for (var i = 0, ii = boundingBox.length; i < ii; i++)
             dict += self.encodeNumber(boundingBox[i]);
           dict += '\x05'; // FontBBox;
 
@@ -2732,7 +2732,7 @@ CFF.prototype = {
 
           if (isArray(value)) {
             data += self.encodeNumber(value[0]);
-            for (var i = 1, valLength = value.length; i < valLength; i++)
+            for (var i = 1, ii = value.length; i < ii; i++)
               data += self.encodeNumber(value[i] - value[i - 1]);
           } else {
             data += self.encodeNumber(value);
@@ -2753,7 +2753,7 @@ CFF.prototype = {
     var cff = [];
     for (var index in fields) {
       var field = fields[index];
-      for (var i = 0, fLength = field.length; i < fLength; i++)
+      for (var i = 0, ii = field.length; i < ii; i++)
         cff.push(field.charCodeAt(i));
     }
 
@@ -2850,7 +2850,7 @@ var Type2CFF = (function type2CFF() {
 
       // create the mapping between charstring and glyph id
       var glyphIds = [];
-      for (var i = 0, cstrLength = charstrings.length; i < cstrLength; i++)
+      for (var i = 0, ii = charstrings.length; i < ii; i++)
         glyphIds.push(charstrings[i].gid);
 
       this.charstrings = charstrings;
@@ -2868,7 +2868,7 @@ var Type2CFF = (function type2CFF() {
       var charstrings = [];
       var firstChar = properties.firstChar;
       var glyphMap = {};
-      for (var i = 0, csetLength = charsets.length; i < csetLength; i++) {
+      for (var i = 0, ii = charsets.length; i < ii; i++) {
         var glyph = charsets[i];
         for (var charcode in encoding) {
           if (encoding[charcode] == i)
@@ -2877,7 +2877,7 @@ var Type2CFF = (function type2CFF() {
       }
 
       var differences = properties.differences;
-      for (var i = 0, diffLength = differences.length; i < diffLength; ++i) {
+      for (var i = 0, ii = differences.length; i < ii; ++i) {
         var glyph = differences[i];
         if (!glyph)
           continue;
@@ -2888,7 +2888,7 @@ var Type2CFF = (function type2CFF() {
       }
 
       var glyphs = properties.glyphs;
-      for (var i = 1, csetLength = charsets.length; i < csetLength; i++) {
+      for (var i = 1, ii = charsets.length; i < ii; i++) {
         var glyph = charsets[i];
         var code = glyphMap[glyph] || 0;
 
@@ -2922,7 +2922,7 @@ var Type2CFF = (function type2CFF() {
       //   properties.glyphs[code] || properties.glyphs[glyph]
       var nextUnusedUnicode = kCmapGlyphOffset + 0x0020;
       var lastUnicode = charstrings[0].unicode, wasModified = false;
-      for (var i = 1, cstrLength = charstrings.length; i < cstrLength; ++i) {
+      for (var i = 1, ii = charstrings.length; i < ii; ++i) {
         if (lastUnicode != charstrings[i].unicode) {
           lastUnicode = charstrings[i].unicode;
           continue;
@@ -2967,7 +2967,7 @@ var Type2CFF = (function type2CFF() {
         var gid = 1;
         var baseEncoding = pos ? Encodings.ExpertEncoding.slice() :
                                  Encodings.StandardEncoding.slice();
-        for (var i = 0, csetLength = charset.length; i < csetLength; i++) {
+        for (var i = 0, ii = charset.length; i < ii; i++) {
           var index = baseEncoding.indexOf(charset[i]);
           if (index != -1)
             encoding[index] = gid++;
@@ -3118,16 +3118,16 @@ var Type2CFF = (function type2CFF() {
     getStrings: function cff_getStrings(stringIndex) {
       function bytesToString(bytesArray) {
         var str = '';
-        for (var i = 0, length = bytesArray.length; i < length; i++)
+        for (var i = 0, ii = bytesArray.length; i < ii; i++)
           str += String.fromCharCode(bytesArray[i]);
         return str;
       }
 
       var stringArray = [];
-      for (var i = 0, length = CFFStrings.length; i < length; i++)
+      for (var i = 0, ii = CFFStrings.length; i < ii; i++)
         stringArray.push(CFFStrings[i]);
 
-      for (var i = 0, length = stringIndex.length; i < length; i++)
+      for (var i = 0, ii = stringIndex.length; i < ii; i++)
         stringArray.push(bytesToString(stringIndex.get(i).data));
 
       return stringArray;

From 7d38d7f062bf5c6e89b932f80c4b7d0ff83c8edf Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Wed, 2 Nov 2011 17:34:24 -0400
Subject: [PATCH 18/39] Missing var

---
 src/fonts.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/fonts.js b/src/fonts.js
index 16f09c495..217d0733e 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -1729,7 +1729,7 @@ var Font = (function Font() {
       }
 
       encoding[0] = { unicode: 0, width: 0 };
-      var glyph = 1, i, j, k, cidLength;
+      var glyph = 1, i, j, k, cidLength, ii;
       for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
         var unicode = cidToUnicode[i];
         var width;

From 50fe4f55e2f78320dc265f9cf828dc0d3a25666e Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Wed, 2 Nov 2011 23:00:08 +0100
Subject: [PATCH 19/39] Fix lint warning + turn off worker support

---
 src/core.js          | 2 +-
 src/worker_loader.js | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/core.js b/src/core.js
index 5685cdf31..2bc4c50aa 100644
--- a/src/core.js
+++ b/src/core.js
@@ -7,7 +7,7 @@ var globalScope = (typeof window === 'undefined') ? this : window;
 
 var ERRORS = 0, WARNINGS = 1, TODOS = 5;
 var verbosity = WARNINGS;
-var useWorker = true;
+var useWorker = false;
 
 // The global PDFJS object exposes the API
 // In production, it will be declared outside a global wrapper
diff --git a/src/worker_loader.js b/src/worker_loader.js
index 8eb1da7b2..8d342d116 100644
--- a/src/worker_loader.js
+++ b/src/worker_loader.js
@@ -3,7 +3,7 @@
 
 'use strict';
 
-this.onmessage = function(evt) {
+function onMessageLoader(evt) {
   // Reset the `onmessage` function as it was only set to call
   // this function the first time a message is passed to the worker
   // but shouldn't get called anytime afterwards.
@@ -47,4 +47,6 @@ this.onmessage = function(evt) {
   for (var i = 0; i < files.length; i++) {
     importScripts(dir + files[i]);
   }
-}.bind(this);
+}
+
+this.onmessage = onMessageLoader.bind(this);

From 493c25dcaa00fa75b0e1f6f4e836d67eca190895 Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Tue, 1 Nov 2011 20:23:48 +0100
Subject: [PATCH 20/39] Remove `useWorker` variable and turn worker support
 whenever this is possible.

---
 src/core.js   | 207 +++++++++++++++++++++++++++-----------------------
 src/worker.js |   4 +
 2 files changed, 118 insertions(+), 93 deletions(-)

diff --git a/src/core.js b/src/core.js
index 2bc4c50aa..492f36927 100644
--- a/src/core.js
+++ b/src/core.js
@@ -7,7 +7,6 @@ var globalScope = (typeof window === 'undefined') ? this : window;
 
 var ERRORS = 0, WARNINGS = 1, TODOS = 5;
 var verbosity = WARNINGS;
-var useWorker = false;
 
 // The global PDFJS object exposes the API
 // In production, it will be declared outside a global wrapper
@@ -470,8 +469,14 @@ var PDFDoc = (function pdfDoc() {
     this.objs = new PDFObjects();
 
     this.pageCache = [];
+    this.workerReadyPromise = new Promise('workerReady');
 
-    if (useWorker) {
+    // If worker support isn't disabled explicit and the browser has worker
+    // support, create a new web worker and test if it/the browser fullfills
+    // all requirements to run parts of pdf.js in a web worker.
+    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+    // as it arrives on the worker. Chrome added this with version 15.
+    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
       var workerSrc = PDFJS.workerSrc;
       if (typeof workerSrc === 'undefined') {
         throw 'No PDFJS.workerSrc specified';
@@ -479,105 +484,121 @@ var PDFDoc = (function pdfDoc() {
 
       var worker = new Worker(workerSrc);
 
+      var processorHandler = new MessageHandler('main', worker);
+
       // Tell the worker the file it was created from.
-      worker.postMessage({
-        action: 'workerSrc',
-        data: workerSrc
-      });
+      processorHandler.send('workerSrc', workerSrc);
+
+      processorHandler.on('test', function pdfDocTest(supportTypedArray) {
+        if (supportTypedArray) {
+          this.worker = worker;
+          this.setupProcessorHandler(processorHandler);
+        } else {
+          this.setupFakeWorker();
+        }
+      }.bind(this));
+
+      var testObj = new Uint8Array(1);
+      processorHandler.send('test', testObj);
     } else {
-      // If we don't use a worker, just post/sendMessage to the main thread.
-      var worker = {
-        postMessage: function pdfDocPostMessage(obj) {
-          worker.onmessage({data: obj});
-        },
-        terminate: function pdfDocTerminate() {}
-      };
+      this.setupFakeWorker();
     }
-    this.worker = worker;
 
     this.fontsLoading = {};
-
-    var processorHandler = this.processorHandler =
-                                        new MessageHandler('main', worker);
-
-    processorHandler.on('page', function pdfDocPage(data) {
-      var pageNum = data.pageNum;
-      var page = this.pageCache[pageNum];
-      var depFonts = data.depFonts;
-
-      page.startRenderingFromIRQueue(data.IRQueue, depFonts);
-    }, this);
-
-    processorHandler.on('obj', function pdfDocObj(data) {
-      var id = data[0];
-      var type = data[1];
-
-      switch (type) {
-        case 'JpegStream':
-          var IR = data[2];
-          new JpegImage(id, IR, this.objs);
-        break;
-        case 'Font':
-          var name = data[2];
-          var file = data[3];
-          var properties = data[4];
-
-          if (file) {
-            var fontFileDict = new Dict();
-            fontFileDict.map = file.dict.map;
-
-            var fontFile = new Stream(file.bytes, file.start,
-                                      file.end - file.start, fontFileDict);
-
-            // Check if this is a FlateStream. Otherwise just use the created
-            // Stream one. This makes complex_ttf_font.pdf work.
-            var cmf = file.bytes[0];
-            if ((cmf & 0x0f) == 0x08) {
-              file = new FlateStream(fontFile);
-            } else {
-              file = fontFile;
-            }
-          }
-
-          // For now, resolve the font object here direclty. The real font
-          // object is then created in FontLoader.bind().
-          this.objs.resolve(id, {
-            name: name,
-            file: file,
-            properties: properties
-          });
-        break;
-        default:
-          throw 'Got unkown object type ' + type;
-      }
-    }, this);
-
-    processorHandler.on('font_ready', function pdfDocFontReady(data) {
-      var id = data[0];
-      var font = new FontShape(data[1]);
-
-      // If there is no string, then there is nothing to attach to the DOM.
-      if (!font.str) {
-        this.objs.resolve(id, font);
-      } else {
-        this.objs.setData(id, font);
-      }
-    }.bind(this));
-
-    if (!useWorker) {
-      // If the main thread is our worker, setup the handling for the messages
-      // the main thread sends to it self.
-      WorkerProcessorHandler.setup(processorHandler);
-    }
-
-    this.workerReadyPromise = new Promise('workerReady');
-    setTimeout(function pdfDocFontReadySetTimeout() {
-      processorHandler.send('doc', this.data);
-      this.workerReadyPromise.resolve(true);
-    }.bind(this));
   }
 
   constructor.prototype = {
+    setupFakeWorker: function() {
+      // If we don't use a worker, just post/sendMessage to the main thread.
+      var fakeWorker = {
+        postMessage: function pdfDocPostMessage(obj) {
+          fakeWorker.onmessage({data: obj});
+        },
+        terminate: function pdfDocTerminate() {}
+      };
+
+      var processorHandler = new MessageHandler('main', fakeWorker);
+      this.setupProcessorHandler(processorHandler);
+
+      // If the main thread is our worker, setup the handling for the messages
+      // the main thread sends to it self.
+      WorkerProcessorHandler.setup(processorHandler);
+    },
+
+
+    setupProcessorHandler: function(processorHandler) {
+      this.processorHandler = processorHandler;
+
+      processorHandler.on('page', function pdfDocPage(data) {
+        var pageNum = data.pageNum;
+        var page = this.pageCache[pageNum];
+        var depFonts = data.depFonts;
+
+        page.startRenderingFromIRQueue(data.IRQueue, depFonts);
+      }, this);
+
+      processorHandler.on('obj', function pdfDocObj(data) {
+        var id = data[0];
+        var type = data[1];
+
+        switch (type) {
+          case 'JpegStream':
+            var IR = data[2];
+            new JpegImage(id, IR, this.objs);
+          break;
+          case 'Font':
+            var name = data[2];
+            var file = data[3];
+            var properties = data[4];
+
+            if (file) {
+              var fontFileDict = new Dict();
+              fontFileDict.map = file.dict.map;
+
+              var fontFile = new Stream(file.bytes, file.start,
+                                        file.end - file.start, fontFileDict);
+
+              // Check if this is a FlateStream. Otherwise just use the created
+              // Stream one. This makes complex_ttf_font.pdf work.
+              var cmf = file.bytes[0];
+              if ((cmf & 0x0f) == 0x08) {
+                file = new FlateStream(fontFile);
+              } else {
+                file = fontFile;
+              }
+            }
+
+            // For now, resolve the font object here direclty. The real font
+            // object is then created in FontLoader.bind().
+            this.objs.resolve(id, {
+              name: name,
+              file: file,
+              properties: properties
+            });
+          break;
+          default:
+            throw 'Got unkown object type ' + type;
+        }
+      }, this);
+
+      processorHandler.on('font_ready', function pdfDocFontReady(data) {
+        var id = data[0];
+        var font = new FontShape(data[1]);
+
+        // If there is no string, then there is nothing to attach to the DOM.
+        if (!font.str) {
+          this.objs.resolve(id, font);
+        } else {
+          this.objs.setData(id, font);
+        }
+      }.bind(this));
+
+      setTimeout(function pdfDocFontReadySetTimeout() {
+        processorHandler.send('doc', this.data);
+        this.workerReadyPromise.resolve(true);
+      }.bind(this));
+    },
+
     get numPages() {
       return this.pdf.numPages;
     },
diff --git a/src/worker.js b/src/worker.js
index 74a880cae..45a76e147 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -47,6 +47,10 @@ var WorkerProcessorHandler = {
   setup: function wphSetup(handler) {
     var pdfDoc = null;
 
+    handler.on('test', function wphSetupTest(data) {
+      handler.send('test', data instanceof Uint8Array);
+    });
+
     handler.on('workerSrc', function wphSetupWorkerSrc(data) {
       // In development, the `workerSrc` message is handled in the
       // `worker_loader.js` file. In production the workerProcessHandler is

From 80b759b0939b9b2956cfd4902b5ea7982c2b5d0a Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Tue, 1 Nov 2011 20:27:19 +0100
Subject: [PATCH 21/39] Fix style nit from brendandahl

---
 src/core.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/core.js b/src/core.js
index 492f36927..404d601da 100644
--- a/src/core.js
+++ b/src/core.js
@@ -545,7 +545,7 @@ var PDFDoc = (function pdfDoc() {
           case 'JpegStream':
             var IR = data[2];
             new JpegImage(id, IR, this.objs);
-          break;
+            break;
           case 'Font':
             var name = data[2];
             var file = data[3];
@@ -575,7 +575,7 @@ var PDFDoc = (function pdfDoc() {
               file: file,
               properties: properties
             });
-          break;
+            break;
           default:
             throw 'Got unkown object type ' + type;
         }

From d9d2ab4c8e2e78cde7c2603522b1d20af793d8c7 Mon Sep 17 00:00:00 2001
From: Julian Viereck <julian.viereck@gmail.com>
Date: Thu, 3 Nov 2011 15:30:53 +0100
Subject: [PATCH 22/39] Rename processorHandler to messageHandler

---
 src/core.js   | 30 +++++++++++++++---------------
 src/worker.js |  4 ++--
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/core.js b/src/core.js
index 404d601da..ddf1cebbe 100644
--- a/src/core.js
+++ b/src/core.js
@@ -484,22 +484,22 @@ var PDFDoc = (function pdfDoc() {
 
       var worker = new Worker(workerSrc);
 
-      var processorHandler = new MessageHandler('main', worker);
+      var messageHandler = new MessageHandler('main', worker);
 
       // Tell the worker the file it was created from.
-      processorHandler.send('workerSrc', workerSrc);
+      messageHandler.send('workerSrc', workerSrc);
 
-      processorHandler.on('test', function pdfDocTest(supportTypedArray) {
+      messageHandler.on('test', function pdfDocTest(supportTypedArray) {
         if (supportTypedArray) {
           this.worker = worker;
-          this.setupProcessorHandler(processorHandler);
+          this.setupMessageHandler(messageHandler);
         } else {
           this.setupFakeWorker();
         }
       }.bind(this));
 
       var testObj = new Uint8Array(1);
-      processorHandler.send('test', testObj);
+      messageHandler.send('test', testObj);
     } else {
       this.setupFakeWorker();
     }
@@ -517,19 +517,19 @@ var PDFDoc = (function pdfDoc() {
         terminate: function pdfDocTerminate() {}
       };
 
-      var processorHandler = new MessageHandler('main', fakeWorker);
-      this.setupProcessorHandler(processorHandler);
+      var messageHandler = new MessageHandler('main', fakeWorker);
+      this.setupMessageHandler(messageHandler);
 
       // If the main thread is our worker, setup the handling for the messages
       // the main thread sends to it self.
-      WorkerProcessorHandler.setup(processorHandler);
+      WorkerMessageHandler.setup(messageHandler);
     },
 
 
-    setupProcessorHandler: function(processorHandler) {
-      this.processorHandler = processorHandler;
+    setupMessageHandler: function(messageHandler) {
+      this.messageHandler = messageHandler;
 
-      processorHandler.on('page', function pdfDocPage(data) {
+      messageHandler.on('page', function pdfDocPage(data) {
         var pageNum = data.pageNum;
         var page = this.pageCache[pageNum];
         var depFonts = data.depFonts;
@@ -537,7 +537,7 @@ var PDFDoc = (function pdfDoc() {
         page.startRenderingFromIRQueue(data.IRQueue, depFonts);
       }, this);
 
-      processorHandler.on('obj', function pdfDocObj(data) {
+      messageHandler.on('obj', function pdfDocObj(data) {
         var id = data[0];
         var type = data[1];
 
@@ -581,7 +581,7 @@ var PDFDoc = (function pdfDoc() {
         }
       }, this);
 
-      processorHandler.on('font_ready', function pdfDocFontReady(data) {
+      messageHandler.on('font_ready', function pdfDocFontReady(data) {
         var id = data[0];
         var font = new FontShape(data[1]);
 
@@ -594,7 +594,7 @@ var PDFDoc = (function pdfDoc() {
       }.bind(this));
 
       setTimeout(function pdfDocFontReadySetTimeout() {
-        processorHandler.send('doc', this.data);
+        messageHandler.send('doc', this.data);
         this.workerReadyPromise.resolve(true);
       }.bind(this));
     },
@@ -606,7 +606,7 @@ var PDFDoc = (function pdfDoc() {
     startRendering: function pdfDocStartRendering(page) {
       // The worker might not be ready to receive the page request yet.
       this.workerReadyPromise.then(function pdfDocStartRenderingThen() {
-        this.processorHandler.send('page_request', page.pageNumber + 1);
+        this.messageHandler.send('page_request', page.pageNumber + 1);
       }.bind(this));
     },
 
diff --git a/src/worker.js b/src/worker.js
index 45a76e147..b6ea68741 100644
--- a/src/worker.js
+++ b/src/worker.js
@@ -43,7 +43,7 @@ MessageHandler.prototype = {
   }
 };
 
-var WorkerProcessorHandler = {
+var WorkerMessageHandler = {
   setup: function wphSetup(handler) {
     var pdfDoc = null;
 
@@ -188,6 +188,6 @@ if (typeof window === 'undefined') {
   globalScope.console = workerConsole;
 
   var handler = new MessageHandler('worker_processor', this);
-  WorkerProcessorHandler.setup(handler);
+  WorkerMessageHandler.setup(handler);
 }
 

From 6b5d5d85188ab874e5fc7cc6708b9d03c88b2c82 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Thu, 3 Nov 2011 16:16:21 -0400
Subject: [PATCH 23/39] Updated external link

---
 test/pdfs/cable.pdf.link | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/test/pdfs/cable.pdf.link b/test/pdfs/cable.pdf.link
index 9cf92a5b8..ea9270592 100644
--- a/test/pdfs/cable.pdf.link
+++ b/test/pdfs/cable.pdf.link
@@ -1 +1,2 @@
-http://www.wrapon.com/docs/PIPEHEATCABLE.PDF
+https://wrap-on.com/docs/PIPEHEATCABLE.PDF
+

From 7bb9f74fa290641c2eb134076f683b4d492fc909 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Thu, 3 Nov 2011 16:29:08 -0400
Subject: [PATCH 24/39] nit

---
 test/pdfs/cable.pdf.link | 1 -
 1 file changed, 1 deletion(-)

diff --git a/test/pdfs/cable.pdf.link b/test/pdfs/cable.pdf.link
index ea9270592..671f06166 100644
--- a/test/pdfs/cable.pdf.link
+++ b/test/pdfs/cable.pdf.link
@@ -1,2 +1 @@
 https://wrap-on.com/docs/PIPEHEATCABLE.PDF
-

From 33af12abd0e1f1ac54bf4f8776e1dca69a5c2a95 Mon Sep 17 00:00:00 2001
From: Kalervo Kujala <kkujala@com>
Date: Thu, 3 Nov 2011 23:26:58 +0200
Subject: [PATCH 25/39] Fix jslint warnings.

---
 src/canvas.js | 4 ++--
 src/core.js   | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/canvas.js b/src/canvas.js
index 474cc250f..686430cc1 100644
--- a/src/canvas.js
+++ b/src/canvas.js
@@ -24,9 +24,9 @@ var CanvasExtraState = (function canvasExtraState() {
     this.wordSpacing = 0;
     this.textHScale = 1;
     // Color spaces
-    this.fillColorSpace = new DeviceGrayCS;
+    this.fillColorSpace = new DeviceGrayCS();
     this.fillColorSpaceObj = null;
-    this.strokeColorSpace = new DeviceGrayCS;
+    this.strokeColorSpace = new DeviceGrayCS();
     this.strokeColorSpaceObj = null;
     this.fillColorObj = null;
     this.strokeColorObj = null;
diff --git a/src/core.js b/src/core.js
index 2bc4c50aa..0e6f13e97 100644
--- a/src/core.js
+++ b/src/core.js
@@ -199,8 +199,8 @@ var Page = (function pagePage() {
       var pe = this.pe = new PartialEvaluator(
                                 xref, handler, 'p' + this.pageNumber + '_');
       var IRQueue = {};
-      return this.IRQueue = pe.getIRQueue(
-                                content, resources, IRQueue, dependency);
+      return (this.IRQueue = pe.getIRQueue(content, resources, IRQueue,
+                                           dependency));
     },
 
     ensureFonts: function pageEnsureFonts(fonts, callback) {
@@ -598,7 +598,7 @@ var PDFDoc = (function pdfDoc() {
       // to the CanvasGraphics and so on.
       page.objs = this.objs;
       page.pdf = this;
-      return this.pageCache[n] = page;
+      return (this.pageCache[n] = page);
     },
 
     destroy: function pdfDocDestroy() {

From 2d51ee8fcd0e02f3d51044b36f167f34486f0942 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Thu, 3 Nov 2011 19:01:10 -0400
Subject: [PATCH 26/39] Fixing ref/ update

---
 test/test.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/test/test.py b/test/test.py
index 66e1acd31..e3aefcfb5 100644
--- a/test/test.py
+++ b/test/test.py
@@ -506,9 +506,7 @@ def maybeUpdateRefImages(options, browser):
             print '  Yes!  The references in tmp/ can be synced with ref/.'
             if options.reftest:                                                                                                              
                 startReftest(browser, options)
-            if options.noPrompts or not prompt('Would you like to update the master copy in ref/?'):
-                print '  OK, not updating.'
-            else:
+            if options.noPrompts or prompt('Would you like to update the master copy in ref/?'):
                 sys.stdout.write('  Updating ref/ ... ')
 
                 # XXX unclear what to do on errors here ...
@@ -517,6 +515,8 @@ def maybeUpdateRefImages(options, browser):
                 subprocess.check_call(( 'rsync', '-arv', 'tmp/', 'ref/' ))
 
                 print 'done'
+            else:
+                print '  OK, not updating.'
 
 def startReftest(browser, options):
     url = "http://%s:%s" % (SERVER_HOST, options.port)

From 989ad4952f7822c9853f6125a58021d5d73b3108 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Thu, 3 Nov 2011 19:50:28 -0400
Subject: [PATCH 27/39] Quiet rsync

---
 test/test.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/test.py b/test/test.py
index e3aefcfb5..7d16ea796 100644
--- a/test/test.py
+++ b/test/test.py
@@ -512,7 +512,7 @@ def maybeUpdateRefImages(options, browser):
                 # XXX unclear what to do on errors here ...
                 # NB: do *NOT* pass --delete to rsync.  That breaks this
                 # entire scheme.
-                subprocess.check_call(( 'rsync', '-arv', 'tmp/', 'ref/' ))
+                subprocess.check_call(( 'rsync', '-arvq', 'tmp/', 'ref/' ))
 
                 print 'done'
             else:

From c4ffbdb951969a0d9e12bf5f4e1de4cddcb812cd Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Fri, 4 Nov 2011 09:14:52 -0700
Subject: [PATCH 28/39] Hash files to make sure they haven't changed.

---
 test/test.py            | 27 ++++++++++++++++++++++++++-
 test/test_manifest.json | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/test/test.py b/test/test.py
index 7d16ea796..bce5ae8f3 100644
--- a/test/test.py
+++ b/test/test.py
@@ -1,4 +1,4 @@
-import json, platform, os, shutil, sys, subprocess, tempfile, threading, time, urllib, urllib2
+import json, platform, os, shutil, sys, subprocess, tempfile, threading, time, urllib, urllib2, hashlib
 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 import SocketServer
 from optparse import OptionParser
@@ -316,6 +316,28 @@ def downloadLinkedPDFs(manifestList):
 
             print 'done'
 
+def verifyPDFs(manifestList):
+    error = False
+    for item in manifestList:
+        f = item['file']
+        if os.access(f, os.R_OK):
+            fileMd5 = hashlib.md5(open(f).read()).hexdigest()
+            if 'md5' not in item:
+                print 'ERROR: Missing md5 for file "' + f + '".',
+                print 'Hash for current file is "' + fileMd5 + '"'
+                error = True
+                continue
+            md5 = item['md5']
+            if fileMd5 != md5:
+                print 'ERROR: MD5 of file "' + f + '" does not match file.',
+                print 'Expected "' + md5 + '" computed "' + fileMd5 + '"'
+                error = True
+                continue
+        else:
+            print 'ERROR: Unable to open file for reading "' + f + '".'
+            error = True
+    return not error
+
 def setUp(options):
     # Only serve files from a pdf.js clone
     assert not ANAL or os.path.isfile('../src/pdf.js') and os.path.isdir('../.git')
@@ -342,6 +364,9 @@ def setUp(options):
 
     downloadLinkedPDFs(manifestList)
 
+    if not verifyPDFs(manifestList):
+        raise Exception('ERROR: failed to verify pdfs.')
+
     for b in testBrowsers:
         State.taskResults[b.name] = { }
         for item in manifestList:
diff --git a/test/test_manifest.json b/test/test_manifest.json
index 25f609e8d..c3ebe6c05 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -1,151 +1,178 @@
 [
     {  "id": "tracemonkey-eq",
        "file": "pdfs/tracemonkey.pdf",
+       "md5": "9a192d8b1a7dc652a19835f6f08098bd",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "tracemonkey-fbf",
        "file": "pdfs/tracemonkey.pdf",
+       "md5": "9a192d8b1a7dc652a19835f6f08098bd",
        "rounds": 2,
        "type": "fbf"
     },
     {  "id": "html5-canvas-cheat-sheet-load",
        "file": "pdfs/canvas.pdf",
+       "md5": "59510028561daf62e00bf9f6f066b033",
        "rounds": 1,
        "type": "load"
     },
     {  "id": "intelisa-load",
        "file": "pdfs/intelisa.pdf",
+       "md5": "f3ed5487d1afa34d8b77c0c734a95c79",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "pdfspec-load",
        "file": "pdfs/pdf.pdf",
+       "md5": "dbdb23c939d2be09b43126c3c56060c7",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "shavian-load",
        "file": "pdfs/shavian.pdf",
+       "md5": "4fabf0a03e82693007435020bc446f9b",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "sizes",
        "file": "pdfs/sizes.pdf",
+       "md5": "c101ba7b44aee36048e1ac7b98f302ea",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "openweb-cover",
        "file": "pdfs/openweb_tm-PRINT.pdf",
+       "md5": "53f611dfc19ddfb50554c21c4af465c0",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "plusminus",
        "file": "pdfs/Test-plusminus.pdf",
+       "md5": "1ec7ade5b95ac9aaba3a618af28d34c7",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "openoffice-pdf",
        "file": "pdfs/DiwanProfile.pdf",
+       "md5": "55d0c6a1a6d26c9ec9dcecaa7a471e0e",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "openofficecidtruetype-pdf",
        "file": "pdfs/arial_unicode_en_cidfont.pdf",
+       "md5": "03591cdf20214fb0b2dd5e5c3dd32d8c",
        "rounds": 1,
        "type": "load"
     },
     {  "id": "openofficearabiccidtruetype-pdf",
        "file": "pdfs/arial_unicode_ab_cidfont.pdf",
+       "md5": "35090fa7d29e7196ae3421812e554988",
        "rounds": 1,
        "type": "load"
     },
     {  "id": "arabiccidtruetype-pdf",
        "file": "pdfs/ArabicCIDTrueType.pdf",
+       "md5": "d66dbd18bdb572d3ac8b88b32de2ece6",
        "rounds": 1,
        "type": "load"
     },
     {  "id": "complexttffont-pdf",
        "file": "pdfs/complex_ttf_font.pdf",
+       "md5": "76de93f9116b01b693bf8583b3e76d91",
        "rounds": 1,
        "type": "load"
     },
     {  "id": "thuluthfont-pdf",
        "file": "pdfs/ThuluthFeatures.pdf",
+       "md5": "b7e18bf7a3d6a9c82aefa12d721072fc",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "wnv_chinese-pdf",
        "file": "pdfs/wnv_chinese.pdf",
+       "md5": "db682638e68391125e8982d3c984841e",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "i9-pdf",
        "file": "pdfs/i9.pdf",
+       "md5": "ba7cd54fdff083bb389295bc0415f6c5",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "hmm-pdf",
        "file": "pdfs/hmm.pdf",
+       "md5": "e08467e60101ee5f4a59716e86db6dc9",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "rotation",
        "file": "pdfs/rotation.pdf",
+       "md5": "4fb25ada00ce7528569d9791c14decf5",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "ecma262-pdf",
        "file": "pdfs/ecma262.pdf",
+       "md5": "763ead98f535578842891e5574e0af0f",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "jai-pdf",
        "file": "pdfs/jai.pdf",
+       "md5": "1f5dd128c3757420a881a155f2f8ace3",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "cable",
        "file": "pdfs/cable.pdf",
+       "md5": "09a41b9a759d60c698228224ab85b46d",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "pdkids",
        "file": "pdfs/pdkids.pdf",
+       "md5": "278982bf016dbe46d2066f9245d9b3e6",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "artofwar",
        "file": "pdfs/artofwar.pdf",
+       "md5": "7bdd51c327b74f1f7abdd90eedb2f912",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "wdsg_fitc",
        "file": "pdfs/wdsg_fitc.pdf",
+       "md5": "5bb1c2b83705d4cdfc43197ee74f07f9",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "unix01",
        "file": "pdfs/unix01.pdf",
+       "md5": "2742999f0bf9b9c035dbb0736096e220",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "fit11-talk",
        "file": "pdfs/fit11-talk.pdf",
+       "md5": "eb7b224107205db4fea9f7df0185f77d",
        "link": true,
        "rounds": 1,
        "skipPages": [12,31],
@@ -153,48 +180,56 @@
     },
     {  "id": "fips197",
        "file": "pdfs/fips197.pdf",
+       "md5": "374800cf78ce4b4abd02cd10a856b57f",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "txt2pdf",
        "file": "pdfs/txt2pdf.pdf",
+       "md5": "02cefa0f5e8d96313bb05163b2f88c8c",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "f1040",
        "file": "pdfs/f1040.pdf",
+       "md5": "7323b50c6d28d959b8b4b92c469b2469",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "hudsonsurvey",
        "file": "pdfs/hudsonsurvey.pdf",
+       "md5": "bf0e6576a7b6c2fe7485bce1b78e006f",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "extgstate",
        "file": "pdfs/extgstate.pdf",
+       "md5": "001bb4ec04463a01d93aad748361f049",
        "link": false,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "usmanm-bad",
        "file": "pdfs/usmanm-bad.pdf",
+       "md5": "38afb822433aaf07fc8f54807cd4f61a",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "vesta-bad",
        "file": "pdfs/vesta.pdf",
+       "md5": "0afebc109b7c17b95619ea3fab5eafe6",
        "link": true,
        "rounds": 1,
        "type": "load"
     },
     {  "id": "ibwa-bad",
        "file": "pdfs/ibwa-bad.pdf",
+       "md5": "6ca059d32b74ac2688ae06f727fee755",
        "link": true,
        "rounds": 1,
        "skipPages": [ 16 ],
@@ -202,29 +237,34 @@
     },
     {  "id": "tcpdf_033",
        "file": "pdfs/tcpdf_033.pdf",
+       "md5": "de7a4a8b1b476b579df606c2d6e7ed05",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "pal-o47",
        "file": "pdfs/pal-o47.pdf",
+       "md5": "81ae15e539e89f0f0b41169d923b611b",
        "link": true,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "simpletype3font",
        "file": "pdfs/simpletype3font.pdf",
+       "md5": "b374c7543920840c61999e9e86939f99",
        "link": false,
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "close-path-bug",
        "file": "pdfs/close-path-bug.pdf",
+       "md5": "48dd17ef58393857d2d038d33699cac5",
        "rounds": 1,
        "type": "eq"
     },
     {  "id": "alphatrans",
        "file": "pdfs/alphatrans.pdf",
+       "md5": "5ca2d3da0c5f20b3a5a14e895ad24b65",
        "link": false,
        "rounds": 1,
        "type": "eq"

From a8c94ede1f24035cbe356823b5bd28fa15d1fe12 Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Fri, 4 Nov 2011 10:55:00 -0700
Subject: [PATCH 29/39] Updating md5 for tcpdf.

---
 test/test_manifest.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/test_manifest.json b/test/test_manifest.json
index c3ebe6c05..8085506a2 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -237,7 +237,7 @@
     },
     {  "id": "tcpdf_033",
        "file": "pdfs/tcpdf_033.pdf",
-       "md5": "de7a4a8b1b476b579df606c2d6e7ed05",
+       "md5": "861294df58d185aae80919173f2732ff",
        "link": true,
        "rounds": 1,
        "type": "eq"

From d22885a97c62e08ee9f6f7e2c89b839054a19c3a Mon Sep 17 00:00:00 2001
From: Harald Kirschner <hkirschner@mozilla.com>
Date: Fri, 4 Nov 2011 13:23:42 -0700
Subject: [PATCH 30/39]  - FIX: Removed unnecessary .bind in worker_loader.js
 that broke Safari

---
 src/worker_loader.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/worker_loader.js b/src/worker_loader.js
index 8d342d116..cb0a91071 100644
--- a/src/worker_loader.js
+++ b/src/worker_loader.js
@@ -49,4 +49,4 @@ function onMessageLoader(evt) {
   }
 }
 
-this.onmessage = onMessageLoader.bind(this);
+this.onmessage = onMessageLoader;

From ed33d13de57716c49080e286c45031abac2b4967 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 16:30:05 -0400
Subject: [PATCH 31/39] Fixes Makefile for web deployment

---
 Makefile | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index 3484ab414..35e8675c2 100644
--- a/Makefile
+++ b/Makefile
@@ -159,7 +159,7 @@ web: | production extension compiler pages-repo \
 # everything with data from the master repo. The 'make web' target
 # then uses 'git add -A' to track additions, modifications, moves,
 # and deletions.
-pages-repo: | $(BUILD_DIR)
+pages-repo: | $(BUILD_DIR) 
 	@if [ ! -d "$(GH_PAGES)" ]; then \
 	git clone -b gh-pages $(REPO) $(GH_PAGES); \
 	rm -rf $(GH_PAGES)/*; \
@@ -169,8 +169,9 @@ pages-repo: | $(BUILD_DIR)
 	@mkdir -p $(GH_PAGES)/build;
 	@mkdir -p $(GH_PAGES)/$(EXTENSION_SRC);
 
-$(GH_PAGES)/$(BUILD_DIR)/%.js: build/%.js
-	@cp $< $@
+$(GH_PAGES)/$(BUILD_DIR)/pdf.js: 
+	@mkdir -p $(GH_PAGES)/$(BUILD_DIR)
+	@cp build/pdf.js $(GH_PAGES)/$(BUILD_DIR)
 
 $(GH_PAGES)/web/%: web/%
 	@cp $< $@

From 57ecc46b028bbe4c58ea42a54f2b66e72816bf5b Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 16:37:33 -0400
Subject: [PATCH 32/39] nit

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 35e8675c2..110709906 100644
--- a/Makefile
+++ b/Makefile
@@ -159,7 +159,7 @@ web: | production extension compiler pages-repo \
 # everything with data from the master repo. The 'make web' target
 # then uses 'git add -A' to track additions, modifications, moves,
 # and deletions.
-pages-repo: | $(BUILD_DIR) 
+pages-repo: | $(BUILD_DIR)
 	@if [ ! -d "$(GH_PAGES)" ]; then \
 	git clone -b gh-pages $(REPO) $(GH_PAGES); \
 	rm -rf $(GH_PAGES)/*; \

From e58c2ab99517ec71a8bf36cf5669a25809e88d9a Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 17:18:23 -0400
Subject: [PATCH 33/39] Fixing again

---
 Makefile | 24 +++++-------------------
 1 file changed, 5 insertions(+), 19 deletions(-)

diff --git a/Makefile b/Makefile
index 110709906..c642f1eb1 100644
--- a/Makefile
+++ b/Makefile
@@ -139,12 +139,11 @@ lint:
 # TODO: Use the Closure compiler to optimize the pdf.js files.
 #
 GH_PAGES = $(BUILD_DIR)/gh-pages
-web: | production extension compiler pages-repo \
-	$(addprefix $(GH_PAGES)/, $(BUILD_TARGET)) \
-	$(addprefix $(GH_PAGES)/, $(wildcard web/*.*)) \
-	$(addprefix $(GH_PAGES)/, $(wildcard web/images/*.*)) \
-	$(addprefix $(GH_PAGES)/, $(wildcard $(EXTENSION_SRC)/*.xpi))
-
+web: | production extension compiler pages-repo
+	@cp $(BUILD_TARGET) $(GH_PAGES)/$(BUILD_TARGET)
+	@cp -R web/* $(GH_PAGES)/web
+	@cp web/images/* $(GH_PAGES)/web/images
+	@cp $(EXTENSION_SRC)/*.xpi $(GH_PAGES)/$(EXTENSION_SRC)
 	@cp $(GH_PAGES)/web/index.html.template $(GH_PAGES)/index.html;
 	@mv -f $(GH_PAGES)/web/viewer-production.html $(GH_PAGES)/web/viewer.html;
 	@cd $(GH_PAGES); git add -A;
@@ -169,19 +168,6 @@ pages-repo: | $(BUILD_DIR)
 	@mkdir -p $(GH_PAGES)/build;
 	@mkdir -p $(GH_PAGES)/$(EXTENSION_SRC);
 
-$(GH_PAGES)/$(BUILD_DIR)/pdf.js: 
-	@mkdir -p $(GH_PAGES)/$(BUILD_DIR)
-	@cp build/pdf.js $(GH_PAGES)/$(BUILD_DIR)
-
-$(GH_PAGES)/web/%: web/%
-	@cp $< $@
-
-$(GH_PAGES)/web/images/%: web/images/%
-	@cp $< $@
-
-$(GH_PAGES)/$(EXTENSION_SRC)/%: $(EXTENSION_SRC)/%
-	@cp -R $< $@
-
 # # make compiler
 # #
 # # This target downloads the Closure compiler, and places it in the

From 1074478274d3bd86efc285a6bef3eb2d3f3ee219 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 18:57:01 -0300
Subject: [PATCH 34/39] Dummy commit to test post-receive hook

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 8414ad2a9..66be3cd3c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # pdf.js
-
+ 
 
 
 ## Overview

From ba54b641894340677f8cde7710f2a9c63eed2525 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 19:15:30 -0300
Subject: [PATCH 35/39] Dummy commit to test post-receive hook (again)

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 66be3cd3c..fc62700f4 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # pdf.js
  
-
+ 
 
 ## Overview
 

From 8a6ec5f5e073ade9ea73939432ff231808a0da02 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 19:41:50 -0300
Subject: [PATCH 36/39] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index fc62700f4..66be3cd3c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # pdf.js
  
- 
+
 
 ## Overview
 

From f0f5ebc7b5109917f236a64182a5af68e2f6f6c5 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Fri, 4 Nov 2011 19:45:05 -0300
Subject: [PATCH 37/39] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 66be3cd3c..8414ad2a9 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # pdf.js
- 
+
 
 
 ## Overview

From feb621380da9cdc6971f763989bb17378c8ded19 Mon Sep 17 00:00:00 2001
From: Artur Adib <arturadib@gmail.com>
Date: Sat, 5 Nov 2011 14:42:50 -0400
Subject: [PATCH 38/39] Disabling workers until localhost fix lands in FF

---
 src/core.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/core.js b/src/core.js
index ed16e1a42..9426f5d4d 100644
--- a/src/core.js
+++ b/src/core.js
@@ -15,6 +15,10 @@ if (!globalScope.PDFJS) {
   globalScope.PDFJS = {};
 }
 
+// Temporarily disabling workers until 'localhost' FF bugfix lands:
+// https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+globalScope.PDFJS.disableWorker = true;
+
 // getPdf()
 // Convenience function to perform binary Ajax GET
 // Usage: getPdf('http://...', callback)

From cac9044161ce9f3deee4fe230d932400b2ae45ac Mon Sep 17 00:00:00 2001
From: Kalervo Kujala <kkujala@com>
Date: Sat, 5 Nov 2011 22:13:16 +0200
Subject: [PATCH 39/39] Refactor colorspace.js and fix jslint warnings.

---
 src/colorspace.js | 90 ++++++++++++++++++++---------------------------
 1 file changed, 39 insertions(+), 51 deletions(-)

diff --git a/src/colorspace.js b/src/colorspace.js
index 6bfad4c39..946a1bdf4 100644
--- a/src/colorspace.js
+++ b/src/colorspace.js
@@ -23,7 +23,7 @@ var ColorSpace = (function colorSpaceColorSpace() {
   };
 
   constructor.parse = function colorSpaceParse(cs, xref, res) {
-    var IR = constructor.parseToIR(cs, xref, res, true);
+    var IR = constructor.parseToIR(cs, xref, res);
     if (IR instanceof SeparationCS)
       return IR;
 
@@ -31,12 +31,7 @@ var ColorSpace = (function colorSpaceColorSpace() {
   };
 
   constructor.fromIR = function colorSpaceFromIR(IR) {
-    var name;
-    if (isArray(IR)) {
-      name = IR[0];
-    } else {
-      name = IR;
-    }
+    var name = isArray(IR) ? IR[0] : IR;
 
     switch (name) {
       case 'DeviceGrayCS':
@@ -46,33 +41,28 @@ var ColorSpace = (function colorSpaceColorSpace() {
       case 'DeviceCmykCS':
         return new DeviceCmykCS();
       case 'PatternCS':
-        var baseCS = IR[1];
-        if (baseCS == null) {
-          return new PatternCS(null);
-        } else {
-          return new PatternCS(ColorSpace.fromIR(baseCS));
-        }
+        var basePatternCS = IR[1];
+        if (basePatternCS)
+          basePatternCS = ColorSpace.fromIR(basePatternCS);
+        return new PatternCS(basePatternCS);
       case 'IndexedCS':
-        var baseCS = IR[1];
+        var baseIndexedCS = IR[1];
         var hiVal = IR[2];
         var lookup = IR[3];
-        return new IndexedCS(ColorSpace.fromIR(baseCS), hiVal, lookup);
+        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
       case 'SeparationCS':
         var alt = IR[1];
         var tintFnIR = IR[2];
 
-        return new SeparationCS(
-          ColorSpace.fromIR(alt),
-          PDFFunction.fromIR(tintFnIR)
-        );
+        return new SeparationCS(ColorSpace.fromIR(alt),
+                                PDFFunction.fromIR(tintFnIR));
       default:
         error('Unkown name ' + name);
     }
     return null;
-  }
+  };
 
-  constructor.parseToIR = function colorSpaceParseToIR(cs, xref, res,
-                                                       parseOnly) {
+  constructor.parseToIR = function colorSpaceParseToIR(cs, xref, res) {
     if (isName(cs)) {
       var colorSpaces = xref.fetchIfRef(res.get('ColorSpace'));
       if (isDict(colorSpaces)) {
@@ -83,9 +73,10 @@ var ColorSpace = (function colorSpaceColorSpace() {
     }
 
     cs = xref.fetchIfRef(cs);
+    var mode;
 
     if (isName(cs)) {
-      var mode = cs.name;
+      mode = cs.name;
       this.mode = mode;
 
       switch (mode) {
@@ -104,7 +95,7 @@ var ColorSpace = (function colorSpaceColorSpace() {
           error('unrecognized colorspace ' + mode);
       }
     } else if (isArray(cs)) {
-      var mode = cs[0].name;
+      mode = cs[0].name;
       this.mode = mode;
 
       switch (mode) {
@@ -133,15 +124,15 @@ var ColorSpace = (function colorSpaceColorSpace() {
             return 'DeviceCmykCS';
           break;
         case 'Pattern':
-          var baseCS = cs[1];
-          if (baseCS)
-            baseCS = ColorSpace.parseToIR(baseCS, xref, res);
-          return ['PatternCS', baseCS];
+          var basePatternCS = cs[1];
+          if (basePatternCS)
+            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+          return ['PatternCS', basePatternCS];
         case 'Indexed':
-          var baseCS = ColorSpace.parseToIR(cs[1], xref, res);
+          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
           var hiVal = cs[2] + 1;
           var lookup = xref.fetchIfRef(cs[3]);
-          return ['IndexedCS', baseCS, hiVal, lookup];
+          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
         case 'Separation':
           var alt = ColorSpace.parseToIR(cs[2], xref, res);
           var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
@@ -165,7 +156,6 @@ var SeparationCS = (function separationCS() {
     this.name = 'Separation';
     this.numComps = 1;
     this.defaultColor = [1];
-
     this.base = base;
     this.tintFn = tintFn;
   }
@@ -179,12 +169,11 @@ var SeparationCS = (function separationCS() {
       var tintFn = this.tintFn;
       var base = this.base;
       var scale = 1 / ((1 << bits) - 1);
-
       var length = input.length;
       var pos = 0;
-
       var numComps = base.numComps;
       var baseBuf = new Uint8Array(numComps * length);
+
       for (var i = 0; i < length; ++i) {
         var scaled = input[i] * scale;
         var tinted = tintFn([scaled]);
@@ -213,13 +202,13 @@ var IndexedCS = (function indexedCS() {
     this.name = 'Indexed';
     this.numComps = 1;
     this.defaultColor = [0];
-
     this.base = base;
-    var baseNumComps = base.numComps;
     this.highVal = highVal;
 
+    var baseNumComps = base.numComps;
     var length = baseNumComps * highVal;
     var lookupArray = new Uint8Array(length);
+
     if (isStream(lookup)) {
       var bytes = lookup.getBytes(length);
       lookupArray.set(bytes);
@@ -235,7 +224,6 @@ var IndexedCS = (function indexedCS() {
   constructor.prototype = {
     getRgb: function indexcs_getRgb(color) {
       var numComps = this.base.numComps;
-
       var start = color[0] * numComps;
       var c = [];
 
@@ -249,9 +237,9 @@ var IndexedCS = (function indexedCS() {
       var numComps = base.numComps;
       var lookup = this.lookup;
       var length = input.length;
-
       var baseBuf = new Uint8Array(length * numComps);
       var baseBufPos = 0;
+
       for (var i = 0; i < length; ++i) {
         var lookupPos = input[i] * numComps;
         for (var j = 0; j < numComps; ++j) {
@@ -294,7 +282,7 @@ var DeviceGrayCS = (function deviceGrayCS() {
 })();
 
 var DeviceRgbCS = (function deviceRgbCS() {
-  function constructor(bits) {
+  function constructor() {
     this.name = 'DeviceRGB';
     this.numComps = 3;
     this.defaultColor = [0, 0, 0];
@@ -337,41 +325,41 @@ var DeviceCmykCS = (function deviceCmykCS() {
       r += 0.1373 * x;
       g += 0.1216 * x;
       b += 0.1255 * x;
-      x = c1 * m1 * y * k1; // 0 0 1 0
+      x = c1 * m1 * y * k1;  // 0 0 1 0
       r += x;
       g += 0.9490 * x;
-      x = c1 * m1 * y * k;  // 0 0 1 1
+      x = c1 * m1 * y * k;   // 0 0 1 1
       r += 0.1098 * x;
       g += 0.1020 * x;
-      x = c1 * m * y1 * k1; // 0 1 0 0
+      x = c1 * m * y1 * k1;  // 0 1 0 0
       r += 0.9255 * x;
       b += 0.5490 * x;
-      x = c1 * m * y1 * k;  // 0 1 0 1
+      x = c1 * m * y1 * k;   // 0 1 0 1
       r += 0.1412 * x;
-      x = c1 * m * y * k1; // 0 1 1 0
+      x = c1 * m * y * k1;   // 0 1 1 0
       r += 0.9294 * x;
       g += 0.1098 * x;
       b += 0.1412 * x;
-      x = c1 * m * y * k;  // 0 1 1 1
+      x = c1 * m * y * k;    // 0 1 1 1
       r += 0.1333 * x;
-      x = c * m1 * y1 * k1; // 1 0 0 0
+      x = c * m1 * y1 * k1;  // 1 0 0 0
       g += 0.6784 * x;
       b += 0.9373 * x;
-      x = c * m1 * y1 * k;  // 1 0 0 1
+      x = c * m1 * y1 * k;   // 1 0 0 1
       g += 0.0588 * x;
       b += 0.1412 * x;
-      x = c * m1 * y * k1; // 1 0 1 0
+      x = c * m1 * y * k1;   // 1 0 1 0
       g += 0.6510 * x;
       b += 0.3137 * x;
-      x = c * m1 * y * k;  // 1 0 1 1
+      x = c * m1 * y * k;    // 1 0 1 1
       g += 0.0745 * x;
-      x = c * m * y1 * k1; // 1 1 0 0
+      x = c * m * y1 * k1;   // 1 1 0 0
       r += 0.1804 * x;
       g += 0.1922 * x;
       b += 0.5725 * x;
-      x = c * m * y1 * k;  // 1 1 0 1
+      x = c * m * y1 * k;    // 1 1 0 1
       b += 0.0078 * x;
-      x = c * m * y * k1; // 1 1 1 0
+      x = c * m * y * k1;    // 1 1 1 0
       r += 0.2118 * x;
       g += 0.2119 * x;
       b += 0.2235 * x;