зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1408708 - Fetch stylesheet content via stylesheet window instead of top level content window. r=pbro
--HG-- extra : rebase_source : 07cc1370f13a45e6b5153808f99159f21764f291
This commit is contained in:
Родитель
15d9bc6da0
Коммит
fb35667385
|
@ -4,8 +4,11 @@ subsuite = devtools
|
||||||
support-files =
|
support-files =
|
||||||
autocomplete.html
|
autocomplete.html
|
||||||
browser_styleeditor_cmd_edit.html
|
browser_styleeditor_cmd_edit.html
|
||||||
|
bug_1405342_serviceworker_iframes.html
|
||||||
four.html
|
four.html
|
||||||
head.js
|
head.js
|
||||||
|
iframe_with_service_worker.html
|
||||||
|
iframe_service_worker.js
|
||||||
import.css
|
import.css
|
||||||
import.html
|
import.html
|
||||||
import2.css
|
import2.css
|
||||||
|
@ -70,6 +73,7 @@ support-files =
|
||||||
[browser_styleeditor_bug_740541_iframes.js]
|
[browser_styleeditor_bug_740541_iframes.js]
|
||||||
[browser_styleeditor_bug_851132_middle_click.js]
|
[browser_styleeditor_bug_851132_middle_click.js]
|
||||||
[browser_styleeditor_bug_870339.js]
|
[browser_styleeditor_bug_870339.js]
|
||||||
|
[browser_styleeditor_bug_1405342_serviceworker_iframes.js]
|
||||||
[browser_styleeditor_cmd_edit.js]
|
[browser_styleeditor_cmd_edit.js]
|
||||||
[browser_styleeditor_enabled.js]
|
[browser_styleeditor_enabled.js]
|
||||||
[browser_styleeditor_fetch-from-cache.js]
|
[browser_styleeditor_fetch-from-cache.js]
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Test that sheets inside cross origin iframes, served from a service worker
|
||||||
|
// are correctly fetched via the service worker in the stylesheet editor.
|
||||||
|
|
||||||
|
add_task(async function () {
|
||||||
|
const TEST_URL = "https://test1.example.com/browser/devtools/client/styleeditor/test/bug_1405342_serviceworker_iframes.html";
|
||||||
|
let { ui } = await openStyleEditorForURL(TEST_URL);
|
||||||
|
|
||||||
|
if (ui.editors.length != 1) {
|
||||||
|
info("Stylesheet isn't available immediately, waiting for it");
|
||||||
|
await ui.once("editor-added");
|
||||||
|
}
|
||||||
|
is(ui.editors.length, 1, "Got the iframe stylesheet");
|
||||||
|
|
||||||
|
await ui.selectStyleSheet(ui.editors[0].styleSheet);
|
||||||
|
let editor = await ui.editors[0].getSourceEditor();
|
||||||
|
let text = editor.sourceEditor.getText();
|
||||||
|
is(text, "* { color: green; }",
|
||||||
|
"stylesheet content is the one served by the service worker");
|
||||||
|
});
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Bug 1405342</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<iframe src="https://test2.example.com/browser/devtools/client/styleeditor/test/iframe_with_service_worker.html"><iframe>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,12 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
self.onfetch = function (event) {
|
||||||
|
if (event.request.url.includes("sheet.css")) {
|
||||||
|
return event.respondWith(new Response("* { color: green; }"));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
self.onactivate = function (event) {
|
||||||
|
event.waitUntil(self.clients.claim());
|
||||||
|
};
|
|
@ -0,0 +1,33 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
Iframe loading a stylesheet via a service worker
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function waitForActive(swr) {
|
||||||
|
let sw = swr.installing || swr.waiting || swr.active;
|
||||||
|
return new Promise(resolve => {
|
||||||
|
if (sw.state === "activated") {
|
||||||
|
resolve(swr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sw.addEventListener("statechange", function onStateChange(evt) {
|
||||||
|
if (sw.state === "activated") {
|
||||||
|
sw.removeEventListener("statechange", onStateChange);
|
||||||
|
resolve(swr);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
navigator.serviceWorker.register("iframe_service_worker.js", {scope: "."})
|
||||||
|
.then(registration => waitForActive(registration))
|
||||||
|
.then(() => {
|
||||||
|
let link = document.createElement("link");
|
||||||
|
link.setAttribute("rel", "stylesheet");
|
||||||
|
link.setAttribute("type", "text/css");
|
||||||
|
link.setAttribute("href", "sheet.css");
|
||||||
|
document.documentElement.appendChild(link);
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -140,7 +140,7 @@ var StyleSheetActor = protocol.ActorClassWithSpec(styleSheetSpec, {
|
||||||
* Window of target
|
* Window of target
|
||||||
*/
|
*/
|
||||||
get window() {
|
get window() {
|
||||||
return this._window || this.parentActor.window;
|
return this.parentActor.window;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,6 +150,14 @@ var StyleSheetActor = protocol.ActorClassWithSpec(styleSheetSpec, {
|
||||||
return this.window.document;
|
return this.window.document;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StyleSheet's window.
|
||||||
|
*/
|
||||||
|
get ownerWindow() {
|
||||||
|
// eslint-disable-next-line mozilla/use-ownerGlobal
|
||||||
|
return this.ownerDocument.defaultView;
|
||||||
|
},
|
||||||
|
|
||||||
get ownerNode() {
|
get ownerNode() {
|
||||||
return this.rawSheet.ownerNode;
|
return this.rawSheet.ownerNode;
|
||||||
},
|
},
|
||||||
|
@ -202,18 +210,31 @@ var StyleSheetActor = protocol.ActorClassWithSpec(styleSheetSpec, {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
initialize: function (styleSheet, parentActor, window) {
|
initialize: function (styleSheet, parentActor) {
|
||||||
protocol.Actor.prototype.initialize.call(this, null);
|
protocol.Actor.prototype.initialize.call(this, null);
|
||||||
|
|
||||||
this.rawSheet = styleSheet;
|
this.rawSheet = styleSheet;
|
||||||
this.parentActor = parentActor;
|
this.parentActor = parentActor;
|
||||||
this.conn = this.parentActor.conn;
|
this.conn = this.parentActor.conn;
|
||||||
|
|
||||||
this._window = window;
|
|
||||||
|
|
||||||
// text and index are unknown until source load
|
// text and index are unknown until source load
|
||||||
this.text = null;
|
this.text = null;
|
||||||
this._styleSheetIndex = -1;
|
this._styleSheetIndex = -1;
|
||||||
|
|
||||||
|
// When the style is imported, `styleSheet.ownerNode` is null,
|
||||||
|
// so retrieve the topmost parent style sheet which has an ownerNode
|
||||||
|
let parentStyleSheet = styleSheet;
|
||||||
|
while (parentStyleSheet.parentStyleSheet) {
|
||||||
|
parentStyleSheet = parentStyleSheet.parentStyleSheet;
|
||||||
|
}
|
||||||
|
// When the style is injected via nsIDOMWindowUtils.loadSheet, even
|
||||||
|
// the parent style sheet has no owner, so default back to tab actor
|
||||||
|
// document
|
||||||
|
if (parentStyleSheet.ownerNode) {
|
||||||
|
this.ownerDocument = parentStyleSheet.ownerNode.ownerDocument;
|
||||||
|
} else {
|
||||||
|
this.ownerDocument = parentActor.window;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -417,8 +438,8 @@ var StyleSheetActor = protocol.ActorClassWithSpec(styleSheetSpec, {
|
||||||
let excludedProtocolsRe = /^(chrome|file|resource|moz-extension):\/\//;
|
let excludedProtocolsRe = /^(chrome|file|resource|moz-extension):\/\//;
|
||||||
if (!excludedProtocolsRe.test(this.href)) {
|
if (!excludedProtocolsRe.test(this.href)) {
|
||||||
// Stylesheets using other protocols should use the content principal.
|
// Stylesheets using other protocols should use the content principal.
|
||||||
options.window = this.window;
|
options.window = this.ownerWindow;
|
||||||
options.principal = this.document.nodePrincipal;
|
options.principal = this.ownerDocument.nodePrincipal;
|
||||||
}
|
}
|
||||||
|
|
||||||
let result;
|
let result;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче