Reviewers: felix8a,
Description:
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.
Please review this at https://codereview.appspot.com/182850043/
Affected files (+46, -18 lines):
M src/com/google/caja/plugin/domado.js
M tests/com/google/caja/plugin/test-domado-events-guest.html
Index: src/com/google/caja/plugin/domado.js
===================================================================
--- src/com/google/caja/plugin/domado.js (revision 5703)
+++ src/com/google/caja/plugin/domado.js (working copy)
@@ -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));
});
Index: tests/com/google/caja/plugin/test-domado-events-guest.html
===================================================================
--- tests/com/google/caja/plugin/test-domado-events-guest.html (revision
5703)
+++ tests/com/google/caja/plugin/test-domado-events-guest.html (working
copy)
@@ -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.