Bug 1612519 - Fix "Terminating worker revokes its URLs" WPT, r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D61360

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andrea Marchesini 2020-02-02 09:24:37 +00:00
Родитель 1b1308abac
Коммит cdc1e1cd9a
6 изменённых файлов: 76 добавлений и 110 удалений

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

@ -59,7 +59,6 @@ support-files =
window3.html
window_redirect.html
worker_blobify.js
worker_deblobify.js
!/toolkit/content/tests/browser/common/mockTransfer.js
[browser_broadcastChannel.js]

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

@ -6,7 +6,6 @@ const TEST_PAGE =
"http://mochi.test:8888/browser/browser/components/" +
"originattributes/test/browser/file_firstPartyBasic.html";
const SCRIPT_WORKER_BLOBIFY = "worker_blobify.js";
const SCRIPT_WORKER_DEBLOBIFY = "worker_deblobify.js";
function page_blobify(browser, input) {
return SpecialPowers.spawn(browser, [input], function(contentInput) {
@ -59,28 +58,35 @@ function page_deblobify(browser, blobURL) {
});
}
function workerIO(browser, scriptFile, message) {
return SpecialPowers.spawn(browser, [{ scriptFile, message }], function(
args
) {
let worker = new content.Worker(args.scriptFile);
let promise = new content.Promise(function(resolve) {
let listenFunction = function(event) {
worker.removeEventListener("message", listenFunction);
worker.terminate();
resolve(event.data);
};
worker.addEventListener("message", listenFunction);
});
worker.postMessage(args.message);
return promise;
});
function workerIO(browser, what, message) {
return SpecialPowers.spawn(
browser,
[
{
scriptFile: SCRIPT_WORKER_BLOBIFY,
message: { message, what },
},
],
function(args) {
if (!content.worker) {
content.worker = new content.Worker(args.scriptFile);
}
let promise = new content.Promise(function(resolve) {
let listenFunction = function(event) {
content.worker.removeEventListener("message", listenFunction);
resolve(event.data);
};
content.worker.addEventListener("message", listenFunction);
});
content.worker.postMessage(args.message);
return promise;
}
);
}
let worker_blobify = (browser, input) =>
workerIO(browser, SCRIPT_WORKER_BLOBIFY, input);
let worker_blobify = (browser, input) => workerIO(browser, "blobify", input);
let worker_deblobify = (browser, blobURL) =>
workerIO(browser, SCRIPT_WORKER_DEBLOBIFY, blobURL);
workerIO(browser, "deblobify", blobURL);
function doTest(blobify, deblobify) {
let blobURL = null;

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

@ -1,11 +1,49 @@
// Wait for a string to be posted to this worker.
// Create a blob containing this string, and then
// post back a blob URL pointing to the blob.
self.addEventListener("message", function(message) {
try {
var blobURL = URL.createObjectURL(new Blob([message.data]));
postMessage({ blobURL });
} catch (e) {
postMessage({ error: e.message });
/* eslint-env worker */
var postStringInBlob = function(blobObject) {
var fileReader = new FileReaderSync();
var result = fileReader.readAsText(blobObject);
postMessage(result);
};
self.addEventListener("message", e => {
if (e.data.what === "blobify") {
try {
let blobURL = URL.createObjectURL(new Blob([e.data.message]));
postMessage({ blobURL });
} catch (ex) {
postMessage({ error: ex.message });
}
return;
}
if (e.data.what === "deblobify") {
if ("error" in e.data.message) {
postMessage(e.data.message);
return;
}
let blobURL = e.data.message.blobURL,
xhr = new XMLHttpRequest();
try {
xhr.open("GET", blobURL, true);
xhr.onload = function() {
postStringInBlob(xhr.response);
};
xhr.onerror = function() {
postMessage({ error: "xhr error" });
};
xhr.responseType = "blob";
xhr.send();
} catch (ex) {
postMessage({ error: ex.message });
}
return;
}
postMessage("Invalid operation!");
});

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

@ -1,33 +0,0 @@
// Wait for a blob URL to be posted to this worker.
// Obtain the blob, and read the string contained in it.
// Post back the string.
/* eslint-env worker */
var postStringInBlob = function(blobObject) {
var fileReader = new FileReaderSync();
var result = fileReader.readAsText(blobObject);
postMessage(result);
};
self.addEventListener("message", function(message) {
if ("error" in message.data) {
postMessage(message.data);
return;
}
var blobURL = message.data.blobURL,
xhr = new XMLHttpRequest();
try {
xhr.open("GET", blobURL, true);
xhr.onload = function() {
postStringInBlob(xhr.response);
};
xhr.onerror = function() {
postMessage({ error: "xhr error" });
};
xhr.responseType = "blob";
xhr.send();
} catch (e) {
postMessage({ error: e.message });
}
});

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

@ -48,24 +48,6 @@ class CreateURLRunnable : public WorkerMainThreadRunnable {
return false;
}
if (!mWorkerPrivate->IsSharedWorker() &&
!mWorkerPrivate->IsServiceWorker()) {
// Walk up to top worker object.
WorkerPrivate* wp = mWorkerPrivate;
while (WorkerPrivate* parent = wp->GetParent()) {
wp = parent;
}
nsCOMPtr<nsIScriptContext> sc = wp->GetScriptContext();
// We could not have a ScriptContext in JSM code. In this case, we leak.
if (sc) {
nsCOMPtr<nsIGlobalObject> global = sc->GetGlobalObject();
MOZ_ASSERT(global);
global->RegisterHostObjectURI(url);
}
}
mURL = NS_ConvertUTF8toUTF16(url);
return true;
}
@ -99,24 +81,6 @@ class RevokeURLRunnable : public WorkerMainThreadRunnable {
BlobURLProtocolHandler::RemoveDataEntry(url);
}
if (!mWorkerPrivate->IsSharedWorker() &&
!mWorkerPrivate->IsServiceWorker()) {
// Walk up to top worker object.
WorkerPrivate* wp = mWorkerPrivate;
while (WorkerPrivate* parent = wp->GetParent()) {
wp = parent;
}
nsCOMPtr<nsIScriptContext> sc = wp->GetScriptContext();
// We could not have a ScriptContext in JSM code. In this case, we leak.
if (sc) {
nsCOMPtr<nsIGlobalObject> global = sc->GetGlobalObject();
MOZ_ASSERT(global);
global->UnregisterHostObjectURI(url);
}
}
return true;
}
};
@ -163,12 +127,10 @@ void URLWorker::CreateObjectURL(const GlobalObject& aGlobal, Blob& aBlob,
return;
}
if (workerPrivate->IsSharedWorker() || workerPrivate->IsServiceWorker()) {
WorkerGlobalScope* scope = workerPrivate->GlobalScope();
MOZ_ASSERT(scope);
WorkerGlobalScope* scope = workerPrivate->GlobalScope();
MOZ_ASSERT(scope);
scope->RegisterHostObjectURI(NS_ConvertUTF16toUTF8(aResult));
}
scope->RegisterHostObjectURI(NS_ConvertUTF16toUTF8(aResult));
}
/* static */
@ -185,12 +147,10 @@ void URLWorker::RevokeObjectURL(const GlobalObject& aGlobal,
return;
}
if (workerPrivate->IsSharedWorker() || workerPrivate->IsServiceWorker()) {
WorkerGlobalScope* scope = workerPrivate->GlobalScope();
MOZ_ASSERT(scope);
WorkerGlobalScope* scope = workerPrivate->GlobalScope();
MOZ_ASSERT(scope);
scope->UnregisterHostObjectURI(NS_ConvertUTF16toUTF8(aUrl));
}
scope->UnregisterHostObjectURI(NS_ConvertUTF16toUTF8(aUrl));
}
/* static */

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

@ -1,4 +0,0 @@
[url-lifetime.html]
[Terminating worker revokes its URLs]
expected: FAIL