diff options
Diffstat (limited to 'src/components/script/dom')
-rw-r--r-- | src/components/script/dom/bindings/codegen/Bindings.conf | 4 | ||||
-rw-r--r-- | src/components/script/dom/bindings/codegen/CodegenRust.py | 35 | ||||
-rw-r--r-- | src/components/script/dom/bindings/js.rs | 15 | ||||
-rw-r--r-- | src/components/script/dom/bindings/utils.rs | 2 | ||||
-rw-r--r-- | src/components/script/dom/document.rs | 4 | ||||
-rw-r--r-- | src/components/script/dom/htmldatalistelement.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/htmlfieldsetelement.rs | 17 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/window.rs | 25 |
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 } } |