mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 22:55:23 +00:00
120 lines
4.4 KiB
JavaScript
120 lines
4.4 KiB
JavaScript
/* Any copyright is dedicated to the public domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
// Bug 1174733 - Browser API: iframe.executeScript
|
|
|
|
'use strict';
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
browserElementTestHelpers.setEnabledPref(true);
|
|
|
|
function runTest() {
|
|
|
|
const origin = 'http://example.org';
|
|
const url = 'http://example.org/tests/dom/browser-element/mochitest/file_browserElement_ExecuteScript.html';
|
|
|
|
// Test if all key=>value pairs in o1 are present in o2.
|
|
const c = (o1, o2) => Object.keys(o1).every(k => o1[k] == o2[k]);
|
|
|
|
let scriptId = 0;
|
|
|
|
const bail = () => {
|
|
ok(false, `scriptId: ${scriptId++}`);
|
|
}
|
|
|
|
SpecialPowers.pushPermissions([
|
|
{type: 'browser', allow: 1, context: document},
|
|
{type: 'browser:universalxss', allow: 1, context: document}
|
|
], function() {
|
|
let iframe = document.createElement('iframe');
|
|
iframe.setAttribute('mozbrowser', 'true');
|
|
iframe.addEventListener('mozbrowserloadend', function onload() {
|
|
iframe.removeEventListener('mozbrowserloadend', onload);
|
|
onReady(iframe);
|
|
});
|
|
iframe.src = url;
|
|
document.body.appendChild(iframe);
|
|
});
|
|
|
|
|
|
function onReady(iframe) {
|
|
iframe.executeScript('4 + 4', {url}).then(rv => {
|
|
is(rv, 8, `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('(() => {return {a:42}})()', {url})
|
|
}, bail).then(rv => {
|
|
ok(c(rv, {a:42}), `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('(() => {return {a:42}})()', {origin})
|
|
}, bail).then(rv => {
|
|
ok(c(rv, {a:42}), `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('(() => {return {a:42}})()', {origin, url})
|
|
}, bail).then(rv => {
|
|
ok(c(rv, {a:42}), `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
new Promise((resolve, reject) => {
|
|
resolve(document.body.textContent.trim());
|
|
});
|
|
`, {url})
|
|
}, bail).then(rv => {
|
|
is(rv, 'foo', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
new Promise((resolve, reject) => {
|
|
resolve({a:43,b:34});
|
|
});
|
|
`, {url})
|
|
}, bail).then(rv => {
|
|
ok(c(rv, {a:43,b:34}), `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
… syntax error
|
|
`, {url});
|
|
}, bail).then(bail, (error) => {
|
|
is(error.name, 'SyntaxError: illegal character', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
window
|
|
`, {url});
|
|
}).then(bail, (error) => {
|
|
is(error.name, 'Script last expression must be a promise or a JSON object', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
new Promise((resolve, reject) => {
|
|
reject('BOOM');
|
|
});
|
|
`, {url});
|
|
}).then(bail, (error) => {
|
|
is(error.name, 'BOOM', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript(`
|
|
new Promise((resolve, reject) => {
|
|
resolve(window);
|
|
});
|
|
`, {url});
|
|
}).then(bail, (error) => {
|
|
is(error.name, 'Value returned (resolve) by promise is not a valid JSON object', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('window.btoa("a")', {url})
|
|
}, bail).then(rv => {
|
|
ok(c(rv, 'YQ=='), `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('window.wrappedJSObject.btoa("a")', {url})
|
|
}, bail).then(bail, (error) => {
|
|
is(error.name, 'TypeError: window.wrappedJSObject is undefined', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('42', {})
|
|
}).then(bail, error => {
|
|
is(error.name, 'InvalidAccessError', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('42');
|
|
}).then(bail, error => {
|
|
is(error.name, 'InvalidAccessError', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('43', { url: 'http://foo.com' });
|
|
}).then(bail, (error) => {
|
|
is(error.name, 'URL mismatches', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('43', { url: '_' });
|
|
}, bail).then(bail, (error) => {
|
|
is(error.name, 'Malformed URL', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('43', { origin: 'http://foo.com' });
|
|
}, bail).then(bail, (error) => {
|
|
is(error.name, 'Origin mismatches', `scriptId: ${scriptId++}`);
|
|
return iframe.executeScript('43', { origin: 'https://example.org' });
|
|
}, bail).then(bail, (error) => {
|
|
is(error.name, 'Origin mismatches', `scriptId: ${scriptId++}`);
|
|
SimpleTest.finish();
|
|
});
|
|
}
|
|
}
|
|
|
|
addEventListener('testready', runTest);
|