From 60dd40f41258402c5b9358986fb71c7dd9b3dc6b Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Mon, 13 Jan 2014 17:10:58 -0400 Subject: [PATCH] Add DOMImplementation skeleton Creates a DOMImplementation struct corresponding to DOMImplementation WebIDL. Also implements a getter for Document::implementation. Closes #1486. --- .../script/dom/bindings/codegen/Bindings.conf | 4 +++ .../bindings/codegen/DOMImplementation.webidl | 26 ++++++++++++++ .../dom/bindings/codegen/Document.webidl | 3 +- src/components/script/dom/document.rs | 14 ++++++-- .../script/dom/domimplementation.rs | 36 +++++++++++++++++++ src/components/script/script.rc | 1 + .../content/test_document_implementation.html | 17 +++++++++ 7 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/DOMImplementation.webidl create mode 100644 src/components/script/dom/domimplementation.rs create mode 100644 src/test/html/content/test_document_implementation.html 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 + idmap: HashMap, + 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 { 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 @@ + + + + + +