Bug 1298823 - Fix Request constructor - with "mode: navigate"

This commit is contained in:
janekptacijarabaci 2018-07-05 13:08:32 +02:00 committed by Roy Tam
commit 56c088c2d4
3 changed files with 17 additions and 33 deletions

View file

@ -338,8 +338,7 @@ Request::Constructor(const GlobalObject& aGlobal,
if (mode == RequestMode::Navigate ||
(aInit.IsAnyMemberPresent() && request->Mode() == RequestMode::Navigate)) {
aRv.ThrowTypeError<MSG_INVALID_REQUEST_MODE>(NS_LITERAL_STRING("navigate"));
return nullptr;
mode = RequestMode::Same_origin;
}
if (aInit.IsAnyMemberPresent()) {
@ -374,11 +373,7 @@ Request::Constructor(const GlobalObject& aGlobal,
nsresult rv = principal->CheckMayLoad(uri, /* report */ false,
/* allowIfInheritsPrincipal */ false);
if (NS_FAILED(rv)) {
nsAutoCString globalOrigin;
principal->GetOrigin(globalOrigin);
aRv.ThrowTypeError<MSG_CROSS_ORIGIN_REFERRER_URL>(referrer,
NS_ConvertUTF8toUTF16(globalOrigin));
return nullptr;
referrerURL.AssignLiteral(kFETCH_CLIENT_REFERRER_STR);
}
}
}
@ -403,11 +398,10 @@ Request::Constructor(const GlobalObject& aGlobal,
// this work in a single sync loop.
RefPtr<ReferrerSameOriginChecker> checker =
new ReferrerSameOriginChecker(worker, referrerURL, rv);
checker->Dispatch(Terminating, aRv);
if (aRv.Failed() || NS_FAILED(rv)) {
aRv.ThrowTypeError<MSG_CROSS_ORIGIN_REFERRER_URL>(referrer,
worker->GetLocationInfo().mOrigin);
return nullptr;
IgnoredErrorResult error;
checker->Dispatch(Terminating, error);
if (error.Failed() || NS_FAILED(rv)) {
referrerURL.AssignLiteral(kFETCH_CLIENT_REFERRER_STR);
}
}
}

View file

@ -152,12 +152,9 @@ function testHeaderGuard() {
}
function testMode() {
try {
var req = new Request("http://example.com", {mode: "navigate"});
ok(false, "Creating a Request with navigate RequestMode should throw a TypeError");
} catch(e) {
is(e.name, "TypeError", "Creating a Request with navigate RequestMode should throw a TypeError");
}
var req = new Request("http://example.com", {mode: "navigate"});
ok(true, "Creating a Request with navigate RequestMode should not throw.");
is(req.mode, "same-origin", "Request mode becomes same-origin");
}
function testMethod() {

View file

@ -148,28 +148,21 @@ onfetch = function(ev) {
}
else if (ev.request.url.includes("navigate.html")) {
var navigateModeCorrectlyChecked = false;
var requests = [ // should not throw
new Request(ev.request),
new Request(ev.request, undefined),
new Request(ev.request, null),
new Request(ev.request, {}),
new Request(ev.request, {someUnrelatedProperty: 42}),
new Request(ev.request, {method: "GET"}),
];
try {
var request3 = new Request(ev.request, {method: "GET"}); // should throw
} catch(e) {
navigateModeCorrectlyChecked = requests[0].mode == "navigate";
}
if (navigateModeCorrectlyChecked) {
ev.respondWith(Promise.resolve(
new Response("<script>window.frameElement.test_result = true;</script>", {
headers : {
"Content-Type": "text/html"
}
})
));
}
ev.respondWith(Promise.resolve(
new Response("<script>window.frameElement.test_result = true;</script>", {
headers : {
"Content-Type": "text/html"
}
})
));
}
else if (ev.request.url.includes("nonexistent_worker_script.js")) {