mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00: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::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>();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue