mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-20 07:17:32 +09:00
Issue #1587 - Part 5: Hook FetchObserver up to the Fetch API
This commit is contained in:
parent
6722d7f4b4
commit
3d2ca85edd
11 changed files with 399 additions and 75 deletions
|
|
@ -88,7 +88,7 @@ function testAbortedFetch() {
|
|||
var fc = new FetchController();
|
||||
fc.abort();
|
||||
|
||||
fetch('data:,foo', { signal: fc.signal }).then(() => {
|
||||
fetch('slow.sjs', { signal: fc.signal }).then(() => {
|
||||
ok(false, "Fetch should not return a resolved promise");
|
||||
}, e => {
|
||||
is(e.name, "AbortError", "We have an abort error");
|
||||
|
|
@ -98,7 +98,7 @@ function testAbortedFetch() {
|
|||
function testFetchAndAbort() {
|
||||
var fc = new FetchController();
|
||||
|
||||
var p = fetch('data:,foo', { signal: fc.signal });
|
||||
var p = fetch('slow.sjs', { signal: fc.signal });
|
||||
fc.abort();
|
||||
|
||||
p.then(() => {
|
||||
|
|
@ -109,49 +109,21 @@ function testFetchAndAbort() {
|
|||
}
|
||||
|
||||
function testWorkerAbortedFetch() {
|
||||
function worker() {
|
||||
var fc = new FetchController();
|
||||
fc.abort();
|
||||
|
||||
fetch('data:,foo', { signal: fc.signal }).then(() => {
|
||||
postMessage(false);
|
||||
}, e => {
|
||||
postMessage(e.name == "AbortError");
|
||||
});
|
||||
}
|
||||
|
||||
var str = worker.toString();
|
||||
var content = str.substring(0, str.length - 1).split('\n').splice(1).join(' ');
|
||||
var url = URL.createObjectURL(new Blob([content], { type: "application/javascript" }));
|
||||
var w = new Worker(url);
|
||||
var w = new Worker('worker_fetch_controller.js');
|
||||
w.onmessage = function(e) {
|
||||
ok(e.data, "Abort + Fetch works in workers");
|
||||
next();
|
||||
}
|
||||
w.postMessage('testWorkerAbortedFetch');
|
||||
}
|
||||
|
||||
function testWorkerFetchAndAbort() {
|
||||
function worker() {
|
||||
var fc = new FetchController();
|
||||
|
||||
var p = fetch('data:,foo', { signal: fc.signal });
|
||||
fc.abort();
|
||||
|
||||
p.then(() => {
|
||||
postMessage(false);
|
||||
}, e => {
|
||||
postMessage(e.name == "AbortError");
|
||||
});
|
||||
}
|
||||
|
||||
var str = worker.toString();
|
||||
var content = str.substring(0, str.length - 1).split('\n').splice(1).join(' ');
|
||||
var url = URL.createObjectURL(new Blob([content], { type: "application/javascript" }));
|
||||
var w = new Worker(url);
|
||||
var w = new Worker('worker_fetch_controller.js');
|
||||
w.onmessage = function(e) {
|
||||
ok(e.data, "Abort + Fetch works in workers");
|
||||
next();
|
||||
}
|
||||
w.postMessage('testWorkerFetchAndAbort');
|
||||
}
|
||||
|
||||
var steps = [
|
||||
|
|
|
|||
|
|
@ -10,12 +10,125 @@ function is(a, b, msg) {
|
|||
function testObserver() {
|
||||
ok("FetchObserver" in self, "We have a FetchObserver prototype");
|
||||
|
||||
fetch('data:,foo', { observe: o => {
|
||||
fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', { observe: o => {
|
||||
ok(!!o, "We have an observer");
|
||||
ok(o instanceof FetchObserver, "The correct object has been passed");
|
||||
is(o.state, "requesting", "By default the state is requesting");
|
||||
next();
|
||||
}});
|
||||
}
|
||||
|
||||
function testObserveAbort() {
|
||||
var fc = new FetchController();
|
||||
|
||||
fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', {
|
||||
signal: fc.signal,
|
||||
observe: o => {
|
||||
o.onstatechange = () => {
|
||||
ok(true, "StateChange event dispatched");
|
||||
if (o.state == "aborted") {
|
||||
ok(true, "Aborted!");
|
||||
next();
|
||||
}
|
||||
}
|
||||
fc.abort();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function testObserveComplete() {
|
||||
var fc = new FetchController();
|
||||
|
||||
fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', {
|
||||
signal: fc.signal,
|
||||
observe: o => {
|
||||
o.onstatechange = () => {
|
||||
ok(true, "StateChange event dispatched");
|
||||
if (o.state == "complete") {
|
||||
ok(true, "Operation completed");
|
||||
next();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function testObserveErrored() {
|
||||
var fc = new FetchController();
|
||||
|
||||
fetch('foo: bar', {
|
||||
signal: fc.signal,
|
||||
observe: o => {
|
||||
o.onstatechange = () => {
|
||||
ok(true, "StateChange event dispatched");
|
||||
if (o.state == "errored") {
|
||||
ok(true, "Operation completed");
|
||||
next();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function testObserveResponding() {
|
||||
var fc = new FetchController();
|
||||
|
||||
fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', {
|
||||
signal: fc.signal,
|
||||
observe: o => {
|
||||
o.onstatechange = () => {
|
||||
if (o.state == "responding") {
|
||||
ok(true, "We have responding events");
|
||||
next();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function workify(worker) {
|
||||
function methods() {
|
||||
function ok(a, msg) {
|
||||
postMessage( { type: 'check', state: !!a, message: msg });
|
||||
};
|
||||
function is(a, b, msg) {
|
||||
postMessage( { type: 'check', state: a === b, message: msg });
|
||||
};
|
||||
function next() {
|
||||
postMessage( { type: 'finish' });
|
||||
};
|
||||
}
|
||||
|
||||
var str = methods.toString();
|
||||
var methodsContent = str.substring(0, str.length - 1).split('\n').splice(1).join('\n');
|
||||
|
||||
str = worker.toString();
|
||||
var workerContent = str.substring(0, str.length - 1).split('\n').splice(1).join('\n');
|
||||
|
||||
var content = methodsContent + workerContent;
|
||||
var url = URL.createObjectURL(new Blob([content], { type: "application/javascript" }));
|
||||
var w = new Worker(url);
|
||||
w.onmessage = e => {
|
||||
if (e.data.type == 'check') {
|
||||
ok(e.data.state, "WORKER: " + e.data.message);
|
||||
} else if (e.data.type == 'finish') {
|
||||
next();
|
||||
} else {
|
||||
ok(false, "Something went wrong");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var steps = [
|
||||
testObserver,
|
||||
testObserveAbort,
|
||||
function() { workify(testObserveAbort); },
|
||||
testObserveComplete,
|
||||
function() { workify(testObserveComplete); },
|
||||
testObserveErrored,
|
||||
function() { workify(testObserveErrored); },
|
||||
testObserveResponding,
|
||||
function() { workify(testObserveResponding); },
|
||||
];
|
||||
|
||||
function next() {
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@ support-files =
|
|||
reroute.html
|
||||
reroute.js
|
||||
reroute.js^headers^
|
||||
slow.sjs
|
||||
sw_reroute.js
|
||||
empty.js
|
||||
empty.js^headers^
|
||||
worker_temporaryFileBlob.js
|
||||
common_temporaryFileBlob.js
|
||||
worker_fetch_controller.js
|
||||
!/dom/xhr/tests/file_XHR_binary1.bin
|
||||
!/dom/xhr/tests/file_XHR_binary1.bin^headers^
|
||||
!/dom/xhr/tests/file_XHR_binary2.bin
|
||||
|
|
|
|||
11
dom/tests/mochitest/fetch/slow.sjs
Normal file
11
dom/tests/mochitest/fetch/slow.sjs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
function handleRequest(request, response)
|
||||
{
|
||||
response.processAsync();
|
||||
|
||||
timer = Components.classes["@mozilla.org/timer;1"].
|
||||
createInstance(Components.interfaces.nsITimer);
|
||||
timer.init(function() {
|
||||
response.write("Here the content. But slowly.");
|
||||
response.finish();
|
||||
}, 1000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
|
||||
}
|
||||
|
|
@ -12,7 +12,8 @@
|
|||
<body>
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
SpecialPowers.pushPrefEnv({"set": [["dom.fetchObserver.enabled", true ]]}, () => {
|
||||
SpecialPowers.pushPrefEnv({"set": [["dom.fetchObserver.enabled", true ],
|
||||
["dom.fetchController.enabled", true ]]}, () => {
|
||||
let ifr = document.createElement('iframe');
|
||||
ifr.src = "file_fetch_observer.html";
|
||||
document.body.appendChild(ifr);
|
||||
|
|
|
|||
27
dom/tests/mochitest/fetch/worker_fetch_controller.js
Normal file
27
dom/tests/mochitest/fetch/worker_fetch_controller.js
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
function testWorkerAbortedFetch() {
|
||||
var fc = new FetchController();
|
||||
fc.abort();
|
||||
|
||||
fetch('slow.sjs', { signal: fc.signal }).then(() => {
|
||||
postMessage(false);
|
||||
}, e => {
|
||||
postMessage(e.name == "AbortError");
|
||||
});
|
||||
}
|
||||
|
||||
function testWorkerFetchAndAbort() {
|
||||
var fc = new FetchController();
|
||||
|
||||
var p = fetch('slow.sjs', { signal: fc.signal });
|
||||
fc.abort();
|
||||
|
||||
p.then(() => {
|
||||
postMessage(false);
|
||||
}, e => {
|
||||
postMessage(e.name == "AbortError");
|
||||
});
|
||||
}
|
||||
|
||||
onmessage = function(e) {
|
||||
self[e.data]();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue