зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
1b1308abac
Коммит
cdc1e1cd9a
|
@ -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
|
||||
|
Загрузка…
Ссылка в новой задаче