aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r--components/script/dom/document.rs152
1 files changed, 54 insertions, 98 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index d68f085af83..d862736ad7b 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -4196,151 +4196,108 @@ impl DocumentMethods for Document {
}
// https://html.spec.whatwg.org/multipage/#dom-document-open
- fn Open(&self, _type: Option<DOMString>, replace: DOMString) -> Fallible<DomRoot<Document>> {
+ fn Open(&self, _unused1: Option<DOMString>, _unused2: Option<DOMString>) -> Fallible<DomRoot<Document>> {
+ // Step 1
if !self.is_html_document() {
- // Step 1.
return Err(Error::InvalidState);
}
- // Step 2.
+ // Step 2
if self.throw_on_dynamic_markup_insertion_counter.get() > 0 {
return Err(Error::InvalidState);
}
- if !self.is_active() {
- // Step 3.
- return Ok(DomRoot::from_ref(self));
- }
-
+ // Step 3
let entry_responsible_document = GlobalScope::entry().as_window().Document();
+ // Step 4
// This check is same-origin not same-origin-domain.
// https://github.com/whatwg/html/issues/2282
// https://github.com/whatwg/html/pull/2288
if !self.origin.same_origin(&entry_responsible_document.origin) {
- // Step 4.
return Err(Error::Security);
}
+ // Step 5
if self
.get_current_parser()
.map_or(false, |parser| parser.is_active())
{
- // Step 5.
return Ok(DomRoot::from_ref(self));
}
- // Step 6.
- // TODO: ignore-opens-during-unload counter check.
-
- // Step 7, 8.
- // TODO: check session history's state.
- let replace = replace.eq_ignore_ascii_case("replace");
-
- // Step 9.
- // TODO: salvageable flag.
-
- // Step 10.
- // TODO: prompt to unload.
+ // Step 6
+ if self.is_prompting_or_unloading() {
+ return Ok(DomRoot::from_ref(self));
+ }
window_from_node(self).set_navigation_start();
- // Step 11.
- // TODO: unload.
-
- // Step 12.
- self.abort();
+ // Step 7
+ // TODO: https://github.com/servo/servo/issues/21937
+ if self.has_browsing_context() {
+ self.abort();
+ }
- // Step 13.
+ // Step 8
for node in self.upcast::<Node>().traverse_preorder() {
node.upcast::<EventTarget>().remove_all_listeners();
}
- // Step 14.
- // TODO: remove any tasks associated with the Document in any task source.
+ // Step 9
+ if self.window.Document() == DomRoot::from_ref(self) {
+ self.window.upcast::<EventTarget>().remove_all_listeners();
+ }
- // Step 15.
+ // Step 10
+ // TODO: https://github.com/servo/servo/issues/21936
Node::replace_all(None, self.upcast::<Node>());
- // Steps 16, 17.
- // Let's not?
- // TODO: https://github.com/whatwg/html/issues/1698
-
- // Step 18.
- self.implementation.set(None);
- self.images.set(None);
- self.embeds.set(None);
- self.links.set(None);
- self.forms.set(None);
- self.scripts.set(None);
- self.anchors.set(None);
- self.applets.set(None);
- *self.stylesheets.borrow_mut() = DocumentStylesheetSet::new();
- self.animation_frame_ident.set(0);
- self.animation_frame_list.borrow_mut().clear();
- self.pending_restyles.borrow_mut().clear();
- self.target_element.set(None);
- *self.last_click_info.borrow_mut() = None;
-
- // Step 19.
- // TODO: Set the active document of document's browsing context to document with window.
-
- // Step 20.
- // TODO: Replace document's singleton objects with new instances of those objects, created in window's Realm.
-
- // Step 21.
- self.set_encoding(UTF_8);
-
- // Step 22.
- // TODO: reload override buffer.
-
- // Step 23.
- // TODO: salvageable flag.
-
- let url = entry_responsible_document.url();
+ // Step 11
+ if self.is_fully_active() {
+ let mut new_url = entry_responsible_document.url();
+ if entry_responsible_document != DomRoot::from_ref(self) {
+ new_url.set_fragment(None);
+ }
+ // TODO: https://github.com/servo/servo/issues/21939
+ self.set_url(new_url);
+ }
- // Step 24.
- self.set_url(url.clone());
+ // Step 12
+ // TODO: https://github.com/servo/servo/issues/21938
- // Step 25.
- // TODO: mute iframe load.
+ // Step 13
+ self.set_quirks_mode(QuirksMode::NoQuirks);
- // Step 26.
+ // Step 14
let resource_threads = self
.window
.upcast::<GlobalScope>()
.resource_threads()
.clone();
*self.loader.borrow_mut() =
- DocumentLoader::new_with_threads(resource_threads, Some(url.clone()));
- ServoParser::parse_html_script_input(self, url, "text/html");
-
- // Step 27.
- self.ready_state.set(DocumentReadyState::Interactive);
-
- // Step 28.
- // TODO: remove history traversal tasks.
+ DocumentLoader::new_with_threads(resource_threads, Some(self.url()));
+ ServoParser::parse_html_script_input(self, self.url(), "text/html");
- // Step 29.
- // TODO: truncate session history.
+ // Step 15
+ self.ready_state.set(DocumentReadyState::Loading);
- // Step 30.
- // TODO: remove earlier entries.
+ // Step 16
+ // Handled when creating the parser in step 14
- if !replace {
- // Step 31.
- // TODO: add history entry.
- }
-
- // Step 32.
- // TODO: clear fired unload flag.
-
- // Step 33 is handled when creating the parser in step 26.
-
- // Step 34.
+ // Step 17
Ok(DomRoot::from_ref(self))
}
+ // https://html.spec.whatwg.org/multipage/#dom-document-open-window
+ fn Open_(&self, url: DOMString, target: DOMString, features: DOMString) -> Fallible<DomRoot<WindowProxy>> {
+ // WhatWG spec states this should always return a WindowProxy, but the spec for WindowProxy.open states
+ // it optionally returns a WindowProxy. Assume an error if window.open returns none.
+ // See https://github.com/whatwg/html/issues/4091
+ let context = self.browsing_context().ok_or(Error::InvalidAccess)?;
+ context.open(url, target, features).ok_or(Error::InvalidAccess)
+ }
+
// https://html.spec.whatwg.org/multipage/#dom-document-write
fn Write(&self, text: Vec<DOMString>) -> ErrorResult {
if !self.is_html_document() {
@@ -4364,13 +4321,12 @@ impl DocumentMethods for Document {
// Either there is no parser, which means the parsing ended;
// or script nesting level is 0, which means the method was
// called from outside a parser-executed script.
- if self.ignore_destructive_writes_counter.get() > 0 {
+ if self.is_prompting_or_unloading() || self.ignore_destructive_writes_counter.get() > 0 {
// Step 4.
- // TODO: handle ignore-opens-during-unload counter.
return Ok(());
}
// Step 5.
- self.Open(None, "".into())?;
+ self.Open(None, None)?;
self.get_current_parser().unwrap()
},
};