зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1500257 part 9 - Add basic tests for out-of-process iframes. r=qdot
Differential Revision: https://phabricator.services.mozilla.com/D17449 --HG-- extra : rebase_source : 789e500e72f8daf5f2da799539f0c3f2a187619f extra : source : 335ddf6a213a17764262041f46a51605fc931276
This commit is contained in:
Родитель
b9a745008e
Коммит
5d1848678f
|
@ -0,0 +1 @@
|
|||
<h1>This is a dummy file!</h1>
|
|
@ -23,3 +23,7 @@ support-files =
|
|||
!/dom/canvas/test/captureStream_common.js
|
||||
[test_Preallocated.html]
|
||||
skip-if = !e10s
|
||||
[test_force_oop_iframe.html]
|
||||
skip-if = !e10s || webrender # oop-iframes trigger a debug assertion in webrender picture caching
|
||||
support-files =
|
||||
file_dummy.html
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/ChromeTask.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script type="application/javascript">
|
||||
"use strict";
|
||||
/* eslint-env mozilla/frame-script */
|
||||
|
||||
add_task(async function() {
|
||||
await SpecialPowers.pushPrefEnv({"set": [["browser.fission.oopif.attribute", true]]});
|
||||
|
||||
// This iframe should be loaded out of process. Unfortunately as of the time
|
||||
// of this test's creation, many different events which we could use to detect
|
||||
// this load have not been implemented yet.
|
||||
let contentCreated = ChromeTask.spawn(null, async function() {
|
||||
let wgp = await new Promise(resolve => {
|
||||
function observer(parent) {
|
||||
info("WGP with origin: " + parent.documentPrincipal.origin);
|
||||
if (parent.documentPrincipal.origin !== "http://mochi.test:8888") {
|
||||
return;
|
||||
}
|
||||
|
||||
Services.obs.removeObserver(observer, "window-global-created");
|
||||
resolve(parent);
|
||||
}
|
||||
Services.obs.addObserver(observer, "window-global-created");
|
||||
});
|
||||
|
||||
is(wgp.isInProcess, false, "not in-process");
|
||||
ok(wgp.rootFrameLoader, "Has frameloader");
|
||||
ok(wgp.documentPrincipal, "Has document principal");
|
||||
});
|
||||
|
||||
var iframe = document.createElement("iframe");
|
||||
iframe.setAttribute("fission", "true");
|
||||
iframe.setAttribute("src", "file_dummy.html");
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
// Check that this isn't loaded in-process, or using a nested tabParent object.
|
||||
let frameLoader = SpecialPowers.wrap(iframe).frameLoader;
|
||||
is(frameLoader.docShell, null);
|
||||
is(frameLoader.tabParent, null);
|
||||
|
||||
await contentCreated;
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -2682,7 +2682,7 @@ pref("csp.overrule_about_uris_without_csp_whitelist", false);
|
|||
pref("csp.skip_about_page_has_csp_assert", false);
|
||||
// assertion flag will be set to false after fixing Bug 1473549
|
||||
pref("security.allow_eval_with_system_principal", false);
|
||||
pref("security.uris_using_eval_with_system_principal", "autocomplete.xml,redux.js,react-redux.js,content-task.js,content-task.js,tree.xml,dialog.xml,preferencesbindings.js,wizard.xml,lodash.js,jszip.js,ajv-4.1.1.js,updates.js,setup,jsol.js,parent_utils.js");
|
||||
pref("security.uris_using_eval_with_system_principal", "autocomplete.xml,redux.js,react-redux.js,content-task.js,content-task.js,tree.xml,dialog.xml,preferencesbindings.js,wizard.xml,lodash.js,jszip.js,ajv-4.1.1.js,updates.js,setup,jsol.js,parent_utils.js,chrometask_chromescript");
|
||||
#endif
|
||||
|
||||
// Default Content Security Policy to apply to signed contents.
|
||||
|
|
|
@ -0,0 +1,179 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80 filetype=javascript: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
function ChromeTask_ChromeScript() {
|
||||
"use strict";
|
||||
|
||||
const {Task} = ChromeUtils.import("resource://testing-common/Task.jsm");
|
||||
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||
const AssertCls = ChromeUtils.import("resource://testing-common/Assert.jsm", null).Assert;
|
||||
|
||||
addMessageListener("chrome-task:spawn", function(aData) {
|
||||
let id = aData.id;
|
||||
let source = aData.runnable || "()=>{}";
|
||||
|
||||
function getStack(aStack) {
|
||||
let frames = [];
|
||||
for (let frame = aStack; frame; frame = frame.caller) {
|
||||
frames.push(frame.filename + ":" + frame.name + ":" + frame.lineNumber);
|
||||
}
|
||||
return frames.join("\n");
|
||||
}
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
var Assert = new AssertCls((err, message, stack) => {
|
||||
sendAsyncMessage("chrome-task:test-result", {
|
||||
id,
|
||||
condition: !err,
|
||||
name: err ? err.message : message,
|
||||
stack: getStack(err ? err.stack : stack),
|
||||
});
|
||||
});
|
||||
|
||||
var ok = Assert.ok.bind(Assert);
|
||||
var is = Assert.equal.bind(Assert);
|
||||
var isnot = Assert.notEqual.bind(Assert);
|
||||
|
||||
function todo(expr, name) {
|
||||
sendAsyncMessage("chrome-task:test-todo", {id, expr, name});
|
||||
}
|
||||
|
||||
function todo_is(a, b, name) {
|
||||
sendAsyncMessage("chrome-task:test-todo_is", {id, a, b, name});
|
||||
}
|
||||
|
||||
function info(name) {
|
||||
sendAsyncMessage("chrome-task:test-info", {id, name});
|
||||
}
|
||||
/* eslint-enable no-unused-vars */
|
||||
|
||||
try {
|
||||
let runnablestr = `
|
||||
(() => {
|
||||
return (${source});
|
||||
})();`;
|
||||
|
||||
// eslint-disable-next-line no-eval
|
||||
let runnable = eval(runnablestr);
|
||||
let iterator = runnable.call(this, aData.arg);
|
||||
Task.spawn(iterator).then((val) => {
|
||||
sendAsyncMessage("chrome-task:complete", {
|
||||
id,
|
||||
result: val,
|
||||
});
|
||||
}, (e) => {
|
||||
sendAsyncMessage("chrome-task:complete", {
|
||||
id,
|
||||
error: e.toString(),
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
sendAsyncMessage("chrome-task:complete", {
|
||||
id,
|
||||
error: e.toString(),
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This object provides the public module functions.
|
||||
*/
|
||||
var ChromeTask = {
|
||||
/**
|
||||
* the ChromeScript if it has already been loaded.
|
||||
*/
|
||||
_chromeScript: null,
|
||||
|
||||
/**
|
||||
* Mapping from message id to associated promise.
|
||||
*/
|
||||
_promises: new Map(),
|
||||
|
||||
/**
|
||||
* Incrementing integer to generate unique message id.
|
||||
*/
|
||||
_messageID: 1,
|
||||
|
||||
/**
|
||||
* Creates and starts a new task in the chrome process.
|
||||
*
|
||||
* @param arg A single serializable argument that will be passed to the
|
||||
* task when executed on the content process.
|
||||
* @param task
|
||||
* - A generator or function which will be serialized and sent to
|
||||
* the remote browser to be executed. Unlike Task.spawn, this
|
||||
* argument may not be an iterator as it will be serialized and
|
||||
* sent to the remote browser.
|
||||
* @return A promise object where you can register completion callbacks to be
|
||||
* called when the task terminates.
|
||||
* @resolves With the final returned value of the task if it executes
|
||||
* successfully.
|
||||
* @rejects An error message if execution fails.
|
||||
*/
|
||||
spawn: function ChromeTask_spawn(arg, task) {
|
||||
// Load the frame script if needed.
|
||||
let handle = ChromeTask._chromeScript;
|
||||
if (!handle) {
|
||||
handle = SpecialPowers.loadChromeScript(ChromeTask_ChromeScript);
|
||||
handle.addMessageListener("chrome-task:complete", ChromeTask.onComplete);
|
||||
handle.addMessageListener("chrome-task:test-result", ChromeTask.onResult);
|
||||
handle.addMessageListener("chrome-task:test-info", ChromeTask.onInfo);
|
||||
handle.addMessageListener("chrome-task:test-todo", ChromeTask.onTodo);
|
||||
handle.addMessageListener("chrome-task:test-todo_is", ChromeTask.onTodoIs);
|
||||
ChromeTask._chromeScript = handle;
|
||||
}
|
||||
|
||||
let deferred = {};
|
||||
deferred.promise = new Promise((resolve, reject) => {
|
||||
deferred.resolve = resolve;
|
||||
deferred.reject = reject;
|
||||
});
|
||||
|
||||
let id = ChromeTask._messageID++;
|
||||
ChromeTask._promises.set(id, deferred);
|
||||
|
||||
handle.sendAsyncMessage(
|
||||
"chrome-task:spawn",
|
||||
{
|
||||
id,
|
||||
runnable: task.toString(),
|
||||
arg,
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
onComplete(aData) {
|
||||
let deferred = ChromeTask._promises.get(aData.id);
|
||||
ChromeTask._promises.delete(aData.id);
|
||||
|
||||
if (aData.error) {
|
||||
deferred.reject(aData.error);
|
||||
} else {
|
||||
deferred.resolve(aData.result);
|
||||
}
|
||||
},
|
||||
|
||||
onResult(aData) {
|
||||
SimpleTest.record(aData.condition, aData.name);
|
||||
},
|
||||
|
||||
onInfo(aData) {
|
||||
SimpleTest.info(aData.name);
|
||||
},
|
||||
|
||||
onTodo(aData) {
|
||||
SimpleTest.todo(aData.expr, aData.name);
|
||||
},
|
||||
|
||||
onTodoIs(aData) {
|
||||
SimpleTest.todo_is(aData.a, aData.b, aData.name);
|
||||
},
|
||||
};
|
|
@ -8,6 +8,7 @@ TEST_HARNESS_FILES.testing.mochitest.tests.SimpleTest += [
|
|||
'/docshell/test/chrome/docshell_helpers.js',
|
||||
'/testing/specialpowers/content/MozillaLogger.js',
|
||||
'AddTask.js',
|
||||
'ChromeTask.js',
|
||||
'EventUtils.js',
|
||||
'ExtensionTestUtils.js',
|
||||
'iframe-between-tests.html',
|
||||
|
|
Загрузка…
Ссылка в новой задаче