mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
History: update document URL on pushState/replaceState
https://html.spec.whatwg.org/multipage/#dom-history-pushstate Steps 6, 7, 10
This commit is contained in:
parent
3695fc4efc
commit
68c4791c7d
11 changed files with 39 additions and 76 deletions
|
@ -25,6 +25,7 @@ use net_traits::{CoreResourceMsg, IpcSend};
|
||||||
use profile_traits::ipc;
|
use profile_traits::ipc;
|
||||||
use profile_traits::ipc::channel;
|
use profile_traits::ipc::channel;
|
||||||
use script_traits::ScriptMsg;
|
use script_traits::ScriptMsg;
|
||||||
|
use servo_url::ServoUrl;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
enum PushOrReplace {
|
enum PushOrReplace {
|
||||||
|
@ -108,7 +109,7 @@ impl History {
|
||||||
cx: *mut JSContext,
|
cx: *mut JSContext,
|
||||||
data: HandleValue,
|
data: HandleValue,
|
||||||
_title: DOMString,
|
_title: DOMString,
|
||||||
_url: Option<USVString>,
|
url: Option<USVString>,
|
||||||
push_or_replace: PushOrReplace) -> ErrorResult {
|
push_or_replace: PushOrReplace) -> ErrorResult {
|
||||||
// Step 1
|
// Step 1
|
||||||
let document = self.window.Document();
|
let document = self.window.Document();
|
||||||
|
@ -126,8 +127,41 @@ impl History {
|
||||||
// Step 5
|
// Step 5
|
||||||
let serialized_data = StructuredCloneData::write(cx, data)?.move_to_arraybuffer();
|
let serialized_data = StructuredCloneData::write(cx, data)?.move_to_arraybuffer();
|
||||||
|
|
||||||
// TODO: Steps 6-7 Url Handling
|
let new_url: ServoUrl = match url {
|
||||||
// https://github.com/servo/servo/issues/19157
|
// Step 6
|
||||||
|
Some(urlstring) => {
|
||||||
|
let document_url = document.url();
|
||||||
|
|
||||||
|
// Step 6.1
|
||||||
|
let new_url = match ServoUrl::parse_with_base(Some(&document_url), &urlstring.0) {
|
||||||
|
// Step 6.3
|
||||||
|
Ok(parsed_url) => parsed_url,
|
||||||
|
// Step 6.2
|
||||||
|
Err(_) => return Err(Error::Security),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 6.4
|
||||||
|
if new_url.scheme() != document_url.scheme() ||
|
||||||
|
new_url.host() != document_url.host() ||
|
||||||
|
new_url.port() != document_url.port() ||
|
||||||
|
new_url.username() != document_url.username() ||
|
||||||
|
new_url.password() != document_url.password()
|
||||||
|
{
|
||||||
|
return Err(Error::Security);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 6.5
|
||||||
|
if new_url.origin() != document_url.origin() {
|
||||||
|
return Err(Error::Security);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_url
|
||||||
|
},
|
||||||
|
// Step 7
|
||||||
|
None => {
|
||||||
|
document.url()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Step 8
|
// Step 8
|
||||||
let state_id = match push_or_replace {
|
let state_id = match push_or_replace {
|
||||||
|
@ -162,8 +196,8 @@ impl History {
|
||||||
// TODO: Step 9 Update current entry to represent a GET request
|
// TODO: Step 9 Update current entry to represent a GET request
|
||||||
// https://github.com/servo/servo/issues/19156
|
// https://github.com/servo/servo/issues/19156
|
||||||
|
|
||||||
// TODO: Step 10 Set document's URL to new URL
|
// Step 10
|
||||||
// https://github.com/servo/servo/issues/19157
|
document.set_url(new_url);
|
||||||
|
|
||||||
// Step 11
|
// Step 11
|
||||||
let global_scope = self.window.upcast::<GlobalScope>();
|
let global_scope = self.window.upcast::<GlobalScope>();
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
[008.html]
|
|
||||||
[history.pushState URL resolving should be done relative to the document, not the script]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[history.replaceState URL resolving should be done relative to the document, not the script]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
[009.html]
|
|
||||||
[HTTP Referer should use the pushed state]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[document.referrer should use the pushed state]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTTP Referer should use the replaced state]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[document.referrer should use the replaced state]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
[010.html]
|
|
||||||
[HTTP Referer should use the pushed state (before onload)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[document.referrer should use the pushed state (before onload)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[HTTP Referer should use the replaced state (before onload)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[document.referrer should use the replaced state (before onload)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
[011.html]
|
|
||||||
[pushed location should be reflected immediately]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[pushed location should be retained after the page has loaded]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
[012.html]
|
|
||||||
[replaced location should be reflected immediately]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[replaced location should be retained after the page has loaded]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[history_pushstate_err.html]
|
|
||||||
[history pushState SECURITY_ERR]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[history_replacestate_err.html]
|
|
||||||
[history replaceState SECURITY_ERR]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
[location_hash.html]
|
[location_hash.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
[location hash]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Setting location.hash on srcdoc iframe]
|
[Setting location.hash on srcdoc iframe]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[location_search.html]
|
|
||||||
type: testharness
|
|
||||||
[location search]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
[formAction_document_address.html]
|
|
||||||
type: testharness
|
|
||||||
[Check if button.formAction is the document's new address when formaction content attribute is missing and pushState has been used]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Check if input.formAction is the document's new address when formaction content attribute is missing and pushState has been used]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue