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:
Andrew Shu 2018-04-18 13:30:22 -07:00
parent 3695fc4efc
commit 68c4791c7d
11 changed files with 39 additions and 76 deletions

View file

@ -25,6 +25,7 @@ use net_traits::{CoreResourceMsg, IpcSend};
use profile_traits::ipc;
use profile_traits::ipc::channel;
use script_traits::ScriptMsg;
use servo_url::ServoUrl;
use std::cell::Cell;
enum PushOrReplace {
@ -108,7 +109,7 @@ impl History {
cx: *mut JSContext,
data: HandleValue,
_title: DOMString,
_url: Option<USVString>,
url: Option<USVString>,
push_or_replace: PushOrReplace) -> ErrorResult {
// Step 1
let document = self.window.Document();
@ -126,8 +127,41 @@ impl History {
// Step 5
let serialized_data = StructuredCloneData::write(cx, data)?.move_to_arraybuffer();
// TODO: Steps 6-7 Url Handling
// https://github.com/servo/servo/issues/19157
let new_url: ServoUrl = match url {
// 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
let state_id = match push_or_replace {
@ -162,8 +196,8 @@ impl History {
// TODO: Step 9 Update current entry to represent a GET request
// https://github.com/servo/servo/issues/19156
// TODO: Step 10 Set document's URL to new URL
// https://github.com/servo/servo/issues/19157
// Step 10
document.set_url(new_url);
// Step 11
let global_scope = self.window.upcast::<GlobalScope>();