From dddcb9c91bf00f4ce94a6be281f0de7470e7fe51 Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Wed, 4 Jan 2012 16:13:53 -0800
Subject: [PATCH 1/2] Add error backs for promises.

---
 src/core.js | 30 +++++++++++++++++++-----------
 src/util.js | 30 +++++++++++++++++++++++++++++-
 2 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/src/core.js b/src/core.js
index 8b5fbea75..f262cde45 100644
--- a/src/core.js
+++ b/src/core.js
@@ -398,17 +398,25 @@ var Page = (function PageClosure() {
       }
 
       // Once the IRQueue and fonts are loaded, perform the actual rendering.
-      this.displayReadyPromise.then(function pageDisplayReadyPromise() {
-        var gfx = new CanvasGraphics(ctx, this.objs, textLayer);
-        try {
-          this.display(gfx, callback);
-        } catch (e) {
-          if (self.callback)
-            self.callback(e);
+      this.displayReadyPromise.then(
+        function pageDisplayReadyPromise() {
+          var gfx = new CanvasGraphics(ctx, this.objs, textLayer);
+          try {
+            this.display(gfx, callback);
+          } catch (e) {
+            if (callback)
+              callback(e);
+            else
+              throw e;
+          }
+        }.bind(this),
+        function pageDisplayReadPromiseError(reason) {
+          if (callback)
+            callback(reason);
           else
-            throw e;
+            throw reason;
         }
-      }.bind(this));
+      );
     }
   };
 
@@ -722,8 +730,8 @@ var PDFDoc = (function PDFDocClosure() {
 
       messageHandler.on('page_error', function pdfDocError(data) {
         var page = this.pageCache[data.pageNum];
-        if (page.callback)
-          page.callback(data.error);
+        if (page.displayReadyPromise) {
+          page.displayReadyPromise.reject(data.error);}
         else
           throw data.error;
       }, this);
diff --git a/src/util.js b/src/util.js
index 4d8918e48..99b422296 100644
--- a/src/util.js
+++ b/src/util.js
@@ -206,6 +206,8 @@ var Promise = (function PromiseClosure() {
    */
   function Promise(name, data) {
     this.name = name;
+    this.isRejected = false;
+    this.error = null;
     // If you build a promise and pass in some data it's already resolved.
     if (data != null) {
       this.isResolved = true;
@@ -216,6 +218,7 @@ var Promise = (function PromiseClosure() {
       this._data = EMPTY_PROMISE;
     }
     this.callbacks = [];
+    this.errbacks = [];
   };
   /**
    * Builds a promise that is resolved when all the passed in promises are
@@ -282,6 +285,9 @@ var Promise = (function PromiseClosure() {
       if (this.isResolved) {
         throw 'A Promise can be resolved only once ' + this.name;
       }
+      if (this.isRejected) {
+        throw 'The Promise was already rejected ' + this.name;
+      }
 
       this.isResolved = true;
       this.data = data || null;
@@ -292,7 +298,24 @@ var Promise = (function PromiseClosure() {
       }
     },
 
-    then: function promiseThen(callback) {
+    reject: function proimseReject(reason) {
+      if (this.isRejected) {
+        throw 'A Promise can be rejected only once ' + this.name;
+      }
+      if (this.isResolved) {
+        throw 'The Promise was already resolved ' + this.name;
+      }
+
+      this.isRejected = true;
+      this.error = reason || null;
+      var errbacks = this.errbacks;
+
+      for (var i = 0, ii = errbacks.length; i < ii; i++) {
+        errbacks[i].call(null, reason);
+      }
+    },
+
+    then: function promiseThen(callback, errback) {
       if (!callback) {
         throw 'Requiring callback' + this.name;
       }
@@ -301,8 +324,13 @@ var Promise = (function PromiseClosure() {
       if (this.isResolved) {
         var data = this.data;
         callback.call(null, data);
+      } else if (this.isRejected && errorback) {
+        var error = this.error;
+        errback.call(null, error);
       } else {
         this.callbacks.push(callback);
+        if (errback)
+          this.errbacks.push(errback);
       }
     }
   };

From 3154ec4e38796c38fd27848dbd13447b463f508c Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Wed, 4 Jan 2012 17:22:07 -0800
Subject: [PATCH 2/2] Fix bracket nit.

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

diff --git a/src/core.js b/src/core.js
index f262cde45..4cc5984e2 100644
--- a/src/core.js
+++ b/src/core.js
@@ -730,8 +730,8 @@ var PDFDoc = (function PDFDocClosure() {
 
       messageHandler.on('page_error', function pdfDocError(data) {
         var page = this.pageCache[data.pageNum];
-        if (page.displayReadyPromise) {
-          page.displayReadyPromise.reject(data.error);}
+        if (page.displayReadyPromise)
+          page.displayReadyPromise.reject(data.error);
         else
           throw data.error;
       }, this);