diff options
-rw-r--r-- | src/components/script/dom/document.rs | 34 | ||||
-rw-r--r-- | src/components/script/dom/element.rs | 8 | ||||
-rw-r--r-- | src/components/script/dom/eventdispatcher.rs | 6 | ||||
-rw-r--r-- | src/components/script/dom/htmlbodyelement.rs | 8 | ||||
-rw-r--r-- | src/components/script/dom/mouseevent.rs | 95 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 10 | ||||
-rw-r--r-- | src/components/script/html/hubbub_html_parser.rs | 10 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 6 |
8 files changed, 88 insertions, 89 deletions
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index ed20cdeaffb..173fa84b5f5 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -10,7 +10,7 @@ use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::codegen::Bindings::DocumentBinding; use dom::bindings::js::{JS, JSRef, Temporary, OptionalSettable, TemporaryPushable}; use dom::bindings::js::OptionalRootable; -use dom::bindings::trace::Untraceable; +use dom::bindings::trace::{Traceable, Untraceable}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::bindings::error::{ErrorResult, Fallible, NotSupported, InvalidCharacter}; use dom::bindings::error::{HierarchyRequest, NamespaceError}; @@ -63,7 +63,7 @@ pub struct Document { pub node: Node, pub reflector_: Reflector, pub window: JS<Window>, - pub idmap: HashMap<DOMString, Vec<JS<Element>>>, + idmap: Traceable<RefCell<HashMap<DOMString, Vec<JS<Element>>>>>, pub implementation: Cell<Option<JS<DOMImplementation>>>, pub content_type: DOMString, pub encoding_name: Untraceable<RefCell<DOMString>>, @@ -86,8 +86,8 @@ pub trait DocumentHelpers { fn content_changed(&self); fn damage_and_reflow(&self, damage: DocumentDamageLevel); fn wait_until_safe_to_modify_dom(&self); - fn unregister_named_element(&mut self, to_unregister: &JSRef<Element>, id: DOMString); - fn register_named_element(&mut self, element: &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 load_anchor_href(&self, href: DOMString); } @@ -122,28 +122,28 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { /// Remove any existing association between the provided id and any elements in this document. - fn unregister_named_element(&mut self, + fn unregister_named_element(&self, to_unregister: &JSRef<Element>, id: DOMString) { - let mut is_empty = false; - match self.idmap.find_mut(&id) { - None => {}, + let mut idmap = self.idmap.deref().borrow_mut(); + let is_empty = match idmap.find_mut(&id) { + None => false, Some(elements) => { let position = elements.iter() .map(|elem| elem.root()) .position(|element| &*element == to_unregister) .expect("This element should be in registered."); elements.remove(position); - is_empty = elements.is_empty(); + elements.is_empty() } - } + }; if is_empty { - self.idmap.remove(&id); + idmap.remove(&id); } } /// Associate an element present in this document with the provided id. - fn register_named_element(&mut self, + fn register_named_element(&self, element: &JSRef<Element>, id: DOMString) { assert!({ @@ -151,10 +151,12 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { node.is_in_doc() }); + let mut idmap = self.idmap.deref().borrow_mut(); + // FIXME https://github.com/mozilla/rust/issues/13195 // Use mangle() when it exists again. let root = self.GetDocumentElement().expect("The element is in the document, so there must be a document element.").root(); - match self.idmap.find_mut(&id) { + match idmap.find_mut(&id) { Some(elements) => { let new_node: &JSRef<Node> = NodeCast::from_ref(element); let mut head : uint = 0u; @@ -180,7 +182,7 @@ impl<'a> DocumentHelpers for JSRef<'a, Document> { } let mut elements = vec!(); elements.push_unrooted(element); - self.idmap.insert(id, elements); + idmap.insert(id, elements); } fn load_anchor_href(&self, href: DOMString) { @@ -214,7 +216,7 @@ impl Document { node: Node::new_without_doc(DocumentNodeTypeId), reflector_: Reflector::new(), window: window.unrooted(), - idmap: HashMap::new(), + idmap: Traceable::new(RefCell::new(HashMap::new())), implementation: Cell::new(None), content_type: match content_type { Some(string) => string.clone(), @@ -418,7 +420,7 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { // http://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid fn GetElementById(&self, id: DOMString) -> Option<Temporary<Element>> { - match self.idmap.find_equiv(&id) { + match self.idmap.deref().borrow().find_equiv(&id) { None => None, Some(ref elements) => Some(Temporary::new(elements.get(0).clone())), } diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 976ed02c739..9e85eef9908 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -803,8 +803,8 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { match self.get_attribute(Null, "id").root() { Some(attr) => { - let mut doc = document_from_node(self).root(); - doc.register_named_element(self, attr.deref().Value()); + let doc = document_from_node(self).root(); + doc.deref().register_named_element(self, attr.deref().Value()); } _ => () } @@ -818,8 +818,8 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { match self.get_attribute(Null, "id").root() { Some(attr) => { - let mut doc = document_from_node(self).root(); - doc.unregister_named_element(self, attr.deref().Value()); + let doc = document_from_node(self).root(); + doc.deref().unregister_named_element(self, attr.deref().Value()); } _ => () } diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs index 6dd3d20213d..282130084d0 100644 --- a/src/components/script/dom/eventdispatcher.rs +++ b/src/components/script/dom/eventdispatcher.rs @@ -111,10 +111,10 @@ pub fn dispatch_event<'a, 'b>(target: &JSRef<'a, EventTarget>, /* default action */ let target = event.GetTarget().root(); match target { - Some(mut target) => { - let node: Option<&JSRef<Node>> = NodeCast::to_ref(&mut *target); + Some(target) => { + let node: Option<&JSRef<Node>> = NodeCast::to_ref(&*target); match node { - Some(node) =>{ + Some(node) => { let vtable = vtable_for(node); vtable.handle_event(event); } diff --git a/src/components/script/dom/htmlbodyelement.rs b/src/components/script/dom/htmlbodyelement.rs index 6e82d78fa50..95335534141 100644 --- a/src/components/script/dom/htmlbodyelement.rs +++ b/src/components/script/dom/htmlbodyelement.rs @@ -43,7 +43,7 @@ impl HTMLBodyElement { pub trait HTMLBodyElementMethods { fn GetOnunload(&self) -> Option<EventHandlerNonNull>; - fn SetOnunload(&mut self, listener: Option<EventHandlerNonNull>); + fn SetOnunload(&self, listener: Option<EventHandlerNonNull>); } impl<'a> HTMLBodyElementMethods for JSRef<'a, HTMLBodyElement> { @@ -52,9 +52,9 @@ impl<'a> HTMLBodyElementMethods for JSRef<'a, HTMLBodyElement> { win.deref().GetOnunload() } - fn SetOnunload(&mut self, listener: Option<EventHandlerNonNull>) { - let mut win = window_from_node(self).root(); - win.SetOnunload(listener) + fn SetOnunload(&self, listener: Option<EventHandlerNonNull>) { + let win = window_from_node(self).root(); + win.deref().SetOnunload(listener) } } diff --git a/src/components/script/dom/mouseevent.rs b/src/components/script/dom/mouseevent.rs index 4e00d72f91a..b942909639f 100644 --- a/src/components/script/dom/mouseevent.rs +++ b/src/components/script/dom/mouseevent.rs @@ -4,8 +4,9 @@ use dom::bindings::codegen::Bindings::MouseEventBinding; use dom::bindings::codegen::InheritTypes::{UIEventCast, MouseEventDerived}; -use dom::bindings::js::{JS, JSRef, RootedReference, Temporary, OptionalSettable}; use dom::bindings::error::Fallible; +use dom::bindings::js::{JS, JSRef, RootedReference, Temporary, OptionalSettable}; +use dom::bindings::trace::Traceable; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::event::{Event, MouseEventTypeId}; use dom::eventtarget::EventTarget; @@ -17,15 +18,15 @@ use std::cell::Cell; #[deriving(Encodable)] pub struct MouseEvent { pub mouseevent: UIEvent, - pub screen_x: i32, - pub screen_y: i32, - pub client_x: i32, - pub client_y: i32, - pub ctrl_key: bool, - pub shift_key: bool, - pub alt_key: bool, - pub meta_key: bool, - pub button: i16, + pub screen_x: Traceable<Cell<i32>>, + pub screen_y: Traceable<Cell<i32>>, + pub client_x: Traceable<Cell<i32>>, + pub client_y: Traceable<Cell<i32>>, + pub ctrl_key: Traceable<Cell<bool>>, + pub shift_key: Traceable<Cell<bool>>, + pub alt_key: Traceable<Cell<bool>>, + pub meta_key: Traceable<Cell<bool>>, + pub button: Traceable<Cell<i16>>, pub related_target: Cell<Option<JS<EventTarget>>> } @@ -39,15 +40,15 @@ impl MouseEvent { pub fn new_inherited() -> MouseEvent { MouseEvent { mouseevent: UIEvent::new_inherited(MouseEventTypeId), - screen_x: 0, - screen_y: 0, - client_x: 0, - client_y: 0, - ctrl_key: false, - shift_key: false, - alt_key: false, - meta_key: false, - button: 0, + screen_x: Traceable::new(Cell::new(0)), + screen_y: Traceable::new(Cell::new(0)), + client_x: Traceable::new(Cell::new(0)), + client_y: Traceable::new(Cell::new(0)), + ctrl_key: Traceable::new(Cell::new(false)), + shift_key: Traceable::new(Cell::new(false)), + alt_key: Traceable::new(Cell::new(false)), + meta_key: Traceable::new(Cell::new(false)), + button: Traceable::new(Cell::new(0)), related_target: Cell::new(None) } } @@ -74,11 +75,11 @@ impl MouseEvent { metaKey: bool, button: i16, relatedTarget: Option<JSRef<EventTarget>>) -> Temporary<MouseEvent> { - let mut ev = MouseEvent::new_uninitialized(window).root(); - ev.InitMouseEvent(type_, canBubble, cancelable, view, detail, - screenX, screenY, clientX, clientY, - ctrlKey, altKey, shiftKey, metaKey, - button, relatedTarget); + let ev = MouseEvent::new_uninitialized(window).root(); + ev.deref().InitMouseEvent(type_, canBubble, cancelable, view, detail, + screenX, screenY, clientX, clientY, + ctrlKey, altKey, shiftKey, metaKey, + button, relatedTarget); Temporary::from_rooted(&*ev) } @@ -108,7 +109,7 @@ pub trait MouseEventMethods { fn MetaKey(&self) -> bool; fn Button(&self) -> i16; fn GetRelatedTarget(&self) -> Option<Temporary<EventTarget>>; - fn InitMouseEvent(&mut self, + fn InitMouseEvent(&self, typeArg: DOMString, canBubbleArg: bool, cancelableArg: bool, @@ -128,46 +129,46 @@ pub trait MouseEventMethods { impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> { fn ScreenX(&self) -> i32 { - self.screen_x + self.screen_x.deref().get() } fn ScreenY(&self) -> i32 { - self.screen_y + self.screen_y.deref().get() } fn ClientX(&self) -> i32 { - self.client_x + self.client_x.deref().get() } fn ClientY(&self) -> i32 { - self.client_y + self.client_y.deref().get() } fn CtrlKey(&self) -> bool { - self.ctrl_key + self.ctrl_key.deref().get() } fn ShiftKey(&self) -> bool { - self.shift_key + self.shift_key.deref().get() } fn AltKey(&self) -> bool { - self.alt_key + self.alt_key.deref().get() } fn MetaKey(&self) -> bool { - self.meta_key + self.meta_key.deref().get() } fn Button(&self) -> i16 { - self.button + self.button.deref().get() } fn GetRelatedTarget(&self) -> Option<Temporary<EventTarget>> { self.related_target.get().clone().map(|target| Temporary::new(target)) } - fn InitMouseEvent(&mut self, + fn InitMouseEvent(&self, typeArg: DOMString, canBubbleArg: bool, cancelableArg: bool, @@ -183,19 +184,17 @@ impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> { metaKeyArg: bool, buttonArg: i16, relatedTargetArg: Option<JSRef<EventTarget>>) { - { - let uievent: &mut JSRef<UIEvent> = UIEventCast::from_mut_ref(self); - uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); - } - self.screen_x = screenXArg; - self.screen_y = screenYArg; - self.client_x = clientXArg; - self.client_y = clientYArg; - self.ctrl_key = ctrlKeyArg; - self.alt_key = altKeyArg; - self.shift_key = shiftKeyArg; - self.meta_key = metaKeyArg; - self.button = buttonArg; + let uievent: &JSRef<UIEvent> = UIEventCast::from_ref(self); + uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, detailArg); + self.screen_x.deref().set(screenXArg); + self.screen_y.deref().set(screenYArg); + self.client_x.deref().set(clientXArg); + self.client_y.deref().set(clientYArg); + self.ctrl_key.deref().set(ctrlKeyArg); + self.alt_key.deref().set(altKeyArg); + self.shift_key.deref().set(shiftKeyArg); + self.meta_key.deref().set(metaKeyArg); + self.button.deref().set(buttonArg); self.related_target.assign(relatedTargetArg); } } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index d83d48b047f..7b095bc9c57 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -1376,9 +1376,9 @@ pub trait NodeMethods { fn GetPreviousSibling(&self) -> Option<Temporary<Node>>; fn GetNextSibling(&self) -> Option<Temporary<Node>>; fn GetNodeValue(&self) -> Option<DOMString>; - fn SetNodeValue(&mut self, val: Option<DOMString>) -> ErrorResult; + fn SetNodeValue(&self, val: Option<DOMString>) -> ErrorResult; fn GetTextContent(&self) -> Option<DOMString>; - fn SetTextContent(&mut self, value: Option<DOMString>) -> ErrorResult; + fn SetTextContent(&self, value: Option<DOMString>) -> ErrorResult; fn InsertBefore(&self, node: &JSRef<Node>, child: Option<JSRef<Node>>) -> Fallible<Temporary<Node>>; fn AppendChild(&self, node: &JSRef<Node>) -> Fallible<Temporary<Node>>; fn ReplaceChild(&self, node: &JSRef<Node>, child: &JSRef<Node>) -> Fallible<Temporary<Node>>; @@ -1520,8 +1520,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> { } // http://dom.spec.whatwg.org/#dom-node-nodevalue - fn SetNodeValue(&mut self, val: Option<DOMString>) - -> ErrorResult { + fn SetNodeValue(&self, val: Option<DOMString>) -> ErrorResult { match self.type_id { CommentNodeTypeId | TextNodeTypeId | @@ -1560,8 +1559,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> { } // http://dom.spec.whatwg.org/#dom-node-textcontent - fn SetTextContent(&mut self, value: Option<DOMString>) - -> ErrorResult { + fn SetTextContent(&self, value: Option<DOMString>) -> ErrorResult { let value = null_str_as_empty(&value); match self.type_id { DocumentFragmentNodeTypeId | diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index c7629958d33..15fa445bb9d 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -291,7 +291,7 @@ pub fn build_element_from_tag(tag: DOMString, ns: Namespace, document: &JSRef<Do } pub fn parse_html(page: &Page, - document: &mut JSRef<Document>, + document: &JSRef<Document>, url: Url, resource_task: ResourceTask) -> HtmlParserResult { @@ -485,15 +485,15 @@ pub fn parse_html(page: &Page, set_quirks_mode: |mode| { debug!("set quirks mode"); // NOTE: tmp vars are workaround for lifetime issues. Both required. - let mut tmp_borrow = doc_cell.borrow_mut(); - let tmp = &mut *tmp_borrow; + let tmp_borrow = doc_cell.borrow_mut(); + let tmp = &*tmp_borrow; tmp.set_quirks_mode(mode); }, encoding_change: |encname| { debug!("encoding change"); // NOTE: tmp vars are workaround for lifetime issues. Both required. - let mut tmp_borrow = doc_cell.borrow_mut(); - let tmp = &mut *tmp_borrow; + let tmp_borrow = doc_cell.borrow_mut(); + let tmp = &*tmp_borrow; tmp.set_encoding_name(encname); }, complete_script: |script| { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index adcbd050ee8..f28044a7102 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -947,7 +947,7 @@ impl ScriptTask { self.chan.clone(), self.compositor.dup(), self.image_cache_task.clone()).root(); - let mut document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root(); + let document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root(); window.deref().init_browser_context(&*document); with_compartment((**cx).ptr, window.reflector().get_jsobject(), || { @@ -960,7 +960,7 @@ impl ScriptTask { // // Note: We can parse the next document in parallel with any previous documents. let html_parsing_result = hubbub_html_parser::parse_html(&*page, - &mut *document, + &*document, url.clone(), self.resource_task.clone()); @@ -998,7 +998,7 @@ impl ScriptTask { } // Kick off the initial reflow of the page. - document.content_changed(); + document.deref().content_changed(); let fragment = url.fragment.as_ref().map(|ref fragment| fragment.to_string()); |