diff options
author | bors-servo <release+servo@mozilla.com> | 2014-01-14 09:30:58 -0800 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-01-14 09:30:58 -0800 |
commit | 32bf796efca9b2de42a86815b78926ca0785c19f (patch) | |
tree | cc21d936844598fd7d532c00e8f2703d388855ad /src | |
parent | 8f0f2d9ef50e6ea0b21450a63f9e37b89a6f68d2 (diff) | |
parent | 60dd40f41258402c5b9358986fb71c7dd9b3dc6b (diff) | |
download | servo-32bf796efca9b2de42a86815b78926ca0785c19f.tar.gz servo-32bf796efca9b2de42a86815b78926ca0785c19f.zip |
auto merge of #1488 : brunoabinader/servo/document-implementation, r=Ms2ger
Creates a DOMImplementation struct corresponding to DOMImplementation
WebIDL. Also implements a getter for Document::implementation.
Closes #1486.
Diffstat (limited to 'src')
7 files changed, 97 insertions, 4 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 12d15d37fe9..4f4630861de 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -160,6 +160,10 @@ DOMInterfaces = { ], }, +'DOMImplementation': { + 'nativeType': 'DOMImplementation', +}, + 'DOMParser': { 'nativeType': 'DOMParser', }, diff --git a/src/components/script/dom/bindings/codegen/DOMImplementation.webidl b/src/components/script/dom/bindings/codegen/DOMImplementation.webidl new file mode 100644 index 00000000000..8ce96554c99 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/DOMImplementation.webidl @@ -0,0 +1,26 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://dom.spec.whatwg.org/#interface-domimplementation + * + * Copyright: + * To the extent possible under law, the editors have waived all copyright and + * related or neighboring rights to this work. + */ + +interface DOMImplementation { + /*boolean hasFeature(DOMString feature, + [TreatNullAs=EmptyString] DOMString version);*/ + /*[Throws] + DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, + DOMString systemId);*/ + /*[Throws] + Document createDocument(DOMString? namespace, + [TreatNullAs=EmptyString] DOMString qualifiedName, + optional DocumentType? doctype = null);*/ + /*[Throws] + Document createHTMLDocument(optional DOMString title);*/ +}; diff --git a/src/components/script/dom/bindings/codegen/Document.webidl b/src/components/script/dom/bindings/codegen/Document.webidl index 1a0cab2cda6..4f7fafee7b4 100644 --- a/src/components/script/dom/bindings/codegen/Document.webidl +++ b/src/components/script/dom/bindings/codegen/Document.webidl @@ -25,8 +25,7 @@ enum VisibilityState { "hidden", "visible" }; /* http://dom.spec.whatwg.org/#interface-document */ [Constructor] interface Document : Node { - /*[Throws] - readonly attribute DOMImplementation implementation;*/ + readonly attribute DOMImplementation implementation; // readonly attribute DOMString URL; // readonly attribute DOMString documentURI; // readonly attribute DOMString compatMode; diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 214fd7363f6..c85a6c63ab2 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -9,6 +9,7 @@ use dom::bindings::utils::{ErrorResult, Fallible, NotSupported, InvalidCharacter use dom::bindings::utils::DOMString; use dom::bindings::utils::{xml_name_type, InvalidXMLName}; use dom::documentfragment::DocumentFragment; +use dom::domimplementation::DOMImplementation; use dom::element::{Element}; use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId, HTMLBodyElementTypeId, HTMLFrameSetElementTypeId}; use dom::event::{AbstractEvent, Event}; @@ -87,7 +88,8 @@ pub struct Document { window: @mut Window, doctype: DocumentType, title: ~str, - idmap: HashMap<DOMString, AbstractNode> + idmap: HashMap<DOMString, AbstractNode>, + implementation: Option<@mut DOMImplementation> } impl Document { @@ -119,7 +121,8 @@ impl Document { window: window, doctype: doctype, title: ~"", - idmap: HashMap::new() + idmap: HashMap::new(), + implementation: None } } @@ -156,6 +159,13 @@ impl Reflectable for Document { } impl Document { + pub fn Implementation(&mut self) -> @mut DOMImplementation { + if self.implementation.is_none() { + self.implementation = Some(DOMImplementation::new(self.window)); + } + self.implementation.unwrap() + } + pub fn GetDoctype(&self) -> Option<AbstractNode> { self.node.children().find(|child| child.is_doctype()) } diff --git a/src/components/script/dom/domimplementation.rs b/src/components/script/dom/domimplementation.rs new file mode 100644 index 00000000000..e0b3617d1b1 --- /dev/null +++ b/src/components/script/dom/domimplementation.rs @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::DOMImplementationBinding; +use dom::bindings::utils::{Reflector, Reflectable, reflect_dom_object}; +use dom::window::Window; + +pub struct DOMImplementation { + owner: @mut Window, + reflector_: Reflector +} + +impl DOMImplementation { + pub fn new_inherited(owner: @mut Window) -> DOMImplementation { + DOMImplementation { + owner: owner, + reflector_: Reflector::new() + } + } + + pub fn new(owner: @mut Window) -> @mut DOMImplementation { + reflect_dom_object(@mut DOMImplementation::new_inherited(owner), owner, + DOMImplementationBinding::Wrap) + } +} + +impl Reflectable for DOMImplementation { + fn reflector<'a>(&'a self) -> &'a Reflector { + &self.reflector_ + } + + fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector { + &mut self.reflector_ + } +} diff --git a/src/components/script/script.rc b/src/components/script/script.rc index dd12823c003..b7a642f4295 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -55,6 +55,7 @@ pub mod dom { pub mod document; pub mod documentfragment; pub mod documenttype; + pub mod domimplementation; pub mod domparser; pub mod element; pub mod event; diff --git a/src/test/html/content/test_document_implementation.html b/src/test/html/content/test_document_implementation.html new file mode 100644 index 00000000000..eddfb23de0c --- /dev/null +++ b/src/test/html/content/test_document_implementation.html @@ -0,0 +1,17 @@ +<html> + <head> + <script src="harness.js"></script> + <script> + // test1: basic test + { + isnot(document.implementation, null, "test1-0, basic test"); + is_a(document.implementation, DOMImplementation, "test1-1, basic test"); + + var implementation = document.implementation; + is(document.implementation, implementation, "test1-2, basic test"); + } + + finish(); + </script> + </head> +</html> |