Skip to content

Commit

Permalink
auto merge of #1488 : brunoabinader/servo/document-implementation, r=…
Browse files Browse the repository at this point in the history
…Ms2ger

Creates a DOMImplementation struct corresponding to DOMImplementation
WebIDL. Also implements a getter for Document::implementation.

Closes #1486.
  • Loading branch information
bors-servo committed Jan 14, 2014
2 parents 8f0f2d9 + 60dd40f commit 32bf796
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 4 deletions.
4 changes: 4 additions & 0 deletions src/components/script/dom/bindings/codegen/Bindings.conf
Expand Up @@ -160,6 +160,10 @@ DOMInterfaces = {
],
},

'DOMImplementation': {
'nativeType': 'DOMImplementation',
},

'DOMParser': {
'nativeType': 'DOMParser',
},
Expand Down
@@ -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);*/
};
3 changes: 1 addition & 2 deletions src/components/script/dom/bindings/codegen/Document.webidl
Expand Up @@ -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;
Expand Down
14 changes: 12 additions & 2 deletions src/components/script/dom/document.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -119,7 +121,8 @@ impl Document {
window: window,
doctype: doctype,
title: ~"",
idmap: HashMap::new()
idmap: HashMap::new(),
implementation: None
}
}

Expand Down Expand Up @@ -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())
}
Expand Down
36 changes: 36 additions & 0 deletions 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_
}
}
1 change: 1 addition & 0 deletions src/components/script/script.rc
Expand Up @@ -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;
Expand Down
17 changes: 17 additions & 0 deletions 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>

0 comments on commit 32bf796

Please sign in to comment.