Commit 0098821d authored by Romain Courteaud's avatar Romain Courteaud

Iframe: handle not transferrable object through postMessage

parent b715d066
......@@ -300,25 +300,29 @@
postMessage({ id: id, callback: cbName, params: v});
},
error: function(error, message) {
completed = true;
// verify in table
if (!inTbl[id]) throw "error called for nonexistent message: " + id;
// remove transaction from table
delete inTbl[id];
// send error
postMessage({ id: id, error: error, message: message });
completed = true;
// remove transaction from table
delete inTbl[id];
},
complete: function(v) {
completed = true;
// verify in table
if (!inTbl[id]) throw "complete called for nonexistent message: " + id;
// remove transaction from table
delete inTbl[id];
// send complete
postMessage({ id: id, result: v });
},
completed = true;
// remove transaction from table
delete inTbl[id];
},
delayReturn: function(delay) {
if (typeof delay === 'boolean') {
shouldDelayReturn = (delay === true);
......
......@@ -2065,10 +2065,11 @@
local_transaction_dict[transaction_id] =
root_gadget[v[0]].apply(root_gadget, v[1])
.push(function handleMethodCallSuccess() {
trans.complete.apply(trans, arguments);
// drop the promise reference, to allow garbage collection
delete local_transaction_dict[transaction_id];
trans.complete.apply(trans, arguments);
}, function handleMethodCallError(e) {
})
.push(undefined, function handleMethodCallError(e) {
var error_type = convertObjectToErrorType(e),
message;
if (e instanceof Error) {
......@@ -2080,12 +2081,19 @@
} else {
message = e;
}
try {
trans.error({
type: error_type,
msg: message
});
} catch (new_error) {
trans.error({
type: convertObjectToErrorType(new_error),
msg: new_error.toString()
});
}
// drop the promise reference, to allow garbage collection
delete local_transaction_dict[transaction_id];
trans.error({
type: error_type,
msg: message
});
});
trans.delayReturn(true);
});
......
......@@ -168,6 +168,17 @@
"isAcquiredMethodCancelCalled")
.declareMethod('wasAcquiredMethodCancelCalledFromParent', function () {
return this.isAcquiredMethodCancelCalled();
})
.declareMethod('returnNotTransferrable', function () {
var a = {};
a.a = a;
return a;
})
.declareMethod('throwNotTransferrable', function () {
var a = {};
a.a = a;
throw a;
});
}(window, rJS, RSVP));
......@@ -5872,7 +5872,7 @@
gadget.__sub_gadget_dict = {};
stop();
expect(42);
expect(46);
gadget.declareGadget(url, {
sandbox: 'iframe',
element: document.getElementById('qunit-fixture'),
......@@ -6148,6 +6148,36 @@
error.toString(),
"IframeSerializationError: String Error"
);
})
// returning not transferrable object fails
.push(function () {
return new_gadget.returnNotTransferrable();
})
.push(undefined, function (error) {
ok(
error instanceof renderJS.IframeSerializationError,
JSON.stringify(error)
);
equal(
error.toString(),
"IframeSerializationError: TypeError: cyclic object value"
);
})
// throw not transferrable object fails
.push(function () {
return new_gadget.throwNotTransferrable();
})
.push(undefined, function (error) {
ok(
error instanceof renderJS.IframeSerializationError,
JSON.stringify(error)
);
equal(
error.toString(),
"IframeSerializationError: TypeError: cyclic object value"
);
});
})
.fail(function (error) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment