forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Bug 1417463 - Default accept header should follow the fetch spec - te…
…sts, r=mayhemer
- Loading branch information
Showing
4 changed files
with
157 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
<!DOCTYPE HTML> | ||
<html> | ||
<head> | ||
<title>Accept header</title> | ||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> | ||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> | ||
</head> | ||
<body> | ||
<script> | ||
|
||
// All the requests are sent to test_accept_header.sjs which will return | ||
// different content based on the queryString. When the queryString is 'get', | ||
// test_accept_header.sjs returns a JSON object with the latest request and its | ||
// accept header value. | ||
|
||
function test_last_request_and_continue(query, expected) { | ||
fetch("test_accept_header.sjs?get").then(r => r.json()).then(json => { | ||
is(json.type, query, "Expected: " + query); | ||
is(json.accept, expected, "Accept header: " + expected); | ||
next(); | ||
}); | ||
} | ||
|
||
function test_iframe() { | ||
let observer = new PerformanceObserver(function(list, obj) { | ||
obj.disconnect(); | ||
|
||
list.getEntries().forEach(entry => { | ||
if (entry.name.endsWith("test_accept_header.sjs?iframe")) { | ||
obj.disconnect(); | ||
test_last_request_and_continue("iframe", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); | ||
} | ||
}); | ||
}); | ||
|
||
observer.observe({entryTypes: ["resource"]}); | ||
|
||
let ifr = document.createElement("iframe"); | ||
ifr.src = "test_accept_header.sjs?iframe"; | ||
document.body.appendChild(ifr); | ||
} | ||
|
||
function test_image() { | ||
let i = new Image(); | ||
i.src = "test_accept_header.sjs?image"; | ||
i.onload = function() { | ||
// Fetch spec says we should have: "image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5" | ||
test_last_request_and_continue("image", "image/webp,*/*"); | ||
} | ||
} | ||
|
||
function test_style() { | ||
let observer = new PerformanceObserver(function(list, obj) { | ||
obj.disconnect(); | ||
|
||
list.getEntries().forEach(entry => { | ||
if (entry.name.endsWith("test_accept_header.sjs?style")) { | ||
obj.disconnect(); | ||
test_last_request_and_continue("style", "text/css,*/*;q=0.1"); | ||
} | ||
}); | ||
}); | ||
|
||
observer.observe({entryTypes: ["resource"]}); | ||
|
||
let head = document.getElementsByTagName("head")[0]; | ||
let link = document.createElement("link"); | ||
link.rel = "stylesheet"; | ||
link.type = "text/css"; | ||
link.href = "test_accept_header.sjs?style"; | ||
head.appendChild(link); | ||
} | ||
|
||
function test_worker() { | ||
let w = new Worker("test_accept_header.sjs?worker"); | ||
w.onmessage = function() { | ||
test_last_request_and_continue("worker", "*/*"); | ||
} | ||
} | ||
|
||
let tests = [ | ||
test_iframe, | ||
test_image, | ||
test_style, | ||
test_worker, | ||
]; | ||
|
||
function next() { | ||
if (tests.length == 0) { | ||
SimpleTest.finish(); | ||
return; | ||
} | ||
|
||
let test = tests.shift(); | ||
test(); | ||
} | ||
|
||
SimpleTest.waitForExplicitFinish(); | ||
|
||
SpecialPowers.pushPrefEnv({ "set": [ | ||
[ "dom.enable_performance_observer", true ] | ||
]}, next); | ||
|
||
</script> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
function handleRequest(request, response) { | ||
response.setStatusLine(request.httpVersion, "200", "OK"); | ||
|
||
if (request.queryString == "worker") { | ||
response.setHeader("Content-Type", "application/json", false); | ||
response.write("postMessage(42)"); | ||
|
||
setState("data", JSON.stringify({type: "worker", accept: request.getHeader("Accept") })); | ||
return; | ||
} | ||
|
||
if (request.queryString == "image") { | ||
// A 1x1 PNG image. | ||
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain) | ||
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" + | ||
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="); | ||
|
||
response.setHeader("Content-Type", "image/png", false); | ||
response.write(IMAGE); | ||
|
||
setState("data", JSON.stringify({type: "image", accept: request.getHeader("Accept") })); | ||
return; | ||
} | ||
|
||
if (request.queryString == "style") { | ||
response.setHeader("Content-Type", "text/css", false); | ||
response.write(""); | ||
|
||
setState("data", JSON.stringify({type: "style", accept: request.getHeader("Accept") })); | ||
return; | ||
} | ||
|
||
if (request.queryString == "iframe") { | ||
response.setHeader("Content-Type", "text/html", false); | ||
response.write("<h1>Hello world!</h1>"); | ||
|
||
setState("data", JSON.stringify({type: "iframe", accept: request.getHeader("Accept") })); | ||
return; | ||
} | ||
|
||
if (request.queryString == "get") { | ||
response.setHeader("Content-Type", "text/javascript", false); | ||
response.write(getState("data")); | ||
|
||
setState("data", ""); | ||
return; | ||
} | ||
} |