aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom')
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf4
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py35
-rw-r--r--src/components/script/dom/bindings/js.rs15
-rw-r--r--src/components/script/dom/bindings/utils.rs2
-rw-r--r--src/components/script/dom/document.rs4
-rw-r--r--src/components/script/dom/htmldatalistelement.rs12
-rw-r--r--src/components/script/dom/htmlfieldsetelement.rs17
-rw-r--r--src/components/script/dom/node.rs12
-rw-r--r--src/components/script/dom/window.rs25
9 files changed, 58 insertions, 68 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf
index 2380a0eaeed..eac06e8454d 100644
--- a/src/components/script/dom/bindings/codegen/Bindings.conf
+++ b/src/components/script/dom/bindings/codegen/Bindings.conf
@@ -142,12 +142,12 @@ addHTMLElement('HTMLBRElement')
addHTMLElement('HTMLCanvasElement')
addHTMLElement('HTMLDataElement')
addHTMLElement('HTMLDivElement')
-addHTMLElement('HTMLDataListElement')
+addHTMLElement('HTMLDataListElement', needsAbstract=['options'])
addHTMLElement('HTMLDirectoryElement')
addHTMLElement('HTMLDListElement')
addHTMLElement('HTMLElement')
addHTMLElement('HTMLEmbedElement')
-addHTMLElement('HTMLFieldSetElement')
+addHTMLElement('HTMLFieldSetElement', needsAbstract=['elements'])
addHTMLElement('HTMLFontElement')
addHTMLElement('HTMLFormElement')
addHTMLElement('HTMLFrameElement')
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 43d31b68914..a14358d99c6 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -2010,7 +2010,7 @@ class CGAbstractMethod(CGThing):
self.templateArgs = templateArgs
self.pub = pub;
self.unsafe = unsafe
- def _argstring(self, declare):
+ def _argstring(self):
return ', '.join([a.declare() for a in self.args])
def _template(self):
if self.templateArgs is None:
@@ -2039,12 +2039,12 @@ class CGAbstractMethod(CGThing):
def _unsafe_close(self):
return "\n }\n" if self.unsafe else ""
- def define(self, fromDeclare=False):
- return self.definition_prologue(fromDeclare) + "\n" + self.definition_body() + self.definition_epilogue()
+ def define(self):
+ return self.definition_prologue() + "\n" + self.definition_body() + self.definition_epilogue()
- def definition_prologue(self, fromDeclare):
+ def definition_prologue(self):
return "%sfn %s%s(%s)%s {%s" % (self._decorators(), self.name, self._template(),
- self._argstring(fromDeclare), self._returnType(), self._unsafe_open())
+ self._argstring(), self._returnType(), self._unsafe_open())
def definition_epilogue(self):
return "%s}\n" % self._unsafe_close()
def definition_body(self):
@@ -2057,7 +2057,7 @@ def DOMObjectPointerArg(descriptor):
return DOMObjectPointerType(descriptor) + descriptor.concreteType
def CreateBindingJSObject(descriptor, parent=None):
- create = " let raw: *mut %s = &mut *aObject;\n" % descriptor.concreteType;
+ create = " let mut raw: JS<%s> = JS::from_raw(&mut *aObject);\n" % descriptor.concreteType
if descriptor.proxy:
assert not descriptor.createGlobal
handler = """
@@ -2068,9 +2068,7 @@ def CreateBindingJSObject(descriptor, parent=None):
&PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void),
proto, %s,
ptr::null(), ptr::null());
- if obj.is_null() {
- return ptr::null();
- }
+ assert!(obj.is_not_null());
""" % (parent)
else:
@@ -2078,9 +2076,7 @@ def CreateBindingJSObject(descriptor, parent=None):
create += " let obj = CreateDOMGlobal(aCx, &Class.base);\n"
else:
create += " let obj = JS_NewObject(aCx, &Class.base, proto, %s);\n" % parent
- create += """ if obj.is_null() {
- return ptr::null();
- }
+ create += """ assert!(obj.is_not_null());
JS_SetReservedSlot(obj, DOM_OBJECT_SLOT as u32,
PrivateValue(squirrel_away_unboxed(aObject) as *libc::c_void));
@@ -2096,7 +2092,8 @@ class CGWrapMethod(CGAbstractMethod):
else:
args = [Argument('*JSContext', 'aCx'),
Argument(DOMObjectPointerArg(descriptor), 'aObject', mutable=True)]
- CGAbstractMethod.__init__(self, descriptor, 'Wrap', '*JSObject', args, pub=True)
+ retval = 'JS<%s>' % descriptor.concreteType
+ CGAbstractMethod.__init__(self, descriptor, 'Wrap', retval, args, pub=True)
def definition_body(self):
if not self.descriptor.createGlobal:
@@ -2107,22 +2104,20 @@ class CGWrapMethod(CGAbstractMethod):
//JSAutoCompartment ac(aCx, scope);
let proto = GetProtoObject(aCx, scope, scope);
- if proto.is_null() {
- return ptr::null();
- }
+ assert!(proto.is_not_null());
%s
- (*raw).mut_reflector().set_jsobject(obj);
+ raw.mut_reflector().set_jsobject(obj);
- return obj;""" % CreateBindingJSObject(self.descriptor, "scope")
+ return raw;""" % CreateBindingJSObject(self.descriptor, "scope")
else:
return """
%s
let proto = GetProtoObject(aCx, obj, obj);
JS_SetPrototype(aCx, obj, proto);
- (*raw).mut_reflector().set_jsobject(obj);
- return obj;""" % CreateBindingJSObject(self.descriptor)
+ raw.mut_reflector().set_jsobject(obj);
+ return raw;""" % CreateBindingJSObject(self.descriptor)
class CGAbstractExternMethod(CGAbstractMethod):
"""
diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs
index 69758f2980a..c8607f58990 100644
--- a/src/components/script/dom/bindings/js.rs
+++ b/src/components/script/dom/bindings/js.rs
@@ -4,7 +4,7 @@
use dom::bindings::utils::{Reflector, Reflectable};
use dom::window::Window;
-use js::jsapi::{JSContext, JSObject};
+use js::jsapi::JSContext;
use layout_interface::TrustedNodeAddress;
use std::cast;
@@ -29,17 +29,10 @@ impl <T> Clone for JS<T> {
}
impl<T: Reflectable> JS<T> {
- pub fn new(mut obj: ~T,
+ pub fn new(obj: ~T,
window: &JS<Window>,
- wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~T) -> *JSObject) -> JS<T> {
- let cx = window.get().get_cx();
- let raw: *mut T = &mut *obj;
- if wrap_fn(cx, window, obj).is_null() {
- fail!("Could not eagerly wrap object");
- }
- JS {
- ptr: RefCell::new(raw)
- }
+ wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~T) -> JS<T>) -> JS<T> {
+ wrap_fn(window.get().get_cx(), window, obj)
}
pub unsafe fn from_raw(raw: *mut T) -> JS<T> {
diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs
index e7385fc1ddd..04a0ddf5d0a 100644
--- a/src/components/script/dom/bindings/utils.rs
+++ b/src/components/script/dom/bindings/utils.rs
@@ -424,7 +424,7 @@ pub trait Reflectable {
pub fn reflect_dom_object<T: Reflectable>
(obj: ~T,
window: &JS<window::Window>,
- wrap_fn: extern "Rust" fn(*JSContext, &JS<window::Window>, ~T) -> *JSObject)
+ wrap_fn: extern "Rust" fn(*JSContext, &JS<window::Window>, ~T) -> JS<T>)
-> JS<T> {
JS::new(obj, window, wrap_fn)
}
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index 3cf1d35459a..a07c0c7e191 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -40,7 +40,7 @@ use servo_util::str::DOMString;
use collections::hashmap::HashMap;
use extra::url::{Url, from_str};
-use js::jsapi::{JSObject, JSContext};
+use js::jsapi::JSContext;
use std::ascii::StrAsciiExt;
use serialize::{Encoder, Encodable};
@@ -87,7 +87,7 @@ impl Document {
pub fn reflect_document<D: Reflectable+DocumentBase>
(document: ~D,
window: &JS<Window>,
- wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~D) -> *JSObject)
+ wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~D) -> JS<D>)
-> JS<D> {
assert!(document.reflector().get_jsobject().is_null());
let raw_doc = reflect_dom_object(document, window, wrap_fn);
diff --git a/src/components/script/dom/htmldatalistelement.rs b/src/components/script/dom/htmldatalistelement.rs
index ef3f91f1702..2a81cce1994 100644
--- a/src/components/script/dom/htmldatalistelement.rs
+++ b/src/components/script/dom/htmldatalistelement.rs
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLDataListElementBinding;
-use dom::bindings::codegen::InheritTypes::HTMLDataListElementDerived;
+use dom::bindings::codegen::InheritTypes::{HTMLDataListElementDerived, NodeCast};
use dom::bindings::js::JS;
use dom::document::Document;
use dom::element::HTMLDataListElementTypeId;
@@ -41,10 +41,10 @@ impl HTMLDataListElement {
}
impl HTMLDataListElement {
- pub fn Options(&self) -> JS<HTMLCollection> {
- // FIXME: https://github.com/mozilla/servo/issues/1842
- let doc = self.htmlelement.element.node.owner_doc();
- let doc = doc.get();
- HTMLCollection::new(&doc.window, ~[])
+ pub fn Options(&self, abstract_self: &JS<HTMLDataListElement>) -> JS<HTMLCollection> {
+ let node: JS<Node> = NodeCast::from(abstract_self);
+ let doc = &self.htmlelement.element.node.owner_doc();
+ let window = &doc.get().window;
+ HTMLCollection::by_tag_name(window, &node, ~"option")
}
}
diff --git a/src/components/script/dom/htmlfieldsetelement.rs b/src/components/script/dom/htmlfieldsetelement.rs
index 4dec639d041..5bbd13c2b79 100644
--- a/src/components/script/dom/htmlfieldsetelement.rs
+++ b/src/components/script/dom/htmlfieldsetelement.rs
@@ -3,16 +3,16 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::HTMLFieldSetElementBinding;
-use dom::bindings::codegen::InheritTypes::HTMLFieldSetElementDerived;
+use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFieldSetElementDerived, NodeCast};
use dom::bindings::js::JS;
use dom::bindings::error::ErrorResult;
use dom::document::Document;
-use dom::element::HTMLFieldSetElementTypeId;
+use dom::element::{Element, HTMLFieldSetElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlformelement::HTMLFormElement;
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElement;
-use dom::node::{Node, ElementNodeTypeId};
+use dom::node::{Node, ElementNodeTypeId, window_from_node};
use dom::validitystate::ValidityState;
use servo_util::str::DOMString;
@@ -68,11 +68,12 @@ impl HTMLFieldSetElement {
~""
}
- pub fn Elements(&self) -> JS<HTMLCollection> {
- // FIXME: https://github.com/mozilla/servo/issues/1843
- let doc = self.htmlelement.element.node.owner_doc();
- let doc = doc.get();
- HTMLCollection::new(&doc.window, ~[])
+ pub fn Elements(&self, abstract_self: &JS<HTMLFieldSetElement>) -> JS<HTMLCollection> {
+ let node: JS<Node> = NodeCast::from(abstract_self);
+ let element: JS<Element> = ElementCast::from(abstract_self);
+ let window = &window_from_node(&node);
+ let listed_elements = ["button", "fieldset", "input", "keygen", "object", "output", "select", "textarea"];
+ HTMLCollection::create(window, &node, |elem| *elem != element && listed_elements.iter().any(|&tag_name| tag_name == elem.get().tag_name))
}
pub fn WillValidate(&self) -> bool {
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index dcb360e0425..08732836dbc 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -404,10 +404,12 @@ impl NodeHelpers for JS<Node> {
assert!(self.parent_node().is_some());
let document = document_from_node(self);
- for node in self.traverse_preorder() {
- if node.is_element() {
- let element: JS<Element> = ElementCast::to(&node);
- element.bind_to_tree_impl();
+ if self.is_in_doc() {
+ for node in self.traverse_preorder() {
+ if node.is_element() {
+ let element: JS<Element> = ElementCast::to(&node);
+ element.bind_to_tree_impl();
+ }
}
}
@@ -767,7 +769,7 @@ impl Node {
pub fn reflect_node<N: Reflectable+NodeBase>
(node: ~N,
document: &JS<Document>,
- wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~N) -> *JSObject)
+ wrap_fn: extern "Rust" fn(*JSContext, &JS<Window>, ~N) -> JS<N>)
-> JS<N> {
assert!(node.reflector().get_jsobject().is_null());
let node = reflect_dom_object(node, &document.get().window, wrap_fn);
diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs
index 2ef70b0eac7..18a7fd73059 100644
--- a/src/components/script/dom/window.rs
+++ b/src/components/script/dom/window.rs
@@ -284,7 +284,7 @@ impl Window {
compositor: ~ScriptListener,
image_cache_task: ImageCacheTask)
-> JS<Window> {
- let mut win = ~Window {
+ let win = ~Window {
eventtarget: EventTarget::new_inherited(WindowTypeId),
script_chan: script_chan.clone(),
console: None,
@@ -314,23 +314,22 @@ impl Window {
next_timer_handle: 0
};
- let raw: *mut Window = &mut *win;
let global = WindowBinding::Wrap(cx, win);
- assert!(global.is_not_null());
- unsafe {
- let fn_names = ["window","self"];
- for str in fn_names.iter() {
- (*str).to_c_str().with_ref(|name| {
- JS_DefineProperty(cx, global, name,
- ObjectValue(&*global),
+ let fn_names = ["window", "self"];
+ for str in fn_names.iter() {
+ (*str).to_c_str().with_ref(|name| {
+ let object = global.reflector().get_jsobject();
+ assert!(object.is_not_null());
+ unsafe {
+ JS_DefineProperty(cx, object, name,
+ ObjectValue(&*object),
Some(cast::transmute(GetJSClassHookStubPointer(PROPERTY_STUB))),
Some(cast::transmute(GetJSClassHookStubPointer(STRICT_PROPERTY_STUB))),
JSPROP_ENUMERATE);
- })
-
- }
+ }
+ })
- JS::from_raw(raw)
}
+ global
}
}