зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1214658 - Add test case of an webextension page iframe created from a content script. r=kmag
--HG-- extra : commitid : 9tJ6I2yhAFY extra : source : aee8341f15c745e69cefc2a4dbd9bff18ce2f699 extra : histedit_source : 447205890dcd3fb4ffc30d4ad67da8f942d452b6%2C4d0923aee564f54f60496e5bb8b17da6ad2f6c4a
This commit is contained in:
Родитель
ce53c810fd
Коммит
3266326e23
|
@ -27,6 +27,7 @@ support-files =
|
|||
[test_ext_geturl.html]
|
||||
[test_ext_contentscript.html]
|
||||
skip-if = buildapp == 'b2g' # runat != document_idle is not supported.
|
||||
[test_ext_contentscript_create_iframe.html]
|
||||
[test_ext_i18n_css.html]
|
||||
[test_ext_generate.html]
|
||||
[test_ext_localStorage.html]
|
||||
|
|
|
@ -0,0 +1,163 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test for content script</title>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
|
||||
<script type="text/javascript" src="head.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- WORKAROUND: this textarea hack is used to contain the html page source without escaping it -->
|
||||
<textarea id="test-asset">
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<script type="text/javascript" src="content_script_iframe.js"></script>
|
||||
</head>
|
||||
</html>
|
||||
</textarea>
|
||||
|
||||
<script type="text/javascript">
|
||||
"use strict";
|
||||
|
||||
add_task(function* test_contentscript_create_iframe() {
|
||||
function backgroundScript() {
|
||||
browser.runtime.onMessage.addListener((msg, sender) => {
|
||||
let { name, availableAPIs, manifest, testGetManifest } = msg;
|
||||
let hasExtTabsAPI = availableAPIs.indexOf("tabs") > 0;
|
||||
let hasExtWindowsAPI = availableAPIs.indexOf("windows") > 0;
|
||||
|
||||
browser.test.assertFalse(hasExtTabsAPI, "the created iframe should not be able to use privileged APIs (tabs)");
|
||||
browser.test.assertFalse(hasExtWindowsAPI, "the created iframe should not be able to use privileged APIs (windows)");
|
||||
|
||||
let { applications: { gecko: { id: expectedManifestGeckoId } } } = chrome.runtime.getManifest();
|
||||
let { applications: { gecko: { id: actualManifestGeckoId } } } = manifest;
|
||||
|
||||
browser.test.assertEq(actualManifestGeckoId, expectedManifestGeckoId,
|
||||
"the add-on manifest should be accessible from the created iframe"
|
||||
);
|
||||
|
||||
let { applications: { gecko: { id: testGetManifestGeckoId } } } = testGetManifest;
|
||||
|
||||
browser.test.assertEq(testGetManifestGeckoId, expectedManifestGeckoId,
|
||||
"GET_MANIFEST() returns manifest data before extension unload"
|
||||
);
|
||||
|
||||
browser.test.sendMessage(name);
|
||||
});
|
||||
}
|
||||
|
||||
function contentScript() {
|
||||
let iframe = document.createElement("iframe");
|
||||
iframe.setAttribute("src", browser.runtime.getURL("content_script_iframe.html"));
|
||||
document.body.appendChild(iframe);
|
||||
}
|
||||
|
||||
function contentScriptIframe() {
|
||||
window.GET_MANIFEST = browser.runtime.getManifest.bind(null);
|
||||
|
||||
window.testGetManifestException = () => {
|
||||
try {
|
||||
window.GET_MANIFEST();
|
||||
} catch (exception) {
|
||||
return String(exception);
|
||||
}
|
||||
};
|
||||
|
||||
let testGetManifest = window.GET_MANIFEST();
|
||||
|
||||
let manifest = browser.runtime.getManifest();
|
||||
let availableAPIs = Object.keys(browser);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
name: "content-script-iframe-loaded",
|
||||
availableAPIs,
|
||||
manifest,
|
||||
testGetManifest,
|
||||
});
|
||||
}
|
||||
|
||||
let extensionData = {
|
||||
manifest: {
|
||||
content_scripts: [
|
||||
{
|
||||
"matches": ["http://mochi.test/*/file_sample.html"],
|
||||
"js": ["content_script.js"],
|
||||
"run_at": "document_idle",
|
||||
},
|
||||
],
|
||||
web_accessible_resources: [
|
||||
"content_script_iframe.html",
|
||||
],
|
||||
},
|
||||
|
||||
background: "(" + backgroundScript + ")()",
|
||||
|
||||
files: {
|
||||
"content_script.js": "new " + contentScript,
|
||||
"content_script_iframe.html": document.querySelector("#test-asset").textContent,
|
||||
"content_script_iframe.js": "new " + contentScriptIframe,
|
||||
},
|
||||
};
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension(extensionData);
|
||||
|
||||
let contentScriptIframeCreatedPromise = new Promise(resolve => {
|
||||
extension.onMessage("content-script-iframe-loaded", () => { resolve(); });
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
info("extension loaded");
|
||||
|
||||
let win = window.open("file_sample.html");
|
||||
|
||||
yield Promise.all([waitForLoad(win), contentScriptIframeCreatedPromise]);
|
||||
info("content script privileged iframe loaded and executed");
|
||||
|
||||
info("testing APIs availability once the extension is unloaded...");
|
||||
|
||||
let iframeWindow = SpecialPowers.wrap(win)[0];
|
||||
|
||||
ok(iframeWindow, "content script enabled iframe found");
|
||||
ok(/content_script_iframe\.html$/.test(iframeWindow.location), "the found iframe has the expected URL");
|
||||
|
||||
yield extension.unload();
|
||||
info("extension unloaded");
|
||||
|
||||
info("test content script APIs not accessible from the frame once the extension is unloaded");
|
||||
|
||||
let ww = SpecialPowers.Cu.waiveXrays(iframeWindow);
|
||||
let isDeadWrapper = SpecialPowers.Cu.isDeadWrapper(ww.browser);
|
||||
ok(!isDeadWrapper, "the API object should not be a dead object");
|
||||
|
||||
let manifest;
|
||||
let manifestException;
|
||||
|
||||
try {
|
||||
manifest = ww.browser.runtime.getManifest();
|
||||
} catch (e) {
|
||||
manifestException = e;
|
||||
}
|
||||
|
||||
ok(!manifest, "manifest should be undefined");
|
||||
|
||||
is(String(manifestException), "TypeError: ww.browser.runtime is undefined",
|
||||
"expected \"TypeError: ... is undefined\" exception received");
|
||||
|
||||
let getManifestException = ww.testGetManifestException();
|
||||
|
||||
is(getManifestException, "TypeError: window.GET_MANIFEST is not a function",
|
||||
"expected \"TypeError: ... is not a function\" exception received");
|
||||
|
||||
win.close();
|
||||
|
||||
info("done");
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче