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:
Luca Greco 2016-01-24 14:43:00 -08:00
parent ce53c810fd
commit 3266326e23
2 changed files with 164 additions and 0 deletions

View File

@ -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]

View File

@ -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>