From 88b3998d59bf435c67e30ca9a0c16e273e114361 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Sat, 5 Jul 2014 12:49:37 +0200 Subject: [PATCH] Fix DOMImplementation should be linked to the Document This fixes issues 2230. --- src/components/script/dom/document.rs | 3 +-- .../script/dom/domimplementation.rs | 24 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 0bace6cf66a..3c205b881a0 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -339,8 +339,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-document-implementation fn Implementation(&self) -> Temporary { if self.implementation.get().is_none() { - let window = self.window.root(); - self.implementation.assign(Some(DOMImplementation::new(&*window))); + self.implementation.assign(Some(DOMImplementation::new(self))); } Temporary::new(self.implementation.get().get_ref().clone()) } diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs index f8460275705..2ab75dd5f11 100644 --- a/src/components/script/dom/domimplementation.rs +++ b/src/components/script/dom/domimplementation.rs @@ -16,25 +16,26 @@ use dom::htmlhtmlelement::HTMLHtmlElement; use dom::htmltitleelement::HTMLTitleElement; use dom::node::{Node, NodeMethods}; use dom::text::Text; -use dom::window::{Window, WindowMethods}; use servo_util::str::DOMString; #[deriving(Encodable)] pub struct DOMImplementation { - owner: JS, + document: JS, reflector_: Reflector, } impl DOMImplementation { - pub fn new_inherited(owner: &JSRef) -> DOMImplementation { + pub fn new_inherited(document: &JSRef) -> DOMImplementation { DOMImplementation { - owner: JS::from_rooted(owner), + document: JS::from_rooted(document), reflector_: Reflector::new(), } } - pub fn new(owner: &JSRef) -> Temporary { - reflect_dom_object(box DOMImplementation::new_inherited(owner), owner, + pub fn new(document: &JSRef) -> Temporary { + let window = document.window.root(); + reflect_dom_object(box DOMImplementation::new_inherited(document), + &*window, DOMImplementationBinding::Wrap) } } @@ -63,8 +64,7 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { Name => Err(NamespaceError), // Step 3. QName => { - let owner = self.owner.root(); - let document = owner.deref().Document().root(); + let document = self.document.root(); Ok(DocumentType::new(qname, Some(pubid), Some(sysid), &*document)) } } @@ -73,7 +73,8 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { // http://dom.spec.whatwg.org/#dom-domimplementation-createdocument fn CreateDocument(&self, namespace: Option, qname: DOMString, maybe_doctype: Option>) -> Fallible> { - let win = self.owner.root(); + let doc = self.document.root(); + let win = doc.window.root(); // Step 1. let doc = Document::new(&win.root_ref(), None, NonHTMLDocument, None).root(); @@ -117,10 +118,11 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> { // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument fn CreateHTMLDocument(&self, title: Option) -> Temporary { - let owner = self.owner.root(); + let document = self.document.root(); + let win = document.window.root(); // Step 1-2. - let doc = Document::new(&owner.root_ref(), None, HTMLDocument, None).root(); + let doc = Document::new(&win.root_ref(), None, HTMLDocument, None).root(); let doc_node: &JSRef = NodeCast::from_ref(&*doc); {