aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2014-01-14 09:30:58 -0800
committerbors-servo <release+servo@mozilla.com>2014-01-14 09:30:58 -0800
commit32bf796efca9b2de42a86815b78926ca0785c19f (patch)
treecc21d936844598fd7d532c00e8f2703d388855ad /src
parent8f0f2d9ef50e6ea0b21450a63f9e37b89a6f68d2 (diff)
parent60dd40f41258402c5b9358986fb71c7dd9b3dc6b (diff)
downloadservo-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')
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf4
-rw-r--r--src/components/script/dom/bindings/codegen/DOMImplementation.webidl26
-rw-r--r--src/components/script/dom/bindings/codegen/Document.webidl3
-rw-r--r--src/components/script/dom/document.rs14
-rw-r--r--src/components/script/dom/domimplementation.rs36
-rw-r--r--src/components/script/script.rc1
-rw-r--r--src/test/html/content/test_document_implementation.html17
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>