Convert various helper traits from &JSRef to JSRef

I converted them all with a few exceptions:

- Methods that were used by trait objects, since trait objects don't
  work with `self` methods.
- Methods that take an &'b JSRef<'a, T> and return an &'b. In reality,
  many (all?) could return an &'a instead, but this isn't allowed by the
  Deref trait.
- Methods that internally rely on the same issue with Deref.
- I left out the traits involved in layout entirely, even though not all
  of their methods suffer from one of the above problems.

There will probably be solutions to all of these problems in the future.
This commit is contained in:
Cameron Zwarich 2014-09-19 19:57:50 -07:00
parent 2c8d51a37c
commit d768ee77ad
17 changed files with 196 additions and 196 deletions

View file

@ -147,14 +147,14 @@ impl<'a> AttrMethods for JSRef<'a, Attr> {
} }
pub trait AttrHelpers { pub trait AttrHelpers {
fn set_value(&self, set_type: AttrSettingType, value: AttrValue); fn set_value(self, set_type: AttrSettingType, value: AttrValue);
fn value<'a>(&'a self) -> Ref<'a, AttrValue>; fn value<'a>(&'a self) -> Ref<'a, AttrValue>;
fn local_name<'a>(&'a self) -> &'a Atom; fn local_name<'a>(&'a self) -> &'a Atom;
fn summarize(&self) -> AttrInfo; fn summarize(self) -> AttrInfo;
} }
impl<'a> AttrHelpers for JSRef<'a, Attr> { impl<'a> AttrHelpers for JSRef<'a, Attr> {
fn set_value(&self, set_type: AttrSettingType, value: AttrValue) { fn set_value(self, set_type: AttrSettingType, value: AttrValue) {
let owner = self.owner.root(); let owner = self.owner.root();
let node: JSRef<Node> = NodeCast::from_ref(*owner); let node: JSRef<Node> = NodeCast::from_ref(*owner);
let namespace_is_null = self.namespace == namespace::Null; let namespace_is_null = self.namespace == namespace::Null;
@ -187,7 +187,7 @@ impl<'a> AttrHelpers for JSRef<'a, Attr> {
&self.local_name &self.local_name
} }
fn summarize(&self) -> AttrInfo { fn summarize(self) -> AttrInfo {
AttrInfo { AttrInfo {
namespace: self.namespace.to_str().to_string(), namespace: self.namespace.to_str().to_string(),
name: self.Name(), name: self.Name(),

View file

@ -175,11 +175,11 @@ impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalSc
} }
trait PrivateDedicatedWorkerGlobalScopeHelpers { trait PrivateDedicatedWorkerGlobalScopeHelpers {
fn delayed_release_worker(&self); fn delayed_release_worker(self);
} }
impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> { impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> {
fn delayed_release_worker(&self) { fn delayed_release_worker(self) {
let ScriptChan(ref sender) = self.parent_sender; let ScriptChan(ref sender) = self.parent_sender;
sender.send(WorkerRelease(*self.worker)); sender.send(WorkerRelease(*self.worker));
} }

View file

@ -150,16 +150,16 @@ impl CollectionFilter for AppletsFilter {
pub trait DocumentHelpers { pub trait DocumentHelpers {
fn url<'a>(&'a self) -> &'a Url; fn url<'a>(&'a self) -> &'a Url;
fn quirks_mode(&self) -> QuirksMode; fn quirks_mode(self) -> QuirksMode;
fn set_quirks_mode(&self, mode: QuirksMode); fn set_quirks_mode(self, mode: QuirksMode);
fn set_last_modified(&self, value: DOMString); fn set_last_modified(self, value: DOMString);
fn set_encoding_name(&self, name: DOMString); fn set_encoding_name(self, name: DOMString);
fn content_changed(&self); fn content_changed(self);
fn damage_and_reflow(&self, damage: DocumentDamageLevel); fn damage_and_reflow(self, damage: DocumentDamageLevel);
fn wait_until_safe_to_modify_dom(&self); fn wait_until_safe_to_modify_dom(self);
fn unregister_named_element(&self, to_unregister: JSRef<Element>, id: DOMString); fn unregister_named_element(self, to_unregister: JSRef<Element>, id: DOMString);
fn register_named_element(&self, element: JSRef<Element>, id: DOMString); fn register_named_element(self, element: JSRef<Element>, id: DOMString);
fn load_anchor_href(&self, href: DOMString); fn load_anchor_href(self, href: DOMString);
} }
impl<'a> DocumentHelpers for JSRef<'a, Document> { impl<'a> DocumentHelpers for JSRef<'a, Document> {
@ -167,37 +167,37 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> {
&*self.url &*self.url
} }
fn quirks_mode(&self) -> QuirksMode { fn quirks_mode(self) -> QuirksMode {
self.quirks_mode.deref().get() self.quirks_mode.deref().get()
} }
fn set_quirks_mode(&self, mode: QuirksMode) { fn set_quirks_mode(self, mode: QuirksMode) {
self.quirks_mode.deref().set(mode); self.quirks_mode.deref().set(mode);
} }
fn set_last_modified(&self, value: DOMString) { fn set_last_modified(self, value: DOMString) {
*self.last_modified.deref().borrow_mut() = Some(value); *self.last_modified.deref().borrow_mut() = Some(value);
} }
fn set_encoding_name(&self, name: DOMString) { fn set_encoding_name(self, name: DOMString) {
*self.encoding_name.deref().borrow_mut() = name; *self.encoding_name.deref().borrow_mut() = name;
} }
fn content_changed(&self) { fn content_changed(self) {
self.damage_and_reflow(ContentChangedDocumentDamage); self.damage_and_reflow(ContentChangedDocumentDamage);
} }
fn damage_and_reflow(&self, damage: DocumentDamageLevel) { fn damage_and_reflow(self, damage: DocumentDamageLevel) {
self.window.root().damage_and_reflow(damage); self.window.root().damage_and_reflow(damage);
} }
fn wait_until_safe_to_modify_dom(&self) { fn wait_until_safe_to_modify_dom(self) {
self.window.root().wait_until_safe_to_modify_dom(); self.window.root().wait_until_safe_to_modify_dom();
} }
/// Remove any existing association between the provided id and any elements in this document. /// Remove any existing association between the provided id and any elements in this document.
fn unregister_named_element(&self, fn unregister_named_element(self,
to_unregister: JSRef<Element>, to_unregister: JSRef<Element>,
id: DOMString) { id: DOMString) {
let mut idmap = self.idmap.deref().borrow_mut(); let mut idmap = self.idmap.deref().borrow_mut();
@ -218,7 +218,7 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> {
} }
/// Associate an element present in this document with the provided id. /// Associate an element present in this document with the provided id.
fn register_named_element(&self, fn register_named_element(self,
element: JSRef<Element>, element: JSRef<Element>,
id: DOMString) { id: DOMString) {
assert!({ assert!({
@ -261,7 +261,7 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> {
idmap.insert(id, elements); idmap.insert(id, elements);
} }
fn load_anchor_href(&self, href: DOMString) { fn load_anchor_href(self, href: DOMString) {
let window = self.window.root(); let window = self.window.root();
window.load_url(href); window.load_url(href);
} }
@ -329,12 +329,12 @@ impl Reflectable for Document {
} }
trait PrivateDocumentHelpers { trait PrivateDocumentHelpers {
fn createNodeList(&self, callback: |node: JSRef<Node>| -> bool) -> Temporary<NodeList>; fn createNodeList(self, callback: |node: JSRef<Node>| -> bool) -> Temporary<NodeList>;
fn get_html_element(&self) -> Option<Temporary<HTMLHtmlElement>>; fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>>;
} }
impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> { impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> {
fn createNodeList(&self, callback: |node: JSRef<Node>| -> bool) -> Temporary<NodeList> { fn createNodeList(self, callback: |node: JSRef<Node>| -> bool) -> Temporary<NodeList> {
let window = self.window.root(); let window = self.window.root();
match self.GetDocumentElement().root() { match self.GetDocumentElement().root() {
@ -355,7 +355,7 @@ impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> {
} }
fn get_html_element(&self) -> Option<Temporary<HTMLHtmlElement>> { fn get_html_element(self) -> Option<Temporary<HTMLHtmlElement>> {
self.GetDocumentElement().root().filtered(|root| { self.GetDocumentElement().root().filtered(|root| {
let root: JSRef<Node> = NodeCast::from_ref(**root); let root: JSRef<Node> = NodeCast::from_ref(**root);
root.type_id() == ElementNodeTypeId(HTMLHtmlElementTypeId) root.type_id() == ElementNodeTypeId(HTMLHtmlElementTypeId)

View file

@ -49,17 +49,17 @@ impl Reflectable for DOMTokenList {
} }
trait PrivateDOMTokenListHelpers { trait PrivateDOMTokenListHelpers {
fn attribute(&self) -> Option<Temporary<Attr>>; fn attribute(self) -> Option<Temporary<Attr>>;
fn check_token_exceptions<'a>(&self, token: &'a str) -> Fallible<&'a str>; fn check_token_exceptions<'a>(self, token: &'a str) -> Fallible<&'a str>;
} }
impl<'a> PrivateDOMTokenListHelpers for JSRef<'a, DOMTokenList> { impl<'a> PrivateDOMTokenListHelpers for JSRef<'a, DOMTokenList> {
fn attribute(&self) -> Option<Temporary<Attr>> { fn attribute(self) -> Option<Temporary<Attr>> {
let element = self.element.root(); let element = self.element.root();
element.deref().get_attribute(Null, self.local_name) element.deref().get_attribute(Null, self.local_name)
} }
fn check_token_exceptions<'a>(&self, token: &'a str) -> Fallible<&'a str> { fn check_token_exceptions<'a>(self, token: &'a str) -> Fallible<&'a str> {
match token { match token {
"" => Err(Syntax), "" => Err(Syntax),
token if token.find(HTML_SPACE_CHARACTERS).is_some() => Err(InvalidCharacter), token if token.find(HTML_SPACE_CHARACTERS).is_some() => Err(InvalidCharacter),

View file

@ -241,8 +241,8 @@ pub trait ElementHelpers {
fn html_element_in_html_document(&self) -> bool; fn html_element_in_html_document(&self) -> bool;
fn get_local_name<'a>(&'a self) -> &'a Atom; fn get_local_name<'a>(&'a self) -> &'a Atom;
fn get_namespace<'a>(&'a self) -> &'a Namespace; fn get_namespace<'a>(&'a self) -> &'a Namespace;
fn summarize(&self) -> Vec<AttrInfo>; fn summarize(self) -> Vec<AttrInfo>;
fn is_void(&self) -> bool; fn is_void(self) -> bool;
} }
impl<'a> ElementHelpers for JSRef<'a, Element> { impl<'a> ElementHelpers for JSRef<'a, Element> {
@ -259,7 +259,7 @@ impl<'a> ElementHelpers for JSRef<'a, Element> {
&self.deref().namespace &self.deref().namespace
} }
fn summarize(&self) -> Vec<AttrInfo> { fn summarize(self) -> Vec<AttrInfo> {
let attrs = self.Attributes().root(); let attrs = self.Attributes().root();
let mut i = 0; let mut i = 0;
let mut summarized = vec!(); let mut summarized = vec!();
@ -289,45 +289,45 @@ impl<'a> ElementHelpers for JSRef<'a, Element> {
pub trait AttributeHandlers { pub trait AttributeHandlers {
/// Returns the attribute with given namespace and case-sensitive local /// Returns the attribute with given namespace and case-sensitive local
/// name, if any. /// name, if any.
fn get_attribute(&self, namespace: Namespace, local_name: &str) fn get_attribute(self, namespace: Namespace, local_name: &str)
-> Option<Temporary<Attr>>; -> Option<Temporary<Attr>>;
fn set_attribute_from_parser(&self, local_name: Atom, fn set_attribute_from_parser(self, local_name: Atom,
value: DOMString, namespace: Namespace, value: DOMString, namespace: Namespace,
prefix: Option<DOMString>); prefix: Option<DOMString>);
fn set_attribute(&self, name: &str, value: AttrValue); fn set_attribute(self, name: &str, value: AttrValue);
fn do_set_attribute(&self, local_name: Atom, value: AttrValue, fn do_set_attribute(self, local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace, name: Atom, namespace: Namespace,
prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool); prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool);
fn parse_attribute(&self, namespace: &Namespace, local_name: &Atom, fn parse_attribute(self, namespace: &Namespace, local_name: &Atom,
value: DOMString) -> AttrValue; value: DOMString) -> AttrValue;
fn remove_attribute(&self, namespace: Namespace, name: &str); fn remove_attribute(self, namespace: Namespace, name: &str);
fn notify_attribute_changed(&self, local_name: &Atom); fn notify_attribute_changed(self, local_name: &Atom);
fn has_class(&self, name: &str) -> bool; fn has_class(&self, name: &str) -> bool;
fn set_atomic_attribute(&self, name: &str, value: DOMString); fn set_atomic_attribute(self, name: &str, value: DOMString);
// http://www.whatwg.org/html/#reflecting-content-attributes-in-idl-attributes // http://www.whatwg.org/html/#reflecting-content-attributes-in-idl-attributes
fn has_attribute(&self, name: &str) -> bool; fn has_attribute(self, name: &str) -> bool;
fn set_bool_attribute(&self, name: &str, value: bool); fn set_bool_attribute(self, name: &str, value: bool);
fn get_url_attribute(&self, name: &str) -> DOMString; fn get_url_attribute(self, name: &str) -> DOMString;
fn set_url_attribute(&self, name: &str, value: DOMString); fn set_url_attribute(self, name: &str, value: DOMString);
fn get_string_attribute(&self, name: &str) -> DOMString; fn get_string_attribute(self, name: &str) -> DOMString;
fn set_string_attribute(&self, name: &str, value: DOMString); fn set_string_attribute(self, name: &str, value: DOMString);
fn set_tokenlist_attribute(&self, name: &str, value: DOMString); fn set_tokenlist_attribute(self, name: &str, value: DOMString);
fn get_uint_attribute(&self, name: &str) -> u32; fn get_uint_attribute(self, name: &str) -> u32;
fn set_uint_attribute(&self, name: &str, value: u32); fn set_uint_attribute(self, name: &str, value: u32);
} }
impl<'a> AttributeHandlers for JSRef<'a, Element> { impl<'a> AttributeHandlers for JSRef<'a, Element> {
fn get_attribute(&self, namespace: Namespace, local_name: &str) -> Option<Temporary<Attr>> { fn get_attribute(self, namespace: Namespace, local_name: &str) -> Option<Temporary<Attr>> {
let local_name = Atom::from_slice(local_name); let local_name = Atom::from_slice(local_name);
self.attrs.borrow().iter().map(|attr| attr.root()).find(|attr| { self.attrs.borrow().iter().map(|attr| attr.root()).find(|attr| {
*attr.local_name() == local_name && attr.namespace == namespace *attr.local_name() == local_name && attr.namespace == namespace
}).map(|x| Temporary::from_rooted(*x)) }).map(|x| Temporary::from_rooted(*x))
} }
fn set_attribute_from_parser(&self, local_name: Atom, fn set_attribute_from_parser(self, local_name: Atom,
value: DOMString, namespace: Namespace, value: DOMString, namespace: Namespace,
prefix: Option<DOMString>) { prefix: Option<DOMString>) {
let name = match prefix { let name = match prefix {
@ -341,11 +341,11 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
self.do_set_attribute(local_name, value, name, namespace, prefix, |_| false) self.do_set_attribute(local_name, value, name, namespace, prefix, |_| false)
} }
fn set_attribute(&self, name: &str, value: AttrValue) { fn set_attribute(self, name: &str, value: AttrValue) {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
assert!(!name.contains(":")); assert!(!name.contains(":"));
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
node.wait_until_safe_to_modify_dom(); node.wait_until_safe_to_modify_dom();
let name = Atom::from_slice(name); let name = Atom::from_slice(name);
@ -353,7 +353,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
namespace::Null, None, |attr| *attr.local_name() == name); namespace::Null, None, |attr| *attr.local_name() == name);
} }
fn do_set_attribute(&self, local_name: Atom, value: AttrValue, fn do_set_attribute(self, local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace, name: Atom, namespace: Namespace,
prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool) { prefix: Option<DOMString>, cb: |JSRef<Attr>| -> bool) {
let idx = self.deref().attrs.borrow().iter() let idx = self.deref().attrs.borrow().iter()
@ -362,9 +362,9 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
let (idx, set_type) = match idx { let (idx, set_type) = match idx {
Some(idx) => (idx, ReplacedAttr), Some(idx) => (idx, ReplacedAttr),
None => { None => {
let window = window_from_node(*self).root(); let window = window_from_node(self).root();
let attr = Attr::new(*window, local_name, value.clone(), let attr = Attr::new(*window, local_name, value.clone(),
name, namespace.clone(), prefix, *self); name, namespace.clone(), prefix, self);
self.deref().attrs.borrow_mut().push_unrooted(&attr); self.deref().attrs.borrow_mut().push_unrooted(&attr);
(self.deref().attrs.borrow().len() - 1, FirstSetAttr) (self.deref().attrs.borrow().len() - 1, FirstSetAttr)
} }
@ -373,17 +373,17 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
(*self.deref().attrs.borrow())[idx].root().set_value(set_type, value); (*self.deref().attrs.borrow())[idx].root().set_value(set_type, value);
} }
fn parse_attribute(&self, namespace: &Namespace, local_name: &Atom, fn parse_attribute(self, namespace: &Namespace, local_name: &Atom,
value: DOMString) -> AttrValue { value: DOMString) -> AttrValue {
if *namespace == namespace::Null { if *namespace == namespace::Null {
vtable_for(&NodeCast::from_ref(*self)) vtable_for(&NodeCast::from_ref(self))
.parse_plain_attribute(local_name.as_slice(), value) .parse_plain_attribute(local_name.as_slice(), value)
} else { } else {
StringAttrValue(value) StringAttrValue(value)
} }
} }
fn remove_attribute(&self, namespace: Namespace, name: &str) { fn remove_attribute(self, namespace: Namespace, name: &str) {
let (_, local_name) = get_attribute_parts(name); let (_, local_name) = get_attribute_parts(name);
let local_name = Atom::from_slice(local_name); let local_name = Atom::from_slice(local_name);
@ -395,13 +395,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
None => (), None => (),
Some(idx) => { Some(idx) => {
{ {
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
node.wait_until_safe_to_modify_dom(); node.wait_until_safe_to_modify_dom();
} }
if namespace == namespace::Null { if namespace == namespace::Null {
let removed_raw_value = (*self.deref().attrs.borrow())[idx].root().Value(); let removed_raw_value = (*self.deref().attrs.borrow())[idx].root().Value();
vtable_for(&NodeCast::from_ref(*self)) vtable_for(&NodeCast::from_ref(self))
.before_remove_attr(&local_name, .before_remove_attr(&local_name,
removed_raw_value); removed_raw_value);
} }
@ -411,8 +411,8 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
}; };
} }
fn notify_attribute_changed(&self, local_name: &Atom) { fn notify_attribute_changed(self, local_name: &Atom) {
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
if node.is_in_doc() { if node.is_in_doc() {
let damage = match local_name.as_slice() { let damage = match local_name.as_slice() {
"style" | "id" | "class" => MatchSelectorsDocumentDamage, "style" | "id" | "class" => MatchSelectorsDocumentDamage,
@ -431,13 +431,13 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
}).unwrap_or(false) }).unwrap_or(false)
} }
fn set_atomic_attribute(&self, name: &str, value: DOMString) { fn set_atomic_attribute(self, name: &str, value: DOMString) {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
let value = AttrValue::from_atomic(value); let value = AttrValue::from_atomic(value);
self.set_attribute(name, value); self.set_attribute(name, value);
} }
fn has_attribute(&self, name: &str) -> bool { fn has_attribute(self, name: &str) -> bool {
let name = match self.html_element_in_html_document() { let name = match self.html_element_in_html_document() {
true => Atom::from_slice(name.to_ascii_lower().as_slice()), true => Atom::from_slice(name.to_ascii_lower().as_slice()),
false => Atom::from_slice(name) false => Atom::from_slice(name)
@ -447,7 +447,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
}) })
} }
fn set_bool_attribute(&self, name: &str, value: bool) { fn set_bool_attribute(self, name: &str, value: bool) {
if self.has_attribute(name) == value { return; } if self.has_attribute(name) == value { return; }
if value { if value {
self.set_string_attribute(name, String::new()); self.set_string_attribute(name, String::new());
@ -456,16 +456,16 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
} }
} }
fn get_url_attribute(&self, name: &str) -> DOMString { fn get_url_attribute(self, name: &str) -> DOMString {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
// XXX Resolve URL. // XXX Resolve URL.
self.get_string_attribute(name) self.get_string_attribute(name)
} }
fn set_url_attribute(&self, name: &str, value: DOMString) { fn set_url_attribute(self, name: &str, value: DOMString) {
self.set_string_attribute(name, value); self.set_string_attribute(name, value);
} }
fn get_string_attribute(&self, name: &str) -> DOMString { fn get_string_attribute(self, name: &str) -> DOMString {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
match self.get_attribute(Null, name) { match self.get_attribute(Null, name) {
Some(x) => { Some(x) => {
@ -475,17 +475,17 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
None => "".to_string() None => "".to_string()
} }
} }
fn set_string_attribute(&self, name: &str, value: DOMString) { fn set_string_attribute(self, name: &str, value: DOMString) {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
self.set_attribute(name, StringAttrValue(value)); self.set_attribute(name, StringAttrValue(value));
} }
fn set_tokenlist_attribute(&self, name: &str, value: DOMString) { fn set_tokenlist_attribute(self, name: &str, value: DOMString) {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
self.set_attribute(name, AttrValue::from_tokenlist(value)); self.set_attribute(name, AttrValue::from_tokenlist(value));
} }
fn get_uint_attribute(&self, name: &str) -> u32 { fn get_uint_attribute(self, name: &str) -> u32 {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
let attribute = self.get_attribute(Null, name).root(); let attribute = self.get_attribute(Null, name).root();
match attribute { match attribute {
@ -498,7 +498,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
None => 0, None => 0,
} }
} }
fn set_uint_attribute(&self, name: &str, value: u32) { fn set_uint_attribute(self, name: &str, value: u32) {
assert!(name == name.to_ascii_lower().as_slice()); assert!(name == name.to_ascii_lower().as_slice());
self.set_attribute(name, UIntAttrValue(value.to_string(), value)); self.set_attribute(name, UIntAttrValue(value.to_string(), value));
} }

View file

@ -94,37 +94,37 @@ impl EventTarget {
} }
pub trait EventTargetHelpers { pub trait EventTargetHelpers {
fn dispatch_event_with_target<'a>(&self, fn dispatch_event_with_target(self,
target: Option<JSRef<'a, EventTarget>>, target: Option<JSRef<EventTarget>>,
event: JSRef<Event>) -> Fallible<bool>; event: JSRef<Event>) -> Fallible<bool>;
fn set_inline_event_listener(&self, fn set_inline_event_listener(self,
ty: DOMString, ty: DOMString,
listener: Option<EventListener>); listener: Option<EventListener>);
fn get_inline_event_listener(&self, ty: DOMString) -> Option<EventListener>; fn get_inline_event_listener(self, ty: DOMString) -> Option<EventListener>;
fn set_event_handler_uncompiled(&self, fn set_event_handler_uncompiled(self,
cx: *mut JSContext, cx: *mut JSContext,
url: Url, url: Url,
scope: *mut JSObject, scope: *mut JSObject,
ty: &str, ty: &str,
source: DOMString); source: DOMString);
fn set_event_handler_common<T: CallbackContainer>(&self, ty: &str, fn set_event_handler_common<T: CallbackContainer>(self, ty: &str,
listener: Option<T>); listener: Option<T>);
fn get_event_handler_common<T: CallbackContainer>(&self, ty: &str) -> Option<T>; fn get_event_handler_common<T: CallbackContainer>(self, ty: &str) -> Option<T>;
fn has_handlers(&self) -> bool; fn has_handlers(self) -> bool;
} }
impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> { impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> {
fn dispatch_event_with_target<'b>(&self, fn dispatch_event_with_target(self,
target: Option<JSRef<'b, EventTarget>>, target: Option<JSRef<EventTarget>>,
event: JSRef<Event>) -> Fallible<bool> { event: JSRef<Event>) -> Fallible<bool> {
if event.deref().dispatching.deref().get() || !event.deref().initialized.deref().get() { if event.deref().dispatching.deref().get() || !event.deref().initialized.deref().get() {
return Err(InvalidState); return Err(InvalidState);
} }
Ok(dispatch_event(*self, target, event)) Ok(dispatch_event(self, target, event))
} }
fn set_inline_event_listener(&self, fn set_inline_event_listener(self,
ty: DOMString, ty: DOMString,
listener: Option<EventListener>) { listener: Option<EventListener>) {
let mut handlers = self.handlers.deref().borrow_mut(); let mut handlers = self.handlers.deref().borrow_mut();
@ -156,7 +156,7 @@ impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> {
} }
} }
fn get_inline_event_listener(&self, ty: DOMString) -> Option<EventListener> { fn get_inline_event_listener(self, ty: DOMString) -> Option<EventListener> {
let handlers = self.handlers.deref().borrow(); let handlers = self.handlers.deref().borrow();
let entries = handlers.find(&ty); let entries = handlers.find(&ty);
entries.and_then(|entries| entries.iter().find(|entry| { entries.and_then(|entries| entries.iter().find(|entry| {
@ -167,7 +167,7 @@ impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> {
}).map(|entry| entry.listener.get_listener())) }).map(|entry| entry.listener.get_listener()))
} }
fn set_event_handler_uncompiled(&self, fn set_event_handler_uncompiled(self,
cx: *mut JSContext, cx: *mut JSContext,
url: Url, url: Url,
scope: *mut JSObject, scope: *mut JSObject,
@ -207,19 +207,19 @@ impl<'a> EventTargetHelpers for JSRef<'a, EventTarget> {
} }
fn set_event_handler_common<T: CallbackContainer>( fn set_event_handler_common<T: CallbackContainer>(
&self, ty: &str, listener: Option<T>) self, ty: &str, listener: Option<T>)
{ {
let event_listener = listener.map(|listener| let event_listener = listener.map(|listener|
EventListener::new(listener.callback())); EventListener::new(listener.callback()));
self.set_inline_event_listener(ty.to_string(), event_listener); self.set_inline_event_listener(ty.to_string(), event_listener);
} }
fn get_event_handler_common<T: CallbackContainer>(&self, ty: &str) -> Option<T> { fn get_event_handler_common<T: CallbackContainer>(self, ty: &str) -> Option<T> {
let listener = self.get_inline_event_listener(ty.to_string()); let listener = self.get_inline_event_listener(ty.to_string());
listener.map(|listener| CallbackContainer::new(listener.parent.callback())) listener.map(|listener| CallbackContainer::new(listener.parent.callback()))
} }
fn has_handlers(&self) -> bool { fn has_handlers(self) -> bool {
!self.handlers.deref().borrow().is_empty() !self.handlers.deref().borrow().is_empty()
} }
} }

View file

@ -50,19 +50,19 @@ impl HTMLAnchorElement {
} }
trait PrivateHTMLAnchorElementHelpers { trait PrivateHTMLAnchorElementHelpers {
fn handle_event_impl(&self, event: JSRef<Event>); fn handle_event_impl(self, event: JSRef<Event>);
} }
impl<'a> PrivateHTMLAnchorElementHelpers for JSRef<'a, HTMLAnchorElement> { impl<'a> PrivateHTMLAnchorElementHelpers for JSRef<'a, HTMLAnchorElement> {
fn handle_event_impl(&self, event: JSRef<Event>) { fn handle_event_impl(self, event: JSRef<Event>) {
if "click" == event.Type().as_slice() && !event.DefaultPrevented() { if "click" == event.Type().as_slice() && !event.DefaultPrevented() {
let element: JSRef<Element> = ElementCast::from_ref(*self); let element: JSRef<Element> = ElementCast::from_ref(self);
let attr = element.get_attribute(Null, "href").root(); let attr = element.get_attribute(Null, "href").root();
match attr { match attr {
Some(ref href) => { Some(ref href) => {
let value = href.Value(); let value = href.Value();
debug!("clicked on link to {:s}", value); debug!("clicked on link to {:s}", value);
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
let doc = node.owner_doc().root(); let doc = node.owner_doc().root();
doc.load_anchor_href(value); doc.load_anchor_href(value);
} }

View file

@ -52,12 +52,12 @@ impl HTMLElement {
} }
trait PrivateHTMLElementHelpers { trait PrivateHTMLElementHelpers {
fn is_body_or_frameset(&self) -> bool; fn is_body_or_frameset(self) -> bool;
} }
impl<'a> PrivateHTMLElementHelpers for JSRef<'a, HTMLElement> { impl<'a> PrivateHTMLElementHelpers for JSRef<'a, HTMLElement> {
fn is_body_or_frameset(&self) -> bool { fn is_body_or_frameset(self) -> bool {
let eventtarget: JSRef<EventTarget> = EventTargetCast::from_ref(*self); let eventtarget: JSRef<EventTarget> = EventTargetCast::from_ref(self);
eventtarget.is_htmlbodyelement() || eventtarget.is_htmlframesetelement() eventtarget.is_htmlbodyelement() || eventtarget.is_htmlframesetelement()
} }
} }

View file

@ -62,32 +62,32 @@ pub struct IFrameSize {
} }
pub trait HTMLIFrameElementHelpers { pub trait HTMLIFrameElementHelpers {
fn is_sandboxed(&self) -> bool; fn is_sandboxed(self) -> bool;
fn get_url(&self) -> Option<Url>; fn get_url(self) -> Option<Url>;
/// http://www.whatwg.org/html/#process-the-iframe-attributes /// http://www.whatwg.org/html/#process-the-iframe-attributes
fn process_the_iframe_attributes(&self); fn process_the_iframe_attributes(self);
} }
impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> { impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> {
fn is_sandboxed(&self) -> bool { fn is_sandboxed(self) -> bool {
self.sandbox.deref().get().is_some() self.sandbox.deref().get().is_some()
} }
fn get_url(&self) -> Option<Url> { fn get_url(self) -> Option<Url> {
let element: JSRef<Element> = ElementCast::from_ref(*self); let element: JSRef<Element> = ElementCast::from_ref(self);
element.get_attribute(Null, "src").root().and_then(|src| { element.get_attribute(Null, "src").root().and_then(|src| {
let url = src.deref().value(); let url = src.deref().value();
if url.as_slice().is_empty() { if url.as_slice().is_empty() {
None None
} else { } else {
let window = window_from_node(*self).root(); let window = window_from_node(self).root();
UrlParser::new().base_url(&window.deref().page().get_url()) UrlParser::new().base_url(&window.deref().page().get_url())
.parse(url.as_slice()).ok() .parse(url.as_slice()).ok()
} }
}) })
} }
fn process_the_iframe_attributes(&self) { fn process_the_iframe_attributes(self) {
let url = match self.get_url() { let url = match self.get_url() {
Some(url) => url.clone(), Some(url) => url.clone(),
None => Url::parse("about:blank").unwrap(), None => Url::parse("about:blank").unwrap(),
@ -100,7 +100,7 @@ impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> {
}; };
// Subpage Id // Subpage Id
let window = window_from_node(*self).root(); let window = window_from_node(self).root();
let page = window.deref().page(); let page = window.deref().page();
let subpage_id = page.get_next_subpage_id(); let subpage_id = page.get_next_subpage_id();

View file

@ -39,14 +39,14 @@ impl HTMLImageElementDerived for EventTarget {
} }
trait PrivateHTMLImageElementHelpers { trait PrivateHTMLImageElementHelpers {
fn update_image(&self, value: Option<(DOMString, &Url)>); fn update_image(self, value: Option<(DOMString, &Url)>);
} }
impl<'a> PrivateHTMLImageElementHelpers for JSRef<'a, HTMLImageElement> { impl<'a> PrivateHTMLImageElementHelpers for JSRef<'a, HTMLImageElement> {
/// Makes the local `image` member match the status of the `src` attribute and starts /// Makes the local `image` member match the status of the `src` attribute and starts
/// prefetching the image. This method must be called after `src` is changed. /// prefetching the image. This method must be called after `src` is changed.
fn update_image(&self, value: Option<(DOMString, &Url)>) { fn update_image(self, value: Option<(DOMString, &Url)>) {
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
let document = node.owner_doc().root(); let document = node.owner_doc().root();
let window = document.deref().window.root(); let window = document.deref().window.root();
let image_cache = &window.image_cache_task; let image_cache = &window.image_cache_task;

View file

@ -114,12 +114,12 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLLinkElement> {
} }
trait PrivateHTMLLinkElementHelpers { trait PrivateHTMLLinkElementHelpers {
fn handle_stylesheet_url(&self, href: &str); fn handle_stylesheet_url(self, href: &str);
} }
impl<'a> PrivateHTMLLinkElementHelpers for JSRef<'a, HTMLLinkElement> { impl<'a> PrivateHTMLLinkElementHelpers for JSRef<'a, HTMLLinkElement> {
fn handle_stylesheet_url(&self, href: &str) { fn handle_stylesheet_url(self, href: &str) {
let window = window_from_node(*self).root(); let window = window_from_node(self).root();
match UrlParser::new().base_url(&window.deref().page().get_url()).parse(href) { match UrlParser::new().base_url(&window.deref().page().get_url()).parse(href) {
Ok(url) => { Ok(url) => {
let LayoutChan(ref layout_chan) = *window.deref().page().layout_chan; let LayoutChan(ref layout_chan) = *window.deref().page().layout_chan;

View file

@ -48,7 +48,7 @@ impl HTMLScriptElement {
pub trait HTMLScriptElementHelpers { pub trait HTMLScriptElementHelpers {
/// Prepare a script (<http://www.whatwg.org/html/#prepare-a-script>), /// Prepare a script (<http://www.whatwg.org/html/#prepare-a-script>),
/// steps 6 and 7. /// steps 6 and 7.
fn is_javascript(&self) -> bool; fn is_javascript(self) -> bool;
} }
/// Supported script types as defined by /// Supported script types as defined by
@ -73,8 +73,8 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[
]; ];
impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> { impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
fn is_javascript(&self) -> bool { fn is_javascript(self) -> bool {
let element: JSRef<Element> = ElementCast::from_ref(*self); let element: JSRef<Element> = ElementCast::from_ref(self);
match element.get_attribute(Null, "type").root().map(|s| s.Value()) { match element.get_attribute(Null, "type").root().map(|s| s.Value()) {
Some(ref s) if s.is_empty() => { Some(ref s) if s.is_empty() => {
// type attr exists, but empty means js // type attr exists, but empty means js

View file

@ -44,12 +44,12 @@ impl HTMLStyleElement {
} }
pub trait StyleElementHelpers { pub trait StyleElementHelpers {
fn parse_own_css(&self); fn parse_own_css(self);
} }
impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> { impl<'a> StyleElementHelpers for JSRef<'a, HTMLStyleElement> {
fn parse_own_css(&self) { fn parse_own_css(self) {
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(self);
assert!(node.is_in_doc()); assert!(node.is_in_doc());
let win = window_from_node(node).root(); let win = window_from_node(node).root();

View file

@ -43,11 +43,11 @@ impl<'a> PerformanceTimingMethods for JSRef<'a, PerformanceTiming> {
} }
pub trait PerformanceTimingHelpers { pub trait PerformanceTimingHelpers {
fn NavigationStartPrecise(&self) -> f64; fn NavigationStartPrecise(self) -> f64;
} }
impl<'a> PerformanceTimingHelpers for JSRef<'a, PerformanceTiming> { impl<'a> PerformanceTimingHelpers for JSRef<'a, PerformanceTiming> {
fn NavigationStartPrecise(&self) -> f64 { fn NavigationStartPrecise(self) -> f64 {
self.navigationStartPrecise self.navigationStartPrecise
} }
} }

View file

@ -133,24 +133,24 @@ impl Reflectable for TreeWalker {
type NodeAdvancer<'a, 'b> = |node: JSRef<'a, Node>|: 'b -> Option<Temporary<Node>>; type NodeAdvancer<'a, 'b> = |node: JSRef<'a, Node>|: 'b -> Option<Temporary<Node>>;
trait PrivateTreeWalkerHelpers<'a, 'b> { trait PrivateTreeWalkerHelpers<'a, 'b> {
fn traverse_children(&self, fn traverse_children(self,
next_child: NodeAdvancer<'a, 'b>, next_child: NodeAdvancer<'a, 'b>,
next_sibling: NodeAdvancer<'a, 'b>) next_sibling: NodeAdvancer<'a, 'b>)
-> Fallible<Option<Temporary<Node>>>; -> Fallible<Option<Temporary<Node>>>;
fn traverse_siblings(&self, fn traverse_siblings(self,
next_child: NodeAdvancer<'a, 'b>, next_child: NodeAdvancer<'a, 'b>,
next_sibling: NodeAdvancer<'a, 'b>) next_sibling: NodeAdvancer<'a, 'b>)
-> Fallible<Option<Temporary<Node>>>; -> Fallible<Option<Temporary<Node>>>;
fn is_root_node(&self, node: JSRef<'a, Node>) -> bool; fn is_root_node(self, node: JSRef<'a, Node>) -> bool;
fn is_current_node(&self, node: JSRef<'a, Node>) -> bool; fn is_current_node(self, node: JSRef<'a, Node>) -> bool;
fn first_following_node_not_following_root(&self, node: JSRef<'a, Node>) fn first_following_node_not_following_root(self, node: JSRef<'a, Node>)
-> Option<Temporary<Node>>; -> Option<Temporary<Node>>;
fn accept_node(&self, node: JSRef<'a, Node>) -> Fallible<u16>; fn accept_node(self, node: JSRef<'a, Node>) -> Fallible<u16>;
} }
impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> { impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> {
// http://dom.spec.whatwg.org/#concept-traverse-children // http://dom.spec.whatwg.org/#concept-traverse-children
fn traverse_children(&self, fn traverse_children(self,
next_child: NodeAdvancer<'a, 'b>, next_child: NodeAdvancer<'a, 'b>,
next_sibling: NodeAdvancer<'a, 'b>) next_sibling: NodeAdvancer<'a, 'b>)
-> Fallible<Option<Temporary<Node>>> { -> Fallible<Option<Temporary<Node>>> {
@ -229,7 +229,7 @@ impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> {
} }
// http://dom.spec.whatwg.org/#concept-traverse-siblings // http://dom.spec.whatwg.org/#concept-traverse-siblings
fn traverse_siblings(&self, fn traverse_siblings(self,
next_child: NodeAdvancer<'a, 'b>, next_child: NodeAdvancer<'a, 'b>,
next_sibling: NodeAdvancer<'a, 'b>) next_sibling: NodeAdvancer<'a, 'b>)
-> Fallible<Option<Temporary<Node>>> { -> Fallible<Option<Temporary<Node>>> {
@ -293,7 +293,7 @@ impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> {
} }
// http://dom.spec.whatwg.org/#concept-tree-following // http://dom.spec.whatwg.org/#concept-tree-following
fn first_following_node_not_following_root(&self, node: JSRef<'a, Node>) fn first_following_node_not_following_root(self, node: JSRef<'a, Node>)
-> Option<Temporary<Node>> { -> Option<Temporary<Node>> {
// "An object A is following an object B if A and B are in the same tree // "An object A is following an object B if A and B are in the same tree
// and A comes after B in tree order." // and A comes after B in tree order."
@ -320,7 +320,7 @@ impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> {
} }
// http://dom.spec.whatwg.org/#concept-node-filter // http://dom.spec.whatwg.org/#concept-node-filter
fn accept_node(&self, node: JSRef<'a, Node>) -> Fallible<u16> { fn accept_node(self, node: JSRef<'a, Node>) -> Fallible<u16> {
// "To filter node run these steps:" // "To filter node run these steps:"
// "1. Let n be node's nodeType attribute value minus 1." // "1. Let n be node's nodeType attribute value minus 1."
let n: uint = node.NodeType() as uint - 1; let n: uint = node.NodeType() as uint - 1;
@ -336,32 +336,32 @@ impl<'a, 'b> PrivateTreeWalkerHelpers<'a, 'b> for JSRef<'a, TreeWalker> {
match self.filter { match self.filter {
FilterNone => Ok(NodeFilterConstants::FILTER_ACCEPT), FilterNone => Ok(NodeFilterConstants::FILTER_ACCEPT),
FilterNative(f) => Ok((*f)(node)), FilterNative(f) => Ok((*f)(node)),
FilterJS(callback) => callback.AcceptNode_(*self, node, RethrowExceptions) FilterJS(callback) => callback.AcceptNode_(self, node, RethrowExceptions)
} }
} }
fn is_root_node(&self, node: JSRef<'a, Node>) -> bool { fn is_root_node(self, node: JSRef<'a, Node>) -> bool {
JS::from_rooted(node) == self.root_node JS::from_rooted(node) == self.root_node
} }
fn is_current_node(&self, node: JSRef<'a, Node>) -> bool { fn is_current_node(self, node: JSRef<'a, Node>) -> bool {
JS::from_rooted(node) == self.current_node.get() JS::from_rooted(node) == self.current_node.get()
} }
} }
pub trait TreeWalkerHelpers<'a> { pub trait TreeWalkerHelpers<'a> {
fn parent_node(&self) -> Fallible<Option<Temporary<Node>>>; fn parent_node(self) -> Fallible<Option<Temporary<Node>>>;
fn first_child(&self) -> Fallible<Option<Temporary<Node>>>; fn first_child(self) -> Fallible<Option<Temporary<Node>>>;
fn last_child(&self) -> Fallible<Option<Temporary<Node>>>; fn last_child(self) -> Fallible<Option<Temporary<Node>>>;
fn next_sibling(&self) -> Fallible<Option<Temporary<Node>>>; fn next_sibling(self) -> Fallible<Option<Temporary<Node>>>;
fn prev_sibling(&self) -> Fallible<Option<Temporary<Node>>>; fn prev_sibling(self) -> Fallible<Option<Temporary<Node>>>;
fn next_node(&self) -> Fallible<Option<Temporary<Node>>>; fn next_node(self) -> Fallible<Option<Temporary<Node>>>;
fn prev_node(&self) -> Fallible<Option<Temporary<Node>>>; fn prev_node(self) -> Fallible<Option<Temporary<Node>>>;
} }
impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> { impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
// http://dom.spec.whatwg.org/#dom-treewalker-parentnode // http://dom.spec.whatwg.org/#dom-treewalker-parentnode
fn parent_node(&self) -> Fallible<Option<Temporary<Node>>> { fn parent_node(self) -> Fallible<Option<Temporary<Node>>> {
// "1. Let node be the value of the currentNode attribute." // "1. Let node be the value of the currentNode attribute."
let mut node = self.current_node.get().root().clone(); let mut node = self.current_node.get().root().clone();
// "2. While node is not null and is not root, run these substeps:" // "2. While node is not null and is not root, run these substeps:"
@ -389,35 +389,35 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
} }
// http://dom.spec.whatwg.org/#dom-treewalker-firstchild // http://dom.spec.whatwg.org/#dom-treewalker-firstchild
fn first_child(&self) -> Fallible<Option<Temporary<Node>>> { fn first_child(self) -> Fallible<Option<Temporary<Node>>> {
// "The firstChild() method must traverse children of type first." // "The firstChild() method must traverse children of type first."
self.traverse_children(|node| node.first_child(), self.traverse_children(|node| node.first_child(),
|node| node.next_sibling()) |node| node.next_sibling())
} }
// http://dom.spec.whatwg.org/#dom-treewalker-lastchild // http://dom.spec.whatwg.org/#dom-treewalker-lastchild
fn last_child(&self) -> Fallible<Option<Temporary<Node>>> { fn last_child(self) -> Fallible<Option<Temporary<Node>>> {
// "The lastChild() method must traverse children of type last." // "The lastChild() method must traverse children of type last."
self.traverse_children(|node| node.last_child(), self.traverse_children(|node| node.last_child(),
|node| node.prev_sibling()) |node| node.prev_sibling())
} }
// http://dom.spec.whatwg.org/#dom-treewalker-nextsibling // http://dom.spec.whatwg.org/#dom-treewalker-nextsibling
fn next_sibling(&self) -> Fallible<Option<Temporary<Node>>> { fn next_sibling(self) -> Fallible<Option<Temporary<Node>>> {
// "The nextSibling() method must traverse siblings of type next." // "The nextSibling() method must traverse siblings of type next."
self.traverse_siblings(|node| node.first_child(), self.traverse_siblings(|node| node.first_child(),
|node| node.next_sibling()) |node| node.next_sibling())
} }
// http://dom.spec.whatwg.org/#dom-treewalker-previoussibling // http://dom.spec.whatwg.org/#dom-treewalker-previoussibling
fn prev_sibling(&self) -> Fallible<Option<Temporary<Node>>> { fn prev_sibling(self) -> Fallible<Option<Temporary<Node>>> {
// "The previousSibling() method must traverse siblings of type previous." // "The previousSibling() method must traverse siblings of type previous."
self.traverse_siblings(|node| node.last_child(), self.traverse_siblings(|node| node.last_child(),
|node| node.prev_sibling()) |node| node.prev_sibling())
} }
// http://dom.spec.whatwg.org/#dom-treewalker-previousnode // http://dom.spec.whatwg.org/#dom-treewalker-previousnode
fn prev_node(&self) -> Fallible<Option<Temporary<Node>>> { fn prev_node(self) -> Fallible<Option<Temporary<Node>>> {
// "1. Let node be the value of the currentNode attribute." // "1. Let node be the value of the currentNode attribute."
let mut node = self.current_node.get().root().clone(); let mut node = self.current_node.get().root().clone();
// "2. While node is not root, run these substeps:" // "2. While node is not root, run these substeps:"
@ -478,7 +478,7 @@ impl<'a> TreeWalkerHelpers<'a> for JSRef<'a, TreeWalker> {
} }
// http://dom.spec.whatwg.org/#dom-treewalker-nextnode // http://dom.spec.whatwg.org/#dom-treewalker-nextnode
fn next_node(&self) -> Fallible<Option<Temporary<Node>>> { fn next_node(self) -> Fallible<Option<Temporary<Node>>> {
// "1. Let node be the value of the currentNode attribute." // "1. Let node be the value of the currentNode attribute."
let mut node = self.current_node.get().root().clone(); let mut node = self.current_node.get().root().clone();
// "2. Let result be FILTER_ACCEPT." // "2. Let result be FILTER_ACCEPT."

View file

@ -364,21 +364,21 @@ impl Reflectable for Window {
} }
pub trait WindowHelpers { pub trait WindowHelpers {
fn damage_and_reflow(&self, damage: DocumentDamageLevel); fn damage_and_reflow(self, damage: DocumentDamageLevel);
fn flush_layout(&self, goal: ReflowGoal); fn flush_layout(self, goal: ReflowGoal);
fn wait_until_safe_to_modify_dom(&self); fn wait_until_safe_to_modify_dom(self);
fn init_browser_context(&self, doc: JSRef<Document>); fn init_browser_context(self, doc: JSRef<Document>);
fn load_url(&self, href: DOMString); fn load_url(self, href: DOMString);
fn handle_fire_timer(&self, timer_id: TimerId, cx: *mut JSContext); fn handle_fire_timer(self, timer_id: TimerId, cx: *mut JSContext);
fn evaluate_js_with_result(&self, code: &str) -> JSVal; fn evaluate_js_with_result(self, code: &str) -> JSVal;
} }
trait PrivateWindowHelpers { trait PrivateWindowHelpers {
fn set_timeout_or_interval(&self, callback: JSVal, timeout: i32, is_interval: bool) -> i32; fn set_timeout_or_interval(self, callback: JSVal, timeout: i32, is_interval: bool) -> i32;
} }
impl<'a> WindowHelpers for JSRef<'a, Window> { impl<'a> WindowHelpers for JSRef<'a, Window> {
fn evaluate_js_with_result(&self, code: &str) -> JSVal { fn evaluate_js_with_result(self, code: &str) -> JSVal {
let global = self.reflector().get_jsobject(); let global = self.reflector().get_jsobject();
let code: Vec<u16> = code.as_slice().utf16_units().collect(); let code: Vec<u16> = code.as_slice().utf16_units().collect();
let mut rval = UndefinedValue(); let mut rval = UndefinedValue();
@ -397,27 +397,27 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
}) })
} }
fn damage_and_reflow(&self, damage: DocumentDamageLevel) { fn damage_and_reflow(self, damage: DocumentDamageLevel) {
self.page().damage(damage); self.page().damage(damage);
self.page().avoided_reflows.set(self.page().avoided_reflows.get() + 1); self.page().avoided_reflows.set(self.page().avoided_reflows.get() + 1);
} }
fn flush_layout(&self, goal: ReflowGoal) { fn flush_layout(self, goal: ReflowGoal) {
self.page().flush_layout(goal); self.page().flush_layout(goal);
} }
fn wait_until_safe_to_modify_dom(&self) { fn wait_until_safe_to_modify_dom(self) {
// FIXME: This disables concurrent layout while we are modifying the DOM, since // FIXME: This disables concurrent layout while we are modifying the DOM, since
// our current architecture is entirely unsafe in the presence of races. // our current architecture is entirely unsafe in the presence of races.
self.page().join_layout(); self.page().join_layout();
} }
fn init_browser_context(&self, doc: JSRef<Document>) { fn init_browser_context(self, doc: JSRef<Document>) {
*self.browser_context.deref().borrow_mut() = Some(BrowserContext::new(doc)); *self.browser_context.deref().borrow_mut() = Some(BrowserContext::new(doc));
} }
/// Commence a new URL load which will either replace this window or scroll to a fragment. /// Commence a new URL load which will either replace this window or scroll to a fragment.
fn load_url(&self, href: DOMString) { fn load_url(self, href: DOMString) {
let base_url = self.page().get_url(); let base_url = self.page().get_url();
debug!("current page url is {:?}", base_url); debug!("current page url is {:?}", base_url);
let url = UrlParser::new().base_url(&base_url).parse(href.as_slice()); let url = UrlParser::new().base_url(&base_url).parse(href.as_slice());
@ -431,7 +431,7 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
} }
} }
fn handle_fire_timer(&self, timer_id: TimerId, cx: *mut JSContext) { fn handle_fire_timer(self, timer_id: TimerId, cx: *mut JSContext) {
let this_value = self.reflector().get_jsobject(); let this_value = self.reflector().get_jsobject();
let data = match self.active_timers.deref().borrow().find(&timer_id) { let data = match self.active_timers.deref().borrow().find(&timer_id) {
@ -455,7 +455,7 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
} }
impl<'a> PrivateWindowHelpers for JSRef<'a, Window> { impl<'a> PrivateWindowHelpers for JSRef<'a, Window> {
fn set_timeout_or_interval(&self, callback: JSVal, timeout: i32, is_interval: bool) -> i32 { fn set_timeout_or_interval(self, callback: JSVal, timeout: i32, is_interval: bool) -> i32 {
let timeout = cmp::max(0, timeout) as u64; let timeout = cmp::max(0, timeout) as u64;
let handle = self.next_timer_handle.deref().get(); let handle = self.next_timer_handle.deref().get();
self.next_timer_handle.deref().set(handle + 1); self.next_timer_handle.deref().set(handle + 1);

View file

@ -692,23 +692,23 @@ impl TrustedXHRAddress {
trait PrivateXMLHttpRequestHelpers { trait PrivateXMLHttpRequestHelpers {
unsafe fn to_trusted(&self) -> TrustedXHRAddress; unsafe fn to_trusted(self) -> TrustedXHRAddress;
fn release_once(&self); fn release_once(self);
fn change_ready_state(&self, XMLHttpRequestState); fn change_ready_state(self, XMLHttpRequestState);
fn process_partial_response(&self, progress: XHRProgress); fn process_partial_response(self, progress: XHRProgress);
fn insert_trusted_header(&self, name: String, value: String); fn insert_trusted_header(self, name: String, value: String);
fn dispatch_progress_event(&self, upload: bool, type_: DOMString, loaded: u64, total: Option<u64>); fn dispatch_progress_event(self, upload: bool, type_: DOMString, loaded: u64, total: Option<u64>);
fn dispatch_upload_progress_event(&self, type_: DOMString, partial_load: Option<u64>); fn dispatch_upload_progress_event(self, type_: DOMString, partial_load: Option<u64>);
fn dispatch_response_progress_event(&self, type_: DOMString); fn dispatch_response_progress_event(self, type_: DOMString);
fn text_response(&self) -> DOMString; fn text_response(self) -> DOMString;
fn set_timeout(&self, timeout:u32); fn set_timeout(self, timeout:u32);
fn cancel_timeout(&self); fn cancel_timeout(self);
fn filter_response_headers(&self) -> ResponseHeaderCollection; fn filter_response_headers(self) -> ResponseHeaderCollection;
} }
impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
// Creates a trusted address to the object, and roots it. Always pair this with a release() // Creates a trusted address to the object, and roots it. Always pair this with a release()
unsafe fn to_trusted(&self) -> TrustedXHRAddress { unsafe fn to_trusted(self) -> TrustedXHRAddress {
if self.pinned_count.deref().get() == 0 { if self.pinned_count.deref().get() == 0 {
JS_AddObjectRoot(self.global.root().root_ref().get_cx(), self.reflector().rootable()); JS_AddObjectRoot(self.global.root().root_ref().get_cx(), self.reflector().rootable());
} }
@ -717,7 +717,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
TrustedXHRAddress(self.deref() as *const XMLHttpRequest as *const libc::c_void) TrustedXHRAddress(self.deref() as *const XMLHttpRequest as *const libc::c_void)
} }
fn release_once(&self) { fn release_once(self) {
if self.sync.deref().get() { if self.sync.deref().get() {
// Lets us call this at various termination cases without having to // Lets us call this at various termination cases without having to
// check self.sync every time, since the pinning mechanism only is // check self.sync every time, since the pinning mechanism only is
@ -734,18 +734,18 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
} }
} }
fn change_ready_state(&self, rs: XMLHttpRequestState) { fn change_ready_state(self, rs: XMLHttpRequestState) {
assert!(self.ready_state.deref().get() != rs) assert!(self.ready_state.deref().get() != rs)
self.ready_state.deref().set(rs); self.ready_state.deref().set(rs);
let global = self.global.root(); let global = self.global.root();
let event = Event::new(&global.root_ref(), let event = Event::new(&global.root_ref(),
"readystatechange".to_string(), "readystatechange".to_string(),
false, true).root(); false, true).root();
let target: JSRef<EventTarget> = EventTargetCast::from_ref(*self); let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
target.dispatch_event_with_target(None, *event).ok(); target.dispatch_event_with_target(None, *event).ok();
} }
fn process_partial_response(&self, progress: XHRProgress) { fn process_partial_response(self, progress: XHRProgress) {
match progress { match progress {
HeadersReceivedMsg(headers, status) => { HeadersReceivedMsg(headers, status) => {
// For synchronous requests, this should not fire any events, and just store data // For synchronous requests, this should not fire any events, and just store data
@ -845,7 +845,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
} }
} }
fn insert_trusted_header(&self, name: String, value: String) { fn insert_trusted_header(self, name: String, value: String) {
// Insert a header without checking spec-compliance // Insert a header without checking spec-compliance
// Use for hardcoded headers // Use for hardcoded headers
let mut collection = self.request_headers.deref().borrow_mut(); let mut collection = self.request_headers.deref().borrow_mut();
@ -857,7 +857,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
collection.insert(maybe_header.unwrap()); collection.insert(maybe_header.unwrap());
} }
fn dispatch_progress_event(&self, upload: bool, type_: DOMString, loaded: u64, total: Option<u64>) { fn dispatch_progress_event(self, upload: bool, type_: DOMString, loaded: u64, total: Option<u64>) {
let global = self.global.root(); let global = self.global.root();
let upload_target = *self.upload.root(); let upload_target = *self.upload.root();
let progressevent = ProgressEvent::new(&global.root_ref(), let progressevent = ProgressEvent::new(&global.root_ref(),
@ -867,25 +867,25 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
let target: JSRef<EventTarget> = if upload { let target: JSRef<EventTarget> = if upload {
EventTargetCast::from_ref(upload_target) EventTargetCast::from_ref(upload_target)
} else { } else {
EventTargetCast::from_ref(*self) EventTargetCast::from_ref(self)
}; };
let event: JSRef<Event> = EventCast::from_ref(*progressevent); let event: JSRef<Event> = EventCast::from_ref(*progressevent);
target.dispatch_event_with_target(None, event).ok(); target.dispatch_event_with_target(None, event).ok();
} }
fn dispatch_upload_progress_event(&self, type_: DOMString, partial_load: Option<u64>) { fn dispatch_upload_progress_event(self, type_: DOMString, partial_load: Option<u64>) {
// If partial_load is None, loading has completed and we can just use the value from the request body // If partial_load is None, loading has completed and we can just use the value from the request body
let total = self.request_body_len.get() as u64; let total = self.request_body_len.get() as u64;
self.dispatch_progress_event(true, type_, partial_load.unwrap_or(total), Some(total)); self.dispatch_progress_event(true, type_, partial_load.unwrap_or(total), Some(total));
} }
fn dispatch_response_progress_event(&self, type_: DOMString) { fn dispatch_response_progress_event(self, type_: DOMString) {
let len = self.response.deref().borrow().len() as u64; let len = self.response.deref().borrow().len() as u64;
let total = self.response_headers.deref().borrow().content_length.map(|x| {x as u64}); let total = self.response_headers.deref().borrow().content_length.map(|x| {x as u64});
self.dispatch_progress_event(false, type_, len, total); self.dispatch_progress_event(false, type_, len, total);
} }
fn set_timeout(&self, timeout: u32) { fn set_timeout(self, timeout: u32) {
// Sets up the object to timeout in a given number of milliseconds // Sets up the object to timeout in a given number of milliseconds
// This will cancel all previous timeouts // This will cancel all previous timeouts
let oneshot = self.timer.deref().borrow_mut().oneshot(timeout as u64); let oneshot = self.timer.deref().borrow_mut().oneshot(timeout as u64);
@ -916,7 +916,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
} }
); );
} }
fn cancel_timeout(&self) { fn cancel_timeout(self) {
// Cancels timeouts on the object, if any // Cancels timeouts on the object, if any
if self.timeout_pinned.deref().get() { if self.timeout_pinned.deref().get() {
self.timeout_pinned.deref().set(false); self.timeout_pinned.deref().set(false);
@ -925,7 +925,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
// oneshot() closes the previous channel, canceling the timeout // oneshot() closes the previous channel, canceling the timeout
self.timer.deref().borrow_mut().oneshot(0); self.timer.deref().borrow_mut().oneshot(0);
} }
fn text_response(&self) -> DOMString { fn text_response(self) -> DOMString {
let mut encoding = UTF_8 as EncodingRef; let mut encoding = UTF_8 as EncodingRef;
match self.response_headers.deref().borrow().content_type { match self.response_headers.deref().borrow().content_type {
Some(ref x) => { Some(ref x) => {
@ -941,7 +941,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
// the result should be fine. XXXManishearth have a closer look at this later // the result should be fine. XXXManishearth have a closer look at this later
encoding.decode(self.response.deref().borrow().as_slice(), DecodeReplace).unwrap().to_string() encoding.decode(self.response.deref().borrow().as_slice(), DecodeReplace).unwrap().to_string()
} }
fn filter_response_headers(&self) -> ResponseHeaderCollection { fn filter_response_headers(self) -> ResponseHeaderCollection {
// http://fetch.spec.whatwg.org/#concept-response-header-list // http://fetch.spec.whatwg.org/#concept-response-header-list
let mut headers = ResponseHeaderCollection::new(); let mut headers = ResponseHeaderCollection::new();
for header in self.response_headers.deref().borrow().iter() { for header in self.response_headers.deref().borrow().iter() {