Revision: 5704
Author:   [email protected]
Date:     Wed Nov 26 21:58:20 2014 UTC
Log:      Use window.onerror for errors in XHR callbacks.
https://codereview.appspot.com/182850043

If the readystatechange callback of an XHR object throws an error, pass
it to window.onerror like for other asynchronous callbacks.

Also, extract the repeated pattern of setting up onerror handlers in
test-domado-events-guest.html.

[email protected]

https://code.google.com/p/google-caja/source/detail?r=5704

Modified:
 /trunk/src/com/google/caja/plugin/domado.js
 /trunk/tests/com/google/caja/plugin/test-domado-events-guest.html

=======================================
--- /trunk/src/com/google/caja/plugin/domado.js Tue Oct 21 20:54:06 2014 UTC
+++ /trunk/src/com/google/caja/plugin/domado.js Wed Nov 26 21:58:20 2014 UTC
@@ -929,7 +929,8 @@
       taming,
       xmlHttpRequestMaker,
       naiveUriPolicy,
-      getBaseURL) {
+      getBaseURL,
+      onerrorTarget) {
     // See http://www.w3.org/TR/XMLHttpRequest/

     // TODO(ihab.awad): Improve implementation (interleaving, memory leaks)
@@ -964,7 +965,12 @@
           var self = this;
           privates.feral.onreadystatechange = function(event) {
             var evt = { target: self };
-            return handler.call(void 0, evt);
+            try {
+              return handler.call(void 0, evt);
+            } catch (e) {
+              Domado_.handleUncaughtException(
+                  onerrorTarget, e, '<XMLHttpRequest callback>');
+            }
           };
           // Store for later direct invocation if need be
           privates.handler = handler;
@@ -6881,7 +6887,8 @@
                 window.ActiveXObject,
                 window.XDomainRequest),
             naiveUriPolicy,
-            function () { return domicile.pseudoLocation.href; }));
+            function () { return domicile.pseudoLocation.href; },
+            tameWindow));
       });


=======================================
--- /trunk/tests/com/google/caja/plugin/test-domado-events-guest.html Mon Oct 13 19:19:17 2014 UTC +++ /trunk/tests/com/google/caja/plugin/test-domado-events-guest.html Wed Nov 26 21:58:20 2014 UTC
@@ -14,6 +14,18 @@
  - limitations under the License.
 -->

+<script type="text/javascript">
+  function installOneShotOnerror(testId, expectedMessage) {
+    var savedOnerror = window.onerror;
+    window.onerror = function(message, url, line) {
+      assertEquals(expectedMessage, message);
+      assertTrue('window == ' + this, window == this);
+      window.onerror = savedOnerror;
+      pass(testId);
+    };
+  }
+</script>
+
 <div class="clickme testcontainer" id="testEventBubble">
   testEventBubble
   <input type="checkbox">
@@ -39,14 +51,9 @@
 </p>
 <script type="text/javascript">
   window.die = function die() {
-    window.onerror = (function (savedOnerror) {
-      return jsunitCallback(function (message, url, line) {
-          assertEquals('Uncaught Error: died!', message);
-          pass('testExceptionInEventHandler');
-          window.onerror = savedOnerror;
-        }, 'testExceptionInEventHandler');
-    })(onerror);
-
+    installOneShotOnerror(
+        'testExceptionInEventHandler',
+        'Uncaught Error: died!');
     throw new Error('died!');
   };
   jsunitRegister('testExceptionInEventHandler',
@@ -457,12 +464,9 @@
 <script type="text/javascript">
   jsunitRegister('testTimeoutError', function() {
     setTimeout(function() {  // NOT a jsunitCallback, must let error out
-      var savedOnerror = window.onerror;
-      window.onerror = jsunitCallback(function(message, url, line) {
-        assertEquals('Uncaught Error: foo', message);
-        pass();
-        window.onerror = savedOnerror;
-      }, 'testTimeoutError');
+      installOneShotOnerror(
+          'testTimeoutError',
+          'Uncaught Error: foo');
       throw new Error('foo');
     }, 0);
   });
@@ -773,7 +777,6 @@
 <script type="text/javascript">
   jsunitRegister('testXhrAsync',
                  function testXhrAsync() {
-    var cont = document.getElementById('testXhrAsync');
     var xhr = new window.XMLHttpRequest();
     xhr.open('GET', './xhrTest.txt', true);
     var asyncFlag = 'PRE';
@@ -791,6 +794,24 @@
   });
 </script>

+<div id="testXhrError" class="testcontainer">XHR callback errors</div>
+<script type="text/javascript">
+  jsunitRegister('testXhrError',
+                 function testXhrError() {
+    var xhr = new window.XMLHttpRequest();
+    xhr.open('GET', './xhrTest.txt', true);
+    xhr.onreadystatechange = function(event) {  // NOT a jsunitCallback
+      if (event.target.readyState === 4) {
+        installOneShotOnerror(
+            'testXhrError',
+            'Uncaught testXhrError');
+        throw 'testXhrError';
+      }
+    };
+    xhr.send();
+  });
+</script>
+
 <p id="testEventMutation" class="clickme testcontainer">testEventMutation
     <span>(Assignment to properties of events)</span></p>
 <script type="text/javascript">

--

--- You received this message because you are subscribed to the Google Groups "Google Caja Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to