mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-01 05:48:26 +00:00
Bug 1321303 - Part 8: Implement browsingData serviceWorkers dataType, r=baku
MozReview-Commit-ID: 10zSlmaKjIj --HG-- extra : rebase_source : 82ba465f0deb8c0cf3dc74e8b91307462b1af3a7
This commit is contained in:
parent
434bba33c0
commit
e47d2482c1
@ -1,3 +1,5 @@
|
||||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
"use strict";
|
||||
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
||||
@ -15,6 +17,10 @@ XPCOMUtils.defineLazyModuleGetter(this, "Services",
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
|
||||
"resource://gre/modules/Timer.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "serviceWorkerManager",
|
||||
"@mozilla.org/serviceworkers/manager;1",
|
||||
"nsIServiceWorkerManager");
|
||||
|
||||
/**
|
||||
* A number of iterations after which to yield time back
|
||||
* to the system.
|
||||
@ -105,6 +111,22 @@ function clearPluginData(options) {
|
||||
return sanitizer.items.pluginData.clear(makeRange(options));
|
||||
}
|
||||
|
||||
let clearServiceWorkers = Task.async(function* () {
|
||||
// Clearing service workers does not support timestamps.
|
||||
let yieldCounter = 0;
|
||||
|
||||
// Iterate through the service workers and remove them.
|
||||
let serviceWorkers = serviceWorkerManager.getAllRegistrations();
|
||||
for (let i = 0; i < serviceWorkers.length; i++) {
|
||||
let sw = serviceWorkers.queryElementAt(i, Ci.nsIServiceWorkerRegistrationInfo);
|
||||
let host = sw.principal.URI.host;
|
||||
serviceWorkerManager.removeAndPropagate(host);
|
||||
if (++yieldCounter % YIELD_PERIOD == 0) {
|
||||
yield new Promise(resolve => setTimeout(resolve, 0)); // Don't block the main thread too long.
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function doRemoval(options, dataToRemove, extension) {
|
||||
if (options.originTypes &&
|
||||
(options.originTypes.protectedWeb || options.originTypes.extension)) {
|
||||
@ -138,6 +160,9 @@ function doRemoval(options, dataToRemove, extension) {
|
||||
case "pluginData":
|
||||
removalPromises.push(clearPluginData(options));
|
||||
break;
|
||||
case "serviceWorkers":
|
||||
removalPromises.push(clearServiceWorkers());
|
||||
break;
|
||||
default:
|
||||
invalidDataTypes.push(dataType);
|
||||
}
|
||||
|
@ -17,6 +17,8 @@ support-files =
|
||||
file_language_ja.html
|
||||
file_language_tlh.html
|
||||
file_dummy.html
|
||||
file_serviceWorker.html
|
||||
serviceWorker.js
|
||||
searchSuggestionEngine.xml
|
||||
searchSuggestionEngine.sjs
|
||||
../../../../../toolkit/components/extensions/test/mochitest/head_webrequest.js
|
||||
@ -32,6 +34,7 @@ support-files =
|
||||
[browser_ext_browsingData_formData.js]
|
||||
[browser_ext_browsingData_history.js]
|
||||
[browser_ext_browsingData_pluginData.js]
|
||||
[browser_ext_browsingData_serviceWorkers.js]
|
||||
[browser_ext_commands_execute_browser_action.js]
|
||||
[browser_ext_commands_execute_page_action.js]
|
||||
[browser_ext_commands_getAll.js]
|
||||
|
@ -0,0 +1,89 @@
|
||||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
"use strict";
|
||||
|
||||
add_task(function* setup() {
|
||||
yield SpecialPowers.pushPrefEnv({
|
||||
set: [["dom.serviceWorkers.exemptFromPerDomainMax", true],
|
||||
["dom.serviceWorkers.enabled", true],
|
||||
["dom.serviceWorkers.testing.enabled", true]],
|
||||
});
|
||||
});
|
||||
|
||||
add_task(function* testServiceWorkers() {
|
||||
function background() {
|
||||
const PAGE = "/browser/browser/components/extensions/test/browser/file_serviceWorker.html";
|
||||
|
||||
browser.runtime.onMessage.addListener(msg => {
|
||||
browser.test.sendMessage("serviceWorkerRegistered");
|
||||
});
|
||||
|
||||
browser.test.onMessage.addListener(async (msg) => {
|
||||
await browser.browsingData.remove({}, {serviceWorkers: true});
|
||||
browser.test.sendMessage("serviceWorkersRemoved");
|
||||
});
|
||||
|
||||
// Create two serviceWorkers.
|
||||
browser.tabs.create({url: `http://mochi.test:8888${PAGE}`});
|
||||
browser.tabs.create({url: `http://example.com${PAGE}`});
|
||||
}
|
||||
|
||||
function contentScript() {
|
||||
window.addEventListener("message", msg => { // eslint-disable-line mozilla/balanced-listeners
|
||||
if (msg.data == "serviceWorkerRegistered") {
|
||||
browser.runtime.sendMessage("serviceWorkerRegistered");
|
||||
}
|
||||
}, true);
|
||||
}
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
background,
|
||||
manifest: {
|
||||
permissions: ["browsingData", "tabs"],
|
||||
"content_scripts": [{
|
||||
"matches": [
|
||||
"http://mochi.test/*/file_serviceWorker.html",
|
||||
"http://example.com/*/file_serviceWorker.html",
|
||||
],
|
||||
"js": ["script.js"],
|
||||
"run_at": "document_start",
|
||||
}],
|
||||
},
|
||||
files: {
|
||||
"script.js": contentScript,
|
||||
},
|
||||
});
|
||||
|
||||
let serviceWorkerManager = SpecialPowers.Cc["@mozilla.org/serviceworkers/manager;1"]
|
||||
.getService(SpecialPowers.Ci.nsIServiceWorkerManager);
|
||||
|
||||
let win = yield BrowserTestUtils.openNewBrowserWindow();
|
||||
yield focusWindow(win);
|
||||
|
||||
yield extension.startup();
|
||||
yield extension.awaitMessage("serviceWorkerRegistered");
|
||||
yield extension.awaitMessage("serviceWorkerRegistered");
|
||||
|
||||
let serviceWorkers = [];
|
||||
// Even though we await the registrations by waiting for the messages,
|
||||
// sometimes the serviceWorkers are still not registered at this point.
|
||||
while (serviceWorkers.length < 2) {
|
||||
serviceWorkers = serviceWorkerManager.getAllRegistrations();
|
||||
yield new Promise(resolve => setTimeout(resolve, 1));
|
||||
}
|
||||
is(serviceWorkers.length, 2, "ServiceWorkers have been registered.");
|
||||
|
||||
extension.sendMessage();
|
||||
|
||||
yield extension.awaitMessage("serviceWorkersRemoved");
|
||||
|
||||
// The serviceWorkers and not necessarily removed immediately.
|
||||
while (serviceWorkers.length > 0) {
|
||||
serviceWorkers = serviceWorkerManager.getAllRegistrations();
|
||||
yield new Promise(resolve => setTimeout(resolve, 1));
|
||||
}
|
||||
is(serviceWorkers.length, 0, "ServiceWorkers have been removed.");
|
||||
|
||||
yield extension.unload();
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
navigator.serviceWorker.register("serviceWorker.js").then(() => {
|
||||
window.postMessage("serviceWorkerRegistered", "*");
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
This is a test page.
|
||||
</body>
|
||||
<html>
|
Loading…
x
Reference in New Issue
Block a user