aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf9
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py2
-rw-r--r--src/components/script/dom/bindings/codegen/HTMLHeadElement.webidl15
-rw-r--r--src/components/script/dom/bindings/node.rs9
-rw-r--r--src/components/script/dom/bindings/utils.rs3
-rw-r--r--src/components/script/dom/document.rs5
-rw-r--r--src/components/script/dom/domparser.rs5
-rw-r--r--src/components/script/dom/element.rs121
-rw-r--r--src/components/script/dom/htmlelement.rs16
-rw-r--r--src/components/script/dom/node.rs6
-rw-r--r--src/components/script/html/hubbub_html_parser.rs11
-rw-r--r--src/components/script/script.rc1
-rw-r--r--src/test/html/test_bindings.html2
13 files changed, 132 insertions, 73 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf
index e1f3a798484..a5d76bcd8d4 100644
--- a/src/components/script/dom/bindings/codegen/Bindings.conf
+++ b/src/components/script/dom/bindings/codegen/Bindings.conf
@@ -234,6 +234,11 @@ DOMInterfaces = {
'pointerType': ''
},
+'HTMLHeadElement': {
+ 'nativeType': 'AbstractNode<ScriptView>',
+ 'pointerType': ''
+},
+
'HTMLOptionsCollection': [
{
'nativeType': 'nsHTMLOptionCollection',
@@ -561,13 +566,9 @@ addExternalIface('CSSRule')
addExternalIface('CSSValue')
addExternalIface('DOMStringList', nativeType='nsDOMStringList',
headerFile='nsDOMLists.h')
-#addExternalIface('Element', nativeType='AbstractNode<ScriptView>', pointerType='')
addExternalIface('File')
addExternalIface('HitRegionOptions', nativeType='nsISupports')
-#addExternalIface('HTMLElement', nativeType='AbstractNode<ScriptView>', pointerType='')
-addExternalIface('HTMLHeadElement', nativeType='AbstractNode<ScriptView>', pointerType='')
addExternalIface('ImageData', nativeType='mozilla::dom::ImageData')
-#addExternalIface('Node', nativeType='AbstractNode<ScriptView>', pointerType='')
addExternalIface('PaintRequest')
addExternalIface('SVGLength')
addExternalIface('SVGMatrix')
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 0a47c631bf4..f8c4bc0ff4f 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -4605,7 +4605,7 @@ class CGBindingRoot(CGThing):
'dom::characterdata::CharacterData', #XXXjdm
'dom::node::{AbstractNode, Node, Text}', #XXXjdm
'dom::document::{Document, AbstractDocument}', #XXXjdm
- 'dom::element::Element', #XXXjdm
+ 'dom::element::{Element, HTMLHeadElement}', #XXXjdm
'dom::htmlelement::HTMLElement', #XXXjdm
'dom::htmldocument::HTMLDocument', #XXXjdm
'dom::bindings::utils::*',
diff --git a/src/components/script/dom/bindings/codegen/HTMLHeadElement.webidl b/src/components/script/dom/bindings/codegen/HTMLHeadElement.webidl
new file mode 100644
index 00000000000..ca6bc3819e1
--- /dev/null
+++ b/src/components/script/dom/bindings/codegen/HTMLHeadElement.webidl
@@ -0,0 +1,15 @@
+/* -*- 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://www.whatwg.org/specs/web-apps/current-work/#the-head-element
+ *
+ * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and
+ * Opera Software ASA. You are granted a license to use, reproduce
+ * and create derivative works of this document.
+ */
+
+// http://www.whatwg.org/specs/web-apps/current-work/#the-head-element
+interface HTMLHeadElement : HTMLElement {};
diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs
index fa2b31acf9a..6ca2e61d6aa 100644
--- a/src/components/script/dom/bindings/node.rs
+++ b/src/components/script/dom/bindings/node.rs
@@ -2,11 +2,11 @@
* 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::TextBinding;
use dom::bindings::element;
use dom::bindings::text;
use dom::bindings::utils;
use dom::bindings::utils::{CacheableWrapper, WrapperCache, DerivedWrapper};
+use dom::element::{HTMLHeadElementTypeId, HTMLHeadElement};
use dom::node::{AbstractNode, Node, ElementNodeTypeId, TextNodeTypeId, CommentNodeTypeId};
use dom::node::{DoctypeNodeTypeId, ScriptView, Text};
@@ -65,13 +65,16 @@ pub fn init(compartment: @mut Compartment) {
#[allow(non_implicitly_copyable_typarams)]
pub fn create(cx: *JSContext, node: &mut AbstractNode<ScriptView>) -> *JSObject {
match node.type_id() {
+ ElementNodeTypeId(HTMLHeadElementTypeId) => {
+ let node: @mut HTMLHeadElement = unsafe { cast::transmute(node.raw_object()) };
+ node.wrap_object_shared(cx, ptr::null())
+ }
ElementNodeTypeId(_) => element::create(cx, node).ptr,
CommentNodeTypeId |
DoctypeNodeTypeId => text::create(cx, node).ptr,
TextNodeTypeId => {
- let mut unused = false;
let node: @mut Text = unsafe { cast::transmute(node.raw_object()) };
- TextBinding::Wrap(cx, ptr::null(), node, &mut unused)
+ node.wrap_object_shared(cx, ptr::null())
}
}
}
diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs
index 21c1c99e9fb..3834fdf08c4 100644
--- a/src/components/script/dom/bindings/utils.rs
+++ b/src/components/script/dom/bindings/utils.rs
@@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::PrototypeList;
+use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH;
use dom::bindings::node;
use dom::node::{AbstractNode, ScriptView};
use script_task::page_from_context;
@@ -401,7 +402,7 @@ pub struct ConstantSpec {
pub struct DOMClass {
// A list of interfaces that this object implements, in order of decreasing
// derivedness.
- interface_chain: [PrototypeList::id::ID, ..3 /*max prototype chain length*/],
+ interface_chain: [PrototypeList::id::ID, ..MAX_PROTO_CHAIN_LENGTH],
unused: bool, // DOMObjectIsISupports (always false)
native_hooks: *NativePropertyHooks
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index 836bdeb2e36..7c41a58134f 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -5,10 +5,11 @@
use dom::bindings::codegen::DocumentBinding;
use dom::bindings::utils::{DOMString, WrapperCache, ErrorResult, null_string, str};
use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box, DerivedWrapper};
-use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId, Element};
+use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId};
use dom::event::Event;
use dom::htmlcollection::HTMLCollection;
use dom::htmldocument::HTMLDocument;
+use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, ScriptView, Node};
use dom::window::Window;
use dom::windowproxy::WindowProxy;
@@ -102,7 +103,7 @@ impl Document {
pub fn Constructor(owner: @mut Window, _rv: &mut ErrorResult) -> AbstractDocument {
let root = @HTMLHtmlElement {
- parent: Element::new(HTMLHtmlElementTypeId, ~"html")
+ parent: HTMLElement::new(HTMLHtmlElementTypeId, ~"html")
};
let cx = unsafe {(*owner.page).js_info.get_ref().js_compartment.cx.ptr};
diff --git a/src/components/script/dom/domparser.rs b/src/components/script/dom/domparser.rs
index 15d36c68048..58756ca8710 100644
--- a/src/components/script/dom/domparser.rs
+++ b/src/components/script/dom/domparser.rs
@@ -6,8 +6,9 @@ use dom::bindings::codegen::DOMParserBinding;
use dom::bindings::codegen::DOMParserBinding::SupportedTypeValues::{Text_html, Text_xml};
use dom::bindings::utils::{DOMString, ErrorResult, WrapperCache, CacheableWrapper};
use dom::document::{AbstractDocument, Document, XML};
-use dom::element::{Element, HTMLHtmlElement, HTMLHtmlElementTypeId};
+use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId};
use dom::htmldocument::HTMLDocument;
+use dom::htmlelement::HTMLElement;
use dom::node::Node;
use dom::window::Window;
@@ -42,7 +43,7 @@ impl DOMParser {
-> AbstractDocument {
unsafe {
let root = @HTMLHtmlElement {
- parent: Element::new(HTMLHtmlElementTypeId, ~"html")
+ parent: HTMLElement::new(HTMLHtmlElementTypeId, ~"html")
};
let root = Node::as_abstract_node((*self.owner.page).js_info.get_ref().js_compartment.cx.ptr, root);
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs
index 6aa9518d0b9..ec412ade152 100644
--- a/src/components/script/dom/element.rs
+++ b/src/components/script/dom/element.rs
@@ -4,11 +4,13 @@
//! Element nodes.
+use dom::bindings::codegen::HTMLHeadElementBinding;
use dom::bindings::utils::{DOMString, null_string, ErrorResult};
use dom::bindings::utils::{CacheableWrapper, BindingObject, WrapperCache};
use dom::clientrect::ClientRect;
use dom::clientrectlist::ClientRectList;
use dom::htmlcollection::HTMLCollection;
+use dom::htmlelement::HTMLElement;
use dom::node::{ElementNodeTypeId, Node, ScriptView, AbstractNode};
use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery};
use layout_interface::{ContentBoxesResponse};
@@ -30,6 +32,22 @@ pub struct Element {
attrs: ~[Attr],
}
+impl CacheableWrapper for Element {
+ fn get_wrappercache(&mut self) -> &mut WrapperCache {
+ self.parent.get_wrappercache()
+ }
+
+ fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject {
+ fail!("no wrapping")
+ }
+}
+
+impl BindingObject for Element {
+ fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> {
+ self.parent.GetParentObject(cx)
+ }
+}
+
#[deriving(Eq)]
pub enum ElementTypeId {
HTMLAnchorElementTypeId,
@@ -73,57 +91,74 @@ pub enum ElementTypeId {
// Regular old elements
//
-pub struct HTMLAnchorElement { parent: Element }
-pub struct HTMLAsideElement { parent: Element }
-pub struct HTMLBRElement { parent: Element }
-pub struct HTMLBodyElement { parent: Element }
-pub struct HTMLBoldElement { parent: Element }
-pub struct HTMLDivElement { parent: Element }
-pub struct HTMLFontElement { parent: Element }
-pub struct HTMLFormElement { parent: Element }
-pub struct HTMLHRElement { parent: Element }
-pub struct HTMLHeadElement { parent: Element }
-pub struct HTMLHtmlElement { parent: Element }
-pub struct HTMLInputElement { parent: Element }
-pub struct HTMLItalicElement { parent: Element }
-pub struct HTMLLinkElement { parent: Element }
-pub struct HTMLListItemElement { parent: Element }
-pub struct HTMLMetaElement { parent: Element }
-pub struct HTMLOListElement { parent: Element }
-pub struct HTMLOptionElement { parent: Element }
-pub struct HTMLParagraphElement { parent: Element }
-pub struct HTMLScriptElement { parent: Element }
-pub struct HTMLSectionElement { parent: Element }
-pub struct HTMLSelectElement { parent: Element }
-pub struct HTMLSmallElement { parent: Element }
-pub struct HTMLSpanElement { parent: Element }
-pub struct HTMLStyleElement { parent: Element }
-pub struct HTMLTableBodyElement { parent: Element }
-pub struct HTMLTableCellElement { parent: Element }
-pub struct HTMLTableElement { parent: Element }
-pub struct HTMLTableRowElement { parent: Element }
-pub struct HTMLTitleElement { parent: Element }
-pub struct HTMLUListElement { parent: Element }
-pub struct UnknownElement { parent: Element }
+pub struct HTMLAnchorElement { parent: HTMLElement }
+pub struct HTMLAsideElement { parent: HTMLElement }
+pub struct HTMLBRElement { parent: HTMLElement }
+pub struct HTMLBodyElement { parent: HTMLElement }
+pub struct HTMLBoldElement { parent: HTMLElement }
+pub struct HTMLDivElement { parent: HTMLElement }
+pub struct HTMLFontElement { parent: HTMLElement }
+pub struct HTMLFormElement { parent: HTMLElement }
+pub struct HTMLHRElement { parent: HTMLElement }
+pub struct HTMLHeadElement { parent: HTMLElement }
+pub struct HTMLHtmlElement { parent: HTMLElement }
+pub struct HTMLInputElement { parent: HTMLElement }
+pub struct HTMLItalicElement { parent: HTMLElement }
+pub struct HTMLLinkElement { parent: HTMLElement }
+pub struct HTMLListItemElement { parent: HTMLElement }
+pub struct HTMLMetaElement { parent: HTMLElement }
+pub struct HTMLOListElement { parent: HTMLElement }
+pub struct HTMLOptionElement { parent: HTMLElement }
+pub struct HTMLParagraphElement { parent: HTMLElement }
+pub struct HTMLScriptElement { parent: HTMLElement }
+pub struct HTMLSectionElement { parent: HTMLElement }
+pub struct HTMLSelectElement { parent: HTMLElement }
+pub struct HTMLSmallElement { parent: HTMLElement }
+pub struct HTMLSpanElement { parent: HTMLElement }
+pub struct HTMLStyleElement { parent: HTMLElement }
+pub struct HTMLTableBodyElement { parent: HTMLElement }
+pub struct HTMLTableCellElement { parent: HTMLElement }
+pub struct HTMLTableElement { parent: HTMLElement }
+pub struct HTMLTableRowElement { parent: HTMLElement }
+pub struct HTMLTitleElement { parent: HTMLElement }
+pub struct HTMLUListElement { parent: HTMLElement }
+pub struct UnknownElement { parent: HTMLElement }
+
+impl CacheableWrapper for HTMLHeadElement {
+ fn get_wrappercache(&mut self) -> &mut WrapperCache {
+ self.parent.get_wrappercache()
+ }
+
+ fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject {
+ let mut unused = false;
+ HTMLHeadElementBinding::Wrap(cx, scope, self, &mut unused)
+ }
+}
+
+impl BindingObject for HTMLHeadElement {
+ fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> {
+ self.parent.GetParentObject(cx)
+ }
+}
//
// Fancier elements
//
pub struct HTMLHeadingElement {
- parent: Element,
+ parent: HTMLElement,
level: HeadingLevel,
}
pub struct HTMLIframeElement {
- parent: Element,
+ parent: HTMLElement,
frame: Option<Url>,
subpage_id: Option<SubpageId>,
size_future_chan: Option<ChanOne<Size2D<uint>>>,
}
pub struct HTMLImageElement {
- parent: Element,
+ parent: HTMLElement,
image: Option<Url>,
}
@@ -439,19 +474,3 @@ pub enum HeadingLevel {
Heading5,
Heading6,
}
-
-impl CacheableWrapper for Element {
- fn get_wrappercache(&mut self) -> &mut WrapperCache {
- self.parent.get_wrappercache()
- }
-
- fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject {
- fail!(~"need to implement wrapping");
- }
-}
-
-impl BindingObject for Element {
- fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> {
- self.parent.GetParentObject(cx)
- }
-}
diff --git a/src/components/script/dom/htmlelement.rs b/src/components/script/dom/htmlelement.rs
index 24abfb516b5..a28c87afad5 100644
--- a/src/components/script/dom/htmlelement.rs
+++ b/src/components/script/dom/htmlelement.rs
@@ -2,9 +2,10 @@
* 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::HTMLElementBinding;
use dom::bindings::utils::{DOMString, null_string, ErrorResult};
use dom::bindings::utils::{CacheableWrapper, BindingObject, WrapperCache};
-use dom::element::Element;
+use dom::element::{Element, ElementTypeId};
use dom::node::{AbstractNode, ScriptView};
use js::jsapi::{JSObject, JSContext, JSVal};
use js::JSVAL_NULL;
@@ -14,6 +15,14 @@ pub struct HTMLElement {
}
impl HTMLElement {
+ pub fn new(type_id: ElementTypeId, tag_name: ~str) -> HTMLElement {
+ HTMLElement {
+ parent: Element::new(type_id, tag_name)
+ }
+ }
+}
+
+impl HTMLElement {
pub fn Title(&self) -> DOMString {
null_string
}
@@ -134,8 +143,9 @@ impl CacheableWrapper for HTMLElement {
self.parent.get_wrappercache()
}
- fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject {
- fail!(~"need to implement wrapping");
+ fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject {
+ let mut unused = false;
+ HTMLElementBinding::Wrap(cx, scope, self, &mut unused)
}
}
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index b156cf34a2e..258717492af 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -4,6 +4,7 @@
//! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements.
+use dom::bindings::codegen::TextBinding;
use dom::bindings::node;
use dom::bindings::utils::{WrapperCache, DOMString, null_string, ErrorResult};
use dom::bindings::utils::{BindingObject, CacheableWrapper};
@@ -694,8 +695,9 @@ impl CacheableWrapper for Text {
self.parent.get_wrappercache()
}
- fn wrap_object_shared(@mut self, _cx: *JSContext, _scope: *JSObject) -> *JSObject {
- fail!(~"need to implement wrapping");
+ fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject {
+ let mut unused = false;
+ TextBinding::Wrap(cx, scope, self, &mut unused)
}
}
diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs
index 8a2a086d813..b58050e943b 100644
--- a/src/components/script/html/hubbub_html_parser.rs
+++ b/src/components/script/html/hubbub_html_parser.rs
@@ -28,6 +28,7 @@ use dom::element::{HTMLAnchorElement, HTMLAsideElement, HTMLBRElement, HTMLBodyE
use dom::element::{HTMLHeadingElementTypeId, Heading1, Heading2, Heading3, Heading4, Heading5,
Heading6};
use dom::element::{Element, Attr};
+use dom::htmlelement::HTMLElement;
use dom::node::{AbstractNode, Comment, Doctype, ElementNodeTypeId, Node, ScriptView};
use dom::node::{Text};
use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser};
@@ -57,7 +58,7 @@ macro_rules! handle_element(
($cx: expr, $tag:expr, $string:expr, $type_id:expr, $ctor:ident, [ $(($field:ident : $field_init:expr)),* ]) => (
if eq_slice($tag, $string) {
let _element = @$ctor {
- parent: Element::new($type_id, ($tag).to_str()),
+ parent: HTMLElement::new($type_id, ($tag).to_str()),
$(
$field: $field_init,
)*
@@ -272,7 +273,7 @@ pub fn parse_html(cx: *JSContext,
let url3 = url.clone();
// Build the root node.
- let root = @HTMLHtmlElement { parent: Element::new(HTMLHtmlElementTypeId, ~"html") };
+ let root = @HTMLHtmlElement { parent: HTMLElement::new(HTMLHtmlElementTypeId, ~"html") };
let root = unsafe { Node::as_abstract_node(cx, root) };
debug!("created new node");
let mut parser = hubbub::Parser("UTF-8", false);
@@ -337,7 +338,8 @@ pub fn parse_html(cx: *JSContext,
ElementNodeTypeId(HTMLIframeElementTypeId) => {
do node.with_mut_iframe_element |iframe_element| {
- let src_opt = iframe_element.parent.get_attr("src").map(|x| x.to_str());
+ let elem = &mut iframe_element.parent.parent;
+ let src_opt = elem.get_attr("src").map(|x| x.to_str());
for src_opt.iter().advance |src| {
let iframe_url = make_url(src.clone(), Some(url2.clone()));
iframe_element.frame = Some(iframe_url.clone());
@@ -359,7 +361,8 @@ pub fn parse_html(cx: *JSContext,
ElementNodeTypeId(HTMLImageElementTypeId) => {
do node.with_mut_image_element |image_element| {
- let src_opt = image_element.parent.get_attr("src").map(|x| x.to_str());
+ let elem = &mut image_element.parent.parent;
+ let src_opt = elem.get_attr("src").map(|x| x.to_str());
match src_opt {
None => {}
Some(src) => {
diff --git a/src/components/script/script.rc b/src/components/script/script.rc
index d4ad4ca147d..b2acc25b5c4 100644
--- a/src/components/script/script.rc
+++ b/src/components/script/script.rc
@@ -45,6 +45,7 @@ pub mod dom {
pub mod HTMLCollectionBinding;
pub mod HTMLDocumentBinding;
pub mod HTMLElementBinding;
+ pub mod HTMLHeadElementBinding;
pub mod MouseEventBinding;
pub mod NodeBinding;
pub mod PrototypeList;
diff --git a/src/test/html/test_bindings.html b/src/test/html/test_bindings.html
index 8bf4d28504e..60744cafcf1 100644
--- a/src/test/html/test_bindings.html
+++ b/src/test/html/test_bindings.html
@@ -1,4 +1,6 @@
+<!DOCTYPE html>
<html>
+ <!-- comment -->
<head>
<script src="test_bindings.js"></script>
</head>