Bug 1339336 - Add a test case for pref "privacy.firstparty.isolate.restrict_opener_access". r=baku

MozReview-Commit-ID: GmnsHt2dumI

--HG--
extra : rebase_source : 202d66aec9e1cf91de37db28de2122c30db2916a
This commit is contained in:
Tim Huang 2017-02-16 10:15:54 +08:00
Родитель 3a9e18efb1
Коммит 1338dd1674
4 изменённых файлов: 144 добавлений и 0 удалений

Просмотреть файл

@ -32,6 +32,8 @@ support-files =
file_thirdPartyChild.worker.request.html
file_thirdPartyChild.worker.xhr.html
file_thirdPartyChild.xhr.html
file_windowOpenerRestriction.html
file_windowOpenerRestrictionTarget.html
head.js
test.js
test.js^headers^
@ -71,3 +73,4 @@ support-files =
[browser_cacheAPI.js]
[browser_permissions.js]
[browser_sanitize.js]
[browser_windowOpenerRestriction.js]

Просмотреть файл

@ -0,0 +1,98 @@
/**
* Bug 1339336 - A test case for testing pref 'privacy.firstparty.isolate.restrict_opener_access'
*/
const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components;
const FIRST_PARTY_OPENER = "example.com";
const FIRST_PARTY_TARGET = "example.org";
const OPENER_PAGE = "http://" + FIRST_PARTY_OPENER + "/browser/browser/components/" +
"originattributes/test/browser/file_windowOpenerRestriction.html";
const TARGET_PAGE = "http://" + FIRST_PARTY_TARGET + "/browser/browser/components/" +
"originattributes/test/browser/file_windowOpenerRestrictionTarget.html";
function* testPref(aIsPrefEnabled) {
// Use a random key so we don't access it in later tests.
let cookieStr = "key" + Math.random().toString() + "=" + Math.random().toString();
// Open the tab for the opener page.
let tab = gBrowser.addTab(OPENER_PAGE);
// Select this tab and make sure its browser is loaded and focused.
gBrowser.selectedTab = tab;
tab.ownerGlobal.focus();
let browser = gBrowser.getBrowserForTab(tab);
yield BrowserTestUtils.browserLoaded(browser);
yield ContentTask.spawn(browser, {cookieStr,
page: TARGET_PAGE,
isPrefEnabled: aIsPrefEnabled}, function* (obj) {
// Acquire the iframe element.
let childFrame = content.document.getElementById("child");
// Insert a cookie into this iframe.
childFrame.contentDocument.cookie = obj.cookieStr;
// Open the tab here and focus on it.
let openedPath = obj.page;
if (!obj.isPrefEnabled) {
// If the pref is not enabled, we pass the cookie value through the query string
// to tell the target page that it should check the cookie value.
openedPath += "?" + obj.cookieStr;
}
// Issue the opener page to open the target page and focus on it.
this.openedWindow = content.open(openedPath);
this.openedWindow.focus();
});
// Wait until the target page is loaded.
let targetBrowser = gBrowser.getBrowserForTab(gBrowser.selectedTab);
yield BrowserTestUtils.browserLoaded(targetBrowser);
// The target page will do the check and show the result through its title.
is(targetBrowser.contentTitle, "pass", "The behavior of window.opener is correct.");
// Close Tabs.
yield ContentTask.spawn(browser, null, function* () {
this.openedWindow.close();
});
yield BrowserTestUtils.removeTab(tab);
// Reset cookies
Services.cookies.removeAll();
}
add_task(function* runTests() {
let tests = [true, false];
// First, we test the scenario that the first party isolation is enabled.
yield SpecialPowers.pushPrefEnv({"set":
[["privacy.firstparty.isolate", true]]
});
for (let enabled of tests) {
yield SpecialPowers.pushPrefEnv({"set":
[["privacy.firstparty.isolate.restrict_opener_access", enabled]]
});
yield testPref(enabled);
}
// Second, we test the scenario that the first party isolation is disabled.
yield SpecialPowers.pushPrefEnv({"set":
[["privacy.firstparty.isolate", false]]
});
for (let enabled of tests) {
yield SpecialPowers.pushPrefEnv({"set":
[["privacy.firstparty.isolate.restrict_opener_access", enabled]]
});
// When first party isolation is disabled, this pref will not affect the behavior of
// window.opener. And the correct behavior here is to allow access since the iframe in
// the opener page has the same origin with the target page.
yield testPref(false);
}
});

Просмотреть файл

@ -0,0 +1,10 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test page for window.opener accessibility</title>
</head>
<body>
<iframe id="child" name="child" src="http://example.org/browser/browser/components/originattributes/test/browser/file_firstPartyBasic.html"></iframe>
</body>
</html>

Просмотреть файл

@ -0,0 +1,33 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>title not set</title>
<script>
// If the query string is given, we are expecting the window.opener can be accessed
// across different first party domains, so we will match the cookie value.
// Otherwise, the access of window.opener should be treated as cross-origin.
// Therefore, it should fail at this setting.
let openerRestriction = true;
let cookieValue;
if (window.location.search.length > 0) {
cookieValue = window.location.search.substr(1);
openerRestriction = false;
}
try {
let openerFrame = window.opener.frames["child"];
let result = openerFrame.document.cookie === cookieValue;
if (result && !openerRestriction) {
document.title = "pass";
}
} catch (e) {
if (openerRestriction) {
document.title = "pass";
}
}
</script>
</head>
<body>
</body>
</html>