зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1158728 - ServiceWorkerClient: use innerWindow id for referencing clients. r=nsm
--HG-- extra : rebase_source : 51313aa04168631d1d2952f90fb02406aa824fb5
This commit is contained in:
Родитель
fc75d392de
Коммит
a68051d606
|
@ -28,17 +28,21 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ServiceWorkerClient)
|
|||
NS_INTERFACE_MAP_END
|
||||
|
||||
ServiceWorkerClientInfo::ServiceWorkerClientInfo(nsIDocument* aDoc)
|
||||
: mWindowId(0)
|
||||
{
|
||||
MOZ_ASSERT(aDoc);
|
||||
MOZ_ASSERT(aDoc->GetWindow());
|
||||
|
||||
nsresult rv = aDoc->GetId(mClientId);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("Failed to get the UUID of the document.");
|
||||
}
|
||||
|
||||
nsRefPtr<nsGlobalWindow> outerWindow = static_cast<nsGlobalWindow*>(aDoc->GetWindow());
|
||||
mWindowId = outerWindow->WindowID();
|
||||
nsRefPtr<nsGlobalWindow> innerWindow = static_cast<nsGlobalWindow*>(aDoc->GetInnerWindow());
|
||||
if (innerWindow) {
|
||||
// XXXcatalinb: The inner window can be null if the document is navigating
|
||||
// and was detached.
|
||||
mWindowId = innerWindow->WindowID();
|
||||
}
|
||||
|
||||
aDoc->GetURL(mUrl);
|
||||
mVisibilityState = aDoc->VisibilityState();
|
||||
|
||||
|
@ -48,6 +52,8 @@ ServiceWorkerClientInfo::ServiceWorkerClientInfo(nsIDocument* aDoc)
|
|||
NS_WARNING("Failed to get focus information.");
|
||||
}
|
||||
|
||||
nsRefPtr<nsGlobalWindow> outerWindow = static_cast<nsGlobalWindow*>(aDoc->GetWindow());
|
||||
MOZ_ASSERT(outerWindow);
|
||||
if (!outerWindow->IsTopLevelWindow()) {
|
||||
mFrameType = FrameType::Nested;
|
||||
} else if (outerWindow->HadOriginalOpener()) {
|
||||
|
@ -85,7 +91,7 @@ public:
|
|||
Run()
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
nsGlobalWindow* window = nsGlobalWindow::GetOuterWindowWithId(mWindowId);
|
||||
nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(mWindowId);
|
||||
if (!window) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ public:
|
|||
Run() override
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
nsGlobalWindow* window = nsGlobalWindow::GetOuterWindowWithId(mWindowId);
|
||||
nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(mWindowId);
|
||||
UniquePtr<ServiceWorkerClientInfo> clientInfo;
|
||||
|
||||
if (window) {
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
onfetch = function(e) {
|
||||
if (e.request.url.indexOf("service_worker_controlled") >= 0) {
|
||||
// pass through
|
||||
e.respondWith(fetch(e.request));
|
||||
} else {
|
||||
e.respondWith(new Response("Fetch was intercepted"));
|
||||
}
|
||||
}
|
||||
|
||||
onmessage = function(e) {
|
||||
clients.claim();
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
<!--
|
||||
Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/
|
||||
-->
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Bug 1130684 - Test fetch events are intercepted after claim </title>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
<a ping="ping" href="fetch.txt">link</a>
|
||||
</div>
|
||||
<pre id="test"></pre>
|
||||
<script class="testbody" type="text/javascript">
|
||||
var registration;
|
||||
|
||||
function register() {
|
||||
return navigator.serviceWorker.register("claim_fetch_worker.js",
|
||||
{ scope: "./" })
|
||||
.then((swr) => registration = swr);
|
||||
}
|
||||
|
||||
function unregister() {
|
||||
return registration.unregister().then(function(result) {
|
||||
ok(result, "Unregister should return true.");
|
||||
});
|
||||
}
|
||||
|
||||
function createClient() {
|
||||
var p = new Promise(function(res, rej){
|
||||
window.onmessage = function(e) {
|
||||
if(e.data === "READY") {
|
||||
res();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var content = document.getElementById("content");
|
||||
ok(content, "Parent exists.");
|
||||
|
||||
iframe = document.createElement("iframe");
|
||||
iframe.setAttribute('src', "sw_clients/service_worker_controlled.html");
|
||||
content.appendChild(iframe);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
function testFetch(before) {
|
||||
return fetch("fetch/real-file.txt").then(function(res) {
|
||||
ok(res.ok, "Response should be valid.");
|
||||
return res.text().then(function(body) {
|
||||
if (before) {
|
||||
ok(body !== "Fetch was intercepted", "Fetch events should not be intercepted.");
|
||||
} else {
|
||||
ok(body === "Fetch was intercepted", "Fetch events should be intercepted.");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function claimThisPage() {
|
||||
ok(registration.active, "Worker is active.");
|
||||
var p = new Promise(function (res, rej) {
|
||||
navigator.serviceWorker.oncontrollerchange = res;
|
||||
});
|
||||
|
||||
registration.active.postMessage("Claim");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
function runTest() {
|
||||
register()
|
||||
.then(createClient)
|
||||
.then(testFetch.bind(this, true))
|
||||
.then(claimThisPage)
|
||||
.then(testFetch.bind(this, false))
|
||||
.then(unregister)
|
||||
.catch(function(e) {
|
||||
ok(false, "Some test failed with error " + e);
|
||||
}).then(SimpleTest.finish);
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
SpecialPowers.pushPrefEnv({"set": [
|
||||
["dom.serviceWorkers.exemptFromPerDomainMax", true],
|
||||
["dom.serviceWorkers.enabled", true],
|
||||
["dom.serviceWorkers.testing.enabled", true]
|
||||
]}, runTest);
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
Загрузка…
Ссылка в новой задаче