diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_911547.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_911547.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_911547.js b/browser/components/sessionstore/test/browser_911547.js new file mode 100644 index 000000000..58b2e9ef1 --- /dev/null +++ b/browser/components/sessionstore/test/browser_911547.js @@ -0,0 +1,63 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// This tests that session restore component does restore the right content +// security policy with the document. +// The policy being tested disallows inline scripts + +add_task(function* test() { + // create a tab that has a CSP + let testURL = "http://mochi.test:8888/browser/browser/components/sessionstore/test/browser_911547_sample.html"; + let tab = gBrowser.selectedTab = gBrowser.addTab(testURL); + gBrowser.selectedTab = tab; + + let browser = tab.linkedBrowser; + yield promiseBrowserLoaded(browser); + + // this is a baseline to ensure CSP is active + // attempt to inject and run a script via inline (pre-restore, allowed) + yield injectInlineScript(browser, `document.getElementById("test_id").value = "fail";`); + + let loadedPromise = promiseBrowserLoaded(browser); + yield ContentTask.spawn(browser, null, function() { + is(content.document.getElementById("test_id").value, "ok", + "CSP should block the inline script that modifies test_id"); + + // attempt to click a link to a data: URI (will inherit the CSP of the + // origin document) and navigate to the data URI in the link. + content.document.getElementById("test_data_link").click(); + }); + + yield loadedPromise; + + yield ContentTask.spawn(browser, null, function() { + is(content.document.getElementById("test_id2").value, "ok", + "CSP should block the script loaded by the clicked data URI"); + }); + + // close the tab + yield promiseRemoveTab(tab); + + // open new tab and recover the state + tab = ss.undoCloseTab(window, 0); + yield promiseTabRestored(tab); + browser = tab.linkedBrowser; + + yield ContentTask.spawn(browser, null, function() { + is(content.document.getElementById("test_id2").value, "ok", + "CSP should block the script loaded by the clicked data URI after restore"); + }); + + // clean up + gBrowser.removeTab(tab); +}); + +// injects an inline script element (with a text body) +function injectInlineScript(browser, scriptText) { + return ContentTask.spawn(browser, scriptText, function(text) { + let scriptElt = content.document.createElement("script"); + scriptElt.type = "text/javascript"; + scriptElt.text = text; + content.document.body.appendChild(scriptElt); + }); +} |