diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2015-10-31 18:24:23 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2015-10-31 18:24:23 +0530 |
commit | 37c03c78165fbb77eb024f2c3376d5e33cd7e446 (patch) | |
tree | 282199e1d9c244c20d62f35b7f6517913d2e37f0 | |
parent | 521a87180a85709f8f704df33537f79bd131bf71 (diff) | |
parent | d8ef3809a6c73922a5affc475f623a0f1152be28 (diff) | |
download | servo-37c03c78165fbb77eb024f2c3376d5e33cd7e446.tar.gz servo-37c03c78165fbb77eb024f2c3376d5e33cd7e446.zip |
Auto merge of #8262 - nxnfufunezn:Remove_JS_root, r=Ms2ger
Removed JS::root #8251
Fixes #8251
r? @Ms2ger
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8262)
<!-- Reviewable:end -->
25 files changed, 98 insertions, 126 deletions
diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index a1a1c68c8c0..e91e94a0a4b 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -230,8 +230,8 @@ impl GlobalField { /// Create a stack-bounded root for this reference. pub fn root(&self) -> GlobalRoot { match *self { - GlobalField::Window(ref window) => GlobalRoot::Window(window.root()), - GlobalField::Worker(ref worker) => GlobalRoot::Worker(worker.root()), + GlobalField::Window(ref window) => GlobalRoot::Window(Root::from_ref(window)), + GlobalField::Worker(ref worker) => GlobalRoot::Worker(Root::from_ref(worker)), } } } diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index a6af7680a96..c78399189ab 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -73,10 +73,6 @@ impl<T> JS<T> { } impl<T: Reflectable> JS<T> { - /// Root this JS-owned value to prevent its collection as garbage. - pub fn root(&self) -> Root<T> { - Root::new(self.ptr) - } /// Create a JS<T> from a Root<T> /// XXX Not a great API. Should be a call on Root<T> instead #[allow(unrooted_must_root)] @@ -291,7 +287,7 @@ impl<T: Reflectable> MutHeap<JS<T>> { pub fn get(&self) -> Root<T> { debug_assert!(task_state::get().is_script()); unsafe { - ptr::read(self.val.get()).root() + Root::from_ref(&*ptr::read(self.val.get())) } } } @@ -369,7 +365,7 @@ impl<T: Reflectable> MutNullableHeap<JS<T>> { pub fn get(&self) -> Option<Root<T>> { debug_assert!(task_state::get().is_script()); unsafe { - ptr::read(self.ptr.get()).map(|o| o.root()) + ptr::read(self.ptr.get()).map(|o| Root::from_ref(&*o)) } } diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index aa7936f69f5..a42e98a1a03 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -148,7 +148,7 @@ impl CanvasRenderingContext2D { } fn mark_as_dirty(&self) { - self.canvas.root().upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); + self.canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); } fn update_transform(&self) { @@ -290,7 +290,7 @@ impl CanvasRenderingContext2D { let smoothing_enabled = self.state.borrow().image_smoothing_enabled; // If the source and target canvas are the same - let msg = if self.canvas.root().r() == canvas { + let msg = if &*self.canvas == canvas { CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled)) } else { // Source and target canvases are different let context = match canvas.get_or_init_2d_context() { @@ -367,8 +367,7 @@ impl CanvasRenderingContext2D { #[inline] fn request_image_from_cache(&self, url: Url) -> ImageResponse { - let canvas = self.canvas.root(); - let window = window_from_node(canvas.r()); + let window = window_from_node(&*self.canvas); canvas_utils::request_image_from_cache(window.r(), url) } @@ -422,7 +421,7 @@ impl LayoutCanvasRenderingContext2DHelpers for LayoutJS<CanvasRenderingContext2D impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-canvas fn Canvas(&self) -> Root<HTMLCanvasElement> { - self.canvas.root() + Root::from_ref(&*self.canvas) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-save @@ -764,7 +763,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { StringOrCanvasGradientOrCanvasPattern::eString(result) }, CanvasFillOrStrokeStyle::Gradient(ref gradient) => { - StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient.root()) + StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(Root::from_ref(&*gradient)) }, } } @@ -804,7 +803,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { StringOrCanvasGradientOrCanvasPattern::eString(result) }, CanvasFillOrStrokeStyle::Gradient(ref gradient) => { - StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient.root()) + StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(Root::from_ref(&*gradient)) }, } } @@ -881,7 +880,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap(); let dest_rect = Rect::new(Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()), Size2D::new(sw as i32, sh as i32)); - let canvas_size = self.canvas.root().r().get_size(); + let canvas_size = self.canvas.get_size(); let canvas_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64); self.ipc_renderer .send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender))) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 0a94f9f5504..4559bb0981c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -391,8 +391,7 @@ impl Document { None => false, Some(elements) => { let position = elements.iter() - .map(|elem| elem.root()) - .position(|element| element.r() == to_unregister) + .position(|element| &**element == to_unregister) .expect("This element should be in registered."); elements.remove(position); elements.is_empty() @@ -428,7 +427,7 @@ impl Document { let root = root.upcast::<Node>(); for node in root.traverse_preorder() { if let Some(elem) = node.downcast() { - if (*elements)[head].root().r() == elem { + if &*(*elements)[head] == elem { head += 1; } if new_node == node.r() || head == elements.len() { @@ -685,8 +684,7 @@ impl Document { // under the mouse. for target in prev_mouse_over_targets.iter() { if !mouse_over_targets.contains(target) { - let target = target.root(); - let target_ref = target.r(); + let target_ref = &**target; if target_ref.get_hover_state() { target_ref.set_hover_state(false); @@ -749,27 +747,27 @@ impl Document { }, }; let target = el.upcast::<EventTarget>(); - let window = self.window.root(); + let window = &*self.window; let client_x = Finite::wrap(point.x as f64); let client_y = Finite::wrap(point.y as f64); let page_x = Finite::wrap(point.x as f64 + window.PageXOffset() as f64); let page_y = Finite::wrap(point.y as f64 + window.PageYOffset() as f64); - let touch = Touch::new(window.r(), identifier, target, + let touch = Touch::new(window, identifier, target, client_x, client_y, // TODO: Get real screen coordinates? client_x, client_y, page_x, page_y); let mut touches = RootedVec::new(); touches.push(JS::from_rooted(&touch)); - let touches = TouchList::new(window.r(), touches.r()); + let touches = TouchList::new(window, touches.r()); - let event = TouchEvent::new(window.r(), + let event = TouchEvent::new(window, event_name, EventBubbles::Bubbles, EventCancelable::Cancelable, - Some(window.r()), + Some(window), 0i32, &touches, &touches, &touches, // FIXME: modifier keys @@ -777,9 +775,9 @@ impl Document { let event = event.upcast::<Event>(); let result = event.fire(target); - window.r().reflow(ReflowGoal::ForDisplay, - ReflowQueryType::NoQuery, - ReflowReason::MouseEvent); + window.reflow(ReflowGoal::ForDisplay, + ReflowQueryType::NoQuery, + ReflowReason::MouseEvent); result } @@ -1089,13 +1087,15 @@ impl Document { } let mut deferred_scripts = self.deferred_scripts.borrow_mut(); while !deferred_scripts.is_empty() { - let script = deferred_scripts[0].root(); - // Part of substep 1. - if !script.is_ready_to_be_executed() { - return; + { + let script = &*deferred_scripts[0]; + // Part of substep 1. + if !script.is_ready_to_be_executed() { + return; + } + // Substep 2. + script.execute(); } - // Substep 2. - script.execute(); // Substep 3. deferred_scripts.remove(0); // Substep 4 (implicit). @@ -1110,7 +1110,7 @@ impl Document { // Execute the first in-order asap-executed script if it's ready, repeat as required. // Re-borrowing the list for each step because it can also be borrowed under execute. while self.asap_in_order_scripts_list.borrow().len() > 0 { - let script = self.asap_in_order_scripts_list.borrow()[0].root(); + let script = Root::from_ref(&*self.asap_in_order_scripts_list.borrow()[0]); if !script.r().is_ready_to_be_executed() { break; } @@ -1121,7 +1121,7 @@ impl Document { let mut idx = 0; // Re-borrowing the set for each step because it can also be borrowed under execute. while idx < self.asap_scripts_set.borrow().len() { - let script = self.asap_scripts_set.borrow()[idx].root(); + let script = Root::from_ref(&*self.asap_scripts_set.borrow()[idx]); if !script.r().is_ready_to_be_executed() { idx += 1; continue; @@ -1332,7 +1332,7 @@ impl Document { } pub fn get_element_by_id(&self, id: &Atom) -> Option<Root<Element>> { - self.idmap.borrow().get(&id).map(|ref elements| (*elements)[0].root()) + self.idmap.borrow().get(&id).map(|ref elements| Root::from_ref(&*(*elements)[0])) } pub fn record_element_state_change(&self, el: &Element, which: ElementState) { @@ -1925,7 +1925,7 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-defaultview fn DefaultView(&self) -> Root<Window> { - self.window.root() + Root::from_ref(&*self.window) } // https://html.spec.whatwg.org/multipage/#dom-document-cookie diff --git a/components/script/dom/domrectlist.rs b/components/script/dom/domrectlist.rs index cd67dbc28c7..963d97df623 100644 --- a/components/script/dom/domrectlist.rs +++ b/components/script/dom/domrectlist.rs @@ -42,7 +42,7 @@ impl DOMRectListMethods for DOMRectList { fn Item(&self, index: u32) -> Option<Root<DOMRect>> { let rects = &self.rects; if index < rects.len() as u32 { - Some(rects[index as usize].root()) + Some(Root::from_ref(&*rects[index as usize])) } else { None } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 46628935bb1..eaee0d241f0 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -874,16 +874,15 @@ impl Element { } pub fn get_attribute(&self, namespace: &Namespace, local_name: &Atom) -> Option<Root<Attr>> { - self.attrs.borrow().iter().map(JS::root).find(|attr| { + self.attrs.borrow().iter().find(|attr| { attr.local_name() == local_name && attr.namespace() == namespace - }) + }).map(|js| Root::from_ref(&**js)) } // https://dom.spec.whatwg.org/#concept-element-attributes-get-by-name pub fn get_attribute_by_name(&self, name: DOMString) -> Option<Root<Attr>> { let name = &self.parsed_name(name); - self.attrs.borrow().iter().map(JS::root) - .find(|a| a.r().name() == name) + self.attrs.borrow().iter().find(|a| a.name() == name).map(|js| Root::from_ref(&**js)) } pub fn set_attribute_from_parser(&self, @@ -891,8 +890,8 @@ impl Element { value: DOMString, prefix: Option<Atom>) { // Don't set if the attribute already exists, so we can handle add_attrs_if_missing - if self.attrs.borrow().iter().map(JS::root) - .any(|a| *a.r().local_name() == qname.local && *a.r().namespace() == qname.ns) { + if self.attrs.borrow().iter() + .any(|a| *a.local_name() == qname.local && *a.namespace() == qname.ns) { return; } @@ -942,7 +941,8 @@ impl Element { find: F) where F: Fn(&Attr) -> bool { - let attr = self.attrs.borrow().iter().map(JS::root).find(|attr| find(&attr)); + let attr = self.attrs.borrow().iter() + .find(|attr| find(&attr)).map(|js| Root::from_ref(&**js)); if let Some(attr) = attr { attr.set_value(value, self); } else { @@ -973,10 +973,10 @@ impl Element { fn remove_first_matching_attribute<F>(&self, find: F) -> Option<Root<Attr>> where F: Fn(&Attr) -> bool { - let idx = self.attrs.borrow().iter().map(JS::root).position(|attr| find(&attr)); + let idx = self.attrs.borrow().iter().position(|attr| find(&attr)); idx.map(|idx| { - let attr = (*self.attrs.borrow())[idx].root(); + let attr = Root::from_ref(&*(*self.attrs.borrow())[idx]); self.attrs.borrow_mut().remove(idx); attr.set_owner(None); if attr.namespace() == &ns!("") { @@ -1005,8 +1005,8 @@ impl Element { pub fn has_attribute(&self, local_name: &Atom) -> bool { assert!(local_name.bytes().all(|b| b.to_ascii_lowercase() == b)); - self.attrs.borrow().iter().map(JS::root).any(|attr| { - attr.r().local_name() == local_name && attr.r().namespace() == &ns!("") + self.attrs.borrow().iter().any(|attr| { + attr.local_name() == local_name && attr.namespace() == &ns!("") }) } @@ -1695,8 +1695,8 @@ impl<'a> ::selectors::Element for Root<Element> { }) }, NamespaceConstraint::Any => { - self.attrs.borrow().iter().map(JS::root).any(|attr| { - attr.local_name() == local_name && test(&attr.value()) + self.attrs.borrow().iter().any(|attr| { + attr.local_name() == local_name && test(&attr.value()) }) } } diff --git a/components/script/dom/filelist.rs b/components/script/dom/filelist.rs index d695ac8f43a..78a9ee30012 100644 --- a/components/script/dom/filelist.rs +++ b/components/script/dom/filelist.rs @@ -40,7 +40,7 @@ impl FileListMethods for FileList { // https://w3c.github.io/FileAPI/#dfn-item fn Item(&self, index: u32) -> Option<Root<File>> { - Some(self.list[index as usize].root()) + Some(Root::from_ref(&*(self.list[index as usize]))) } // check-tidy: no specs after this line diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index a51e058b864..5956aadd26c 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -90,7 +90,7 @@ impl FormDataMethods for FormData { .get(&name) .map(|entry| match entry[0] { FormDatum::StringData(ref s) => eString(s.clone()), - FormDatum::FileData(ref f) => eFile(f.root()), + FormDatum::FileData(ref f) => eFile(Root::from_ref(&*f)), }) } diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 47126ed3dd0..67894f36429 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -153,7 +153,7 @@ impl HTMLCanvasElement { } match *self.context.borrow().as_ref().unwrap() { - CanvasContext::Context2d(ref context) => Some(context.root()), + CanvasContext::Context2d(ref context) => Some(Root::from_ref(&*context)), _ => None, } } @@ -182,7 +182,7 @@ impl HTMLCanvasElement { } if let Some(CanvasContext::WebGL(ref context)) = *self.context.borrow() { - Some(context.root()) + Some(Root::from_ref(&*context)) } else { None } diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 4ddc0fef6dd..62335a33a6e 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -164,7 +164,7 @@ impl HTMLCollection { pub fn elements_iter(&self) -> HTMLCollectionElementsIter { let ref filter = self.collection.1; - let root = self.collection.0.root(); + let root = Root::from_ref(&*self.collection.0); let mut node_iter = root.traverse_preorder(); let _ = node_iter.next(); // skip the root node HTMLCollectionElementsIter { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index bb52cbc2402..6ebf0106099 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -360,8 +360,8 @@ impl HTMLElement { pub fn supported_prop_names_custom_attr(&self) -> Vec<DOMString> { let element = self.upcast::<Element>(); - element.attrs().iter().map(JS::root).filter_map(|attr| { - let raw_name = attr.r().local_name(); + element.attrs().iter().filter_map(|attr| { + let raw_name = attr.local_name(); to_camel_case(&raw_name) }).collect() } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 118c0648e77..4f1b0ca135a 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -364,7 +364,7 @@ impl HTMLScriptElement { // Step 1. let doc = document_from_node(self); - if self.parser_inserted.get() && doc.r() != self.parser_document.root().r() { + if self.parser_inserted.get() && &*doc != &*self.parser_document { return; } diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index 5c78de0ed51..fc344e78ccf 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -42,7 +42,7 @@ impl NamedNodeMapMethods for NamedNodeMap { // https://dom.spec.whatwg.org/#dom-namednodemap-item fn Item(&self, index: u32) -> Option<Root<Attr>> { - self.owner.attrs().get(index as usize).map(JS::root) + self.owner.attrs().get(index as usize).map(|js| Root::from_ref(&**js)) } // https://dom.spec.whatwg.org/#dom-namednodemap-getnameditem @@ -87,7 +87,7 @@ impl NamedNodeMapMethods for NamedNodeMap { // https://heycam.github.io/webidl/#dfn-supported-property-names fn SupportedPropertyNames(&self) -> Vec<DOMString> { - self.owner.attrs().iter().map(JS::root).map(|attr| { + self.owner.attrs().iter().map(|attr| { (**attr.name()).to_owned() }).collect() } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index c5a891d56db..a8dd8972ca0 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1648,7 +1648,7 @@ impl Node { let node_elem = node.downcast::<Element>().unwrap(); let copy_elem = copy.downcast::<Element>().unwrap(); - for attr in node_elem.attrs().iter().map(JS::root) { + for attr in node_elem.attrs().iter() { copy_elem.push_new_attribute(attr.local_name().clone(), attr.value().clone(), attr.name().clone(), @@ -1719,12 +1719,10 @@ impl Node { let prefix_atom = prefix.as_ref().map(|s| Atom::from_slice(s)); // Step 2. - let namespace_attr = - element.attrs() - .iter() - .map(|attr| attr.root()) - .find(|attr| attr_defines_namespace(attr.r(), - &prefix_atom)); + let attrs = element.attrs(); + let namespace_attr = attrs.iter().find(|attr| { + attr_defines_namespace(attr, &prefix_atom) + }); // Steps 2.1-2. if let Some(attr) = namespace_attr { @@ -2154,12 +2152,10 @@ impl NodeMethods for Node { // FIXME(https://github.com/rust-lang/rust/issues/23338) let attrs = element.attrs(); attrs.iter().all(|attr| { - let attr = attr.root(); other_element.attrs().iter().any(|other_attr| { - let other_attr = other_attr.root(); - (*attr.r().namespace() == *other_attr.r().namespace()) && - (attr.r().local_name() == other_attr.r().local_name()) && - (**attr.r().value() == **other_attr.r().value()) + (*attr.namespace() == *other_attr.namespace()) && + (attr.local_name() == other_attr.local_name()) && + (**attr.value() == **other_attr.value()) }) }) } diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index 27a99ec3b55..762d2233c6c 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -67,7 +67,7 @@ impl NodeIterator { impl NodeIteratorMethods for NodeIterator { // https://dom.spec.whatwg.org/#dom-nodeiterator-root fn Root(&self) -> Root<Node> { - self.root_node.root() + Root::from_ref(&*self.root_node) } // https://dom.spec.whatwg.org/#dom-nodeiterator-whattoshow diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 490df73bd56..68e3b7ee424 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -66,7 +66,7 @@ impl NodeListMethods for NodeList { fn Item(&self, index: u32) -> Option<Root<Node>> { match self.list_type { NodeListType::Simple(ref elems) => { - elems.get(index as usize).map(|node| node.root()) + elems.get(index as usize).map(|node| Root::from_ref(&**node)) }, NodeListType::Children(ref list) => list.item(index), } diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index b8b6c17ef09..591cb5472c4 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -46,7 +46,7 @@ impl Performance { impl PerformanceMethods for Performance { // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html#performance-timing-attribute fn Timing(&self) -> Root<PerformanceTiming> { - self.timing.root() + Root::from_ref(&*self.timing) } // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/HighResolutionTime/Overview.html#dom-performance-now diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index 3a4a59ba3af..433c1085aef 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -45,7 +45,7 @@ impl Sink { #[allow(unrooted_must_root)] // method is only run at parse time pub fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Root<Node> { match child { - NodeOrText::AppendNode(n) => n.root(), + NodeOrText::AppendNode(n) => Root::from_ref(&*n), NodeOrText::AppendText(t) => { let text = Text::new(t.into(), &self.document); Root::upcast(text) diff --git a/components/script/dom/touchlist.rs b/components/script/dom/touchlist.rs index 5806f945008..f964a1ff250 100644 --- a/components/script/dom/touchlist.rs +++ b/components/script/dom/touchlist.rs @@ -38,7 +38,7 @@ impl TouchListMethods for TouchList { /// https://w3c.github.io/touch-events/#widl-TouchList-item-getter-Touch-unsigned-long-index fn Item(&self, index: u32) -> Option<Root<Touch>> { - self.touches.get(index as usize).map(JS::root) + self.touches.get(index as usize).map(|js| Root::from_ref(&**js)) } /// https://w3c.github.io/touch-events/#widl-TouchList-item-getter-Touch-unsigned-long-index diff --git a/components/script/dom/treewalker.rs b/components/script/dom/treewalker.rs index f19e8383ddf..2bd5cc706e7 100644 --- a/components/script/dom/treewalker.rs +++ b/components/script/dom/treewalker.rs @@ -65,7 +65,7 @@ impl TreeWalker { impl TreeWalkerMethods for TreeWalker { // https://dom.spec.whatwg.org/#dom-treewalker-root fn Root(&self) -> Root<Node> { - self.root_node.root() + Root::from_ref(&*self.root_node) } // https://dom.spec.whatwg.org/#dom-treewalker-whattoshow diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index aa92967cb1e..07ac00000a2 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -153,7 +153,7 @@ impl WebGLRenderingContext { } fn mark_as_dirty(&self) { - self.canvas.root().upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); + self.canvas.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); } } @@ -166,7 +166,7 @@ impl Drop for WebGLRenderingContext { impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 fn Canvas(&self) -> Root<HTMLCanvasElement> { - self.canvas.root() + Root::from_ref(&*self.canvas) } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 @@ -848,8 +848,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { None => return, }; - let canvas = self.canvas.root(); - let window = window_from_node(canvas.r()); + let window = window_from_node(&*self.canvas); let img = match canvas_utils::request_image_from_cache(window.r(), img_url) { ImageResponse::Loaded(img) => img, diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 39b86117b34..c5f8ef62556 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -465,7 +465,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { // https://xhr.spec.whatwg.org/#the-upload-attribute fn Upload(&self) -> Root<XMLHttpRequestUpload> { - self.upload.root() + Root::from_ref(&*self.upload) } // https://xhr.spec.whatwg.org/#the-send()-method diff --git a/components/script/page.rs b/components/script/page.rs index b6b35c6119a..67cb1ca46ed 100644 --- a/components/script/page.rs +++ b/components/script/page.rs @@ -68,11 +68,11 @@ impl Page { } pub fn window(&self) -> Root<Window> { - self.frame.borrow().as_ref().unwrap().window.root() + Root::from_ref(&*self.frame.borrow().as_ref().unwrap().window) } pub fn document(&self) -> Root<Document> { - self.frame.borrow().as_ref().unwrap().document.root() + Root::from_ref(&*self.frame.borrow().as_ref().unwrap().document) } // must handle root case separately diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index 4943fecdb5f..07c5d19b1f3 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -10,8 +10,7 @@ use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateEl use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId}; use dom::bindings::conversions::Castable; -use dom::bindings::js::{JS, Root}; -use dom::bindings::js::{RootedReference}; +use dom::bindings::js::{JS, RootedReference}; use dom::characterdata::CharacterData; use dom::comment::Comment; use dom::document::Document; @@ -45,11 +44,10 @@ impl<'a> TreeSink for servohtmlparser::Sink { type Handle = JS<Node>; fn get_document(&mut self) -> JS<Node> { - JS::from_ref(self.document.root().upcast()) + JS::from_ref(self.document.upcast()) } fn get_template_contents(&self, target: JS<Node>) -> JS<Node> { - let target = target.root(); let template = target.downcast::<HTMLTemplateElement>() .expect("tried to get template contents of non-HTMLTemplateElement in HTML parsing"); JS::from_ref(template.Content().upcast()) @@ -60,8 +58,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { } fn elem_name(&self, target: JS<Node>) -> QualName { - let node: Root<Node> = target.root(); - let elem = node.downcast::<Element>() + let elem = target.downcast::<Element>() .expect("tried to get name of non-Element in HTML parsing"); QualName { ns: elem.namespace().clone(), @@ -71,8 +68,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn create_element(&mut self, name: QualName, attrs: Vec<Attribute>) -> JS<Node> { - let doc = self.document.root(); - let elem = Element::create(name, None, doc.r(), + let elem = Element::create(name, None, &*self.document, ElementCreator::ParserCreated); for attr in attrs { @@ -83,8 +79,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { } fn create_comment(&mut self, text: StrTendril) -> JS<Node> { - let doc = self.document.root(); - let comment = Comment::new(text.into(), doc.r()); + let comment = Comment::new(text.into(), &*self.document); JS::from_ref(comment.upcast()) } @@ -92,14 +87,13 @@ impl<'a> TreeSink for servohtmlparser::Sink { sibling: JS<Node>, new_node: NodeOrText<JS<Node>>) -> Result<(), NodeOrText<JS<Node>>> { // If there is no parent, return the node to the parser. - let sibling: Root<Node> = sibling.root(); - let parent = match sibling.r().GetParentNode() { + let parent = match sibling.GetParentNode() { Some(p) => p, None => return Err(new_node), }; let child = self.get_or_create(new_node); - assert!(parent.r().InsertBefore(child.r(), Some(sibling.r())).is_ok()); + assert!(parent.r().InsertBefore(child.r(), Some(&*sibling)).is_ok()); Ok(()) } @@ -108,29 +102,26 @@ impl<'a> TreeSink for servohtmlparser::Sink { } fn set_quirks_mode(&mut self, mode: QuirksMode) { - let doc = self.document.root(); - doc.r().set_quirks_mode(mode); + self.document.set_quirks_mode(mode); } fn append(&mut self, parent: JS<Node>, child: NodeOrText<JS<Node>>) { - let parent: Root<Node> = parent.root(); let child = self.get_or_create(child); // FIXME(#3701): Use a simpler algorithm and merge adjacent text nodes - assert!(parent.r().AppendChild(child.r()).is_ok()); + assert!(parent.AppendChild(child.r()).is_ok()); } fn append_doctype_to_document(&mut self, name: StrTendril, public_id: StrTendril, system_id: StrTendril) { - let doc = self.document.root(); + let doc = &*self.document; let doctype = DocumentType::new( - name.into(), Some(public_id.into()), Some(system_id.into()), doc.r()); + name.into(), Some(public_id.into()), Some(system_id.into()), doc); doc.upcast::<Node>().AppendChild(doctype.upcast()).expect("Appending failed"); } fn add_attrs_if_missing(&mut self, target: JS<Node>, attrs: Vec<Attribute>) { - let node: Root<Node> = target.root(); - let elem = node.downcast::<Element>() + let elem = target.downcast::<Element>() .expect("tried to set attrs on non-Element in HTML parsing"); for attr in attrs { elem.set_attribute_from_parser(attr.name, attr.value.into(), None); @@ -138,20 +129,17 @@ impl<'a> TreeSink for servohtmlparser::Sink { } fn remove_from_parent(&mut self, target: JS<Node>) { - let node = target.root(); - if let Some(ref parent) = node.r().GetParentNode() { - parent.r().RemoveChild(node.r()).unwrap(); + if let Some(ref parent) = target.GetParentNode() { + parent.r().RemoveChild(&*target).unwrap(); } } fn mark_script_already_started(&mut self, node: JS<Node>) { - let node: Root<Node> = node.root(); let script = node.downcast::<HTMLScriptElement>(); script.map(|script| script.mark_already_started()); } fn complete_script(&mut self, node: JS<Node>) -> NextParserState { - let node: Root<Node> = node.root(); let script = node.downcast::<HTMLScriptElement>(); if let Some(script) = script { return script.prepare(); @@ -160,11 +148,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { } fn reparent_children(&mut self, node: JS<Node>, new_parent: JS<Node>) { - let new_parent = new_parent.root(); - let new_parent = new_parent.r(); - let old_parent = node.root(); - let old_parent = old_parent.r(); - while let Some(ref child) = old_parent.GetFirstChild() { + while let Some(ref child) = node.GetFirstChild() { new_parent.AppendChild(child.r()).unwrap(); } @@ -181,11 +165,10 @@ impl<'a> Serializable for &'a Node { let name = QualName::new(elem.namespace().clone(), elem.local_name().clone()); if traversal_scope == IncludeNode { - let attrs = elem.attrs().iter().map(|at| { - let attr = at.root(); - let qname = QualName::new(attr.r().namespace().clone(), - attr.r().local_name().clone()); - let value = attr.r().value().clone(); + let attrs = elem.attrs().iter().map(|attr| { + let qname = QualName::new(attr.namespace().clone(), + attr.local_name().clone()); + let value = attr.value().clone(); (qname, value) }).collect::<Vec<_>>(); let attr_refs = attrs.iter().map(|&(ref qname, ref value)| { diff --git a/components/script/script_task.rs b/components/script/script_task.rs index fa427db6ff1..4939a58e086 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -1747,9 +1747,8 @@ impl ScriptTask { // Notify Constellation about the topmost anchor mouse over target. for target in &*mouse_over_targets { - let target = target.root(); if target.upcast::<Node>().is_anchor_element() { - let status = target.r().get_attribute(&ns!(""), &atom!("href")) + let status = target.get_attribute(&ns!(""), &atom!("href")) .and_then(|href| { let value = href.value(); let url = document.r().url(); |