Merge pull request #2771 from jviereck/fix_2230_link_DOMImplementation_to_document

Link DOMImplementation to the Document; r=Ms2ger
This commit is contained in:
Ms2ger 2014-07-13 17:20:25 +02:00
commit df4bb6947e
2 changed files with 14 additions and 13 deletions

View file

@ -329,8 +329,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
// http://dom.spec.whatwg.org/#dom-document-implementation // http://dom.spec.whatwg.org/#dom-document-implementation
fn Implementation(&self) -> Temporary<DOMImplementation> { fn Implementation(&self) -> Temporary<DOMImplementation> {
if self.implementation.get().is_none() { if self.implementation.get().is_none() {
let window = self.window.root(); self.implementation.assign(Some(DOMImplementation::new(self)));
self.implementation.assign(Some(DOMImplementation::new(&*window)));
} }
Temporary::new(self.implementation.get().get_ref().clone()) Temporary::new(self.implementation.get().get_ref().clone())
} }

View file

@ -16,25 +16,26 @@ use dom::htmlhtmlelement::HTMLHtmlElement;
use dom::htmltitleelement::HTMLTitleElement; use dom::htmltitleelement::HTMLTitleElement;
use dom::node::{Node, NodeMethods}; use dom::node::{Node, NodeMethods};
use dom::text::Text; use dom::text::Text;
use dom::window::{Window, WindowMethods};
use servo_util::str::DOMString; use servo_util::str::DOMString;
#[deriving(Encodable)] #[deriving(Encodable)]
pub struct DOMImplementation { pub struct DOMImplementation {
owner: JS<Window>, document: JS<Document>,
reflector_: Reflector, reflector_: Reflector,
} }
impl DOMImplementation { impl DOMImplementation {
pub fn new_inherited(owner: &JSRef<Window>) -> DOMImplementation { pub fn new_inherited(document: &JSRef<Document>) -> DOMImplementation {
DOMImplementation { DOMImplementation {
owner: JS::from_rooted(owner), document: JS::from_rooted(document),
reflector_: Reflector::new(), reflector_: Reflector::new(),
} }
} }
pub fn new(owner: &JSRef<Window>) -> Temporary<DOMImplementation> { pub fn new(document: &JSRef<Document>) -> Temporary<DOMImplementation> {
reflect_dom_object(box DOMImplementation::new_inherited(owner), owner, let window = document.window.root();
reflect_dom_object(box DOMImplementation::new_inherited(document),
&*window,
DOMImplementationBinding::Wrap) DOMImplementationBinding::Wrap)
} }
} }
@ -63,8 +64,7 @@ impl<'a> DOMImplementationMethods for JSRef<'a, DOMImplementation> {
Name => Err(NamespaceError), Name => Err(NamespaceError),
// Step 3. // Step 3.
QName => { QName => {
let owner = self.owner.root(); let document = self.document.root();
let document = owner.deref().Document().root();
Ok(DocumentType::new(qname, Some(pubid), Some(sysid), &*document)) 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 // http://dom.spec.whatwg.org/#dom-domimplementation-createdocument
fn CreateDocument(&self, namespace: Option<DOMString>, qname: DOMString, fn CreateDocument(&self, namespace: Option<DOMString>, qname: DOMString,
maybe_doctype: Option<JSRef<DocumentType>>) -> Fallible<Temporary<Document>> { maybe_doctype: Option<JSRef<DocumentType>>) -> Fallible<Temporary<Document>> {
let win = self.owner.root(); let doc = self.document.root();
let win = doc.window.root();
// Step 1. // Step 1.
let doc = Document::new(&win.root_ref(), None, NonHTMLDocument, None).root(); 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 // http://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument
fn CreateHTMLDocument(&self, title: Option<DOMString>) -> Temporary<Document> { fn CreateHTMLDocument(&self, title: Option<DOMString>) -> Temporary<Document> {
let owner = self.owner.root(); let document = self.document.root();
let win = document.window.root();
// Step 1-2. // 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<Node> = NodeCast::from_ref(&*doc); let doc_node: &JSRef<Node> = NodeCast::from_ref(&*doc);
{ {