Bug 1321303 - Part 8: Implement browsingData serviceWorkers dataType, r=baku

MozReview-Commit-ID: 10zSlmaKjIj

--HG--
extra : rebase_source : 82ba465f0deb8c0cf3dc74e8b91307462b1af3a7
This commit is contained in:
Bob Silverberg 2016-12-23 16:27:46 -05:00
parent 434bba33c0
commit e47d2482c1
5 changed files with 133 additions and 0 deletions

View File

@ -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);
}

View File

@ -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]

View File

@ -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);
});

View File

@ -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>