mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Use a simple Temporary value in TreeIterator
This commit is contained in:
parent
c026825e69
commit
e20d997b37
9 changed files with 156 additions and 133 deletions
|
@ -69,8 +69,8 @@ fn find_node_by_unique_id(page: &Rc<Page>, pipeline: PipelineId, node_id: String
|
||||||
let node: JSRef<Node> = NodeCast::from_ref(document.r());
|
let node: JSRef<Node> = NodeCast::from_ref(document.r());
|
||||||
|
|
||||||
for candidate in node.traverse_preorder() {
|
for candidate in node.traverse_preorder() {
|
||||||
if candidate.get_unique_id() == node_id {
|
if candidate.root().r().get_unique_id() == node_id {
|
||||||
return Temporary::from_rooted(candidate);
|
return candidate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -344,12 +344,12 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
|
||||||
let mut head: usize = 0;
|
let mut head: usize = 0;
|
||||||
let root: JSRef<Node> = NodeCast::from_ref(root.r());
|
let root: JSRef<Node> = NodeCast::from_ref(root.r());
|
||||||
for node in root.traverse_preorder() {
|
for node in root.traverse_preorder() {
|
||||||
let elem: Option<JSRef<Element>> = ElementCast::to_ref(node);
|
let node = node.root();
|
||||||
if let Some(elem) = elem {
|
if let Some(elem) = ElementCast::to_ref(node.r()) {
|
||||||
if (*elements)[head].root().r() == elem {
|
if (*elements)[head].root().r() == elem {
|
||||||
head += 1;
|
head += 1;
|
||||||
}
|
}
|
||||||
if new_node == node || head == elements.len() {
|
if new_node == node.r() || head == elements.len() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,9 +380,9 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
|
||||||
};
|
};
|
||||||
let doc_node: JSRef<Node> = NodeCast::from_ref(self);
|
let doc_node: JSRef<Node> = NodeCast::from_ref(self);
|
||||||
doc_node.traverse_preorder()
|
doc_node.traverse_preorder()
|
||||||
.filter_map(HTMLAnchorElementCast::to_ref)
|
.filter_map(HTMLAnchorElementCast::to_temporary)
|
||||||
.find(check_anchor)
|
.find(|node| check_anchor(&node.root().r()))
|
||||||
.map(|node| Temporary::from_rooted(ElementCast::from_ref(node)))
|
.map(ElementCast::from_temporary)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,7 +494,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
|
||||||
fn dirty_all_nodes(self) {
|
fn dirty_all_nodes(self) {
|
||||||
let root: JSRef<Node> = NodeCast::from_ref(self);
|
let root: JSRef<Node> = NodeCast::from_ref(self);
|
||||||
for node in root.traverse_preorder() {
|
for node in root.traverse_preorder() {
|
||||||
node.dirty(NodeDamage::OtherNodeDamage)
|
node.root().r().dirty(NodeDamage::OtherNodeDamage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -829,8 +829,9 @@ impl<'a> PrivateDocumentHelpers for JSRef<'a, Document> {
|
||||||
let mut nodes = RootedVec::new();
|
let mut nodes = RootedVec::new();
|
||||||
if let Some(ref root) = document_element {
|
if let Some(ref root) = document_element {
|
||||||
for node in NodeCast::from_ref(root.r()).traverse_preorder() {
|
for node in NodeCast::from_ref(root.r()).traverse_preorder() {
|
||||||
if callback(node) {
|
let node = node.root();
|
||||||
nodes.push(node.unrooted());
|
if callback(node.r()) {
|
||||||
|
nodes.push(node.r().unrooted());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1120,14 +1121,14 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
|
||||||
// http://www.whatwg.org/specs/web-apps/current-work/#document.title
|
// http://www.whatwg.org/specs/web-apps/current-work/#document.title
|
||||||
fn Title(self) -> DOMString {
|
fn Title(self) -> DOMString {
|
||||||
let title_element = self.GetDocumentElement().root().and_then(|root| {
|
let title_element = self.GetDocumentElement().root().and_then(|root| {
|
||||||
NodeCast::from_ref(root.get_unsound_ref_forever())
|
NodeCast::from_ref(root.r()).traverse_preorder().find(|node| {
|
||||||
.traverse_preorder()
|
node.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement))
|
||||||
.find(|node| node.type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement)))
|
})
|
||||||
});
|
}).root();
|
||||||
|
|
||||||
let mut title = String::new();
|
let mut title = String::new();
|
||||||
if let Some(title_element) = title_element {
|
if let Some(title_element) = title_element {
|
||||||
for child in title_element.children() {
|
for child in title_element.r().children() {
|
||||||
let child = child.root();
|
let child = child.root();
|
||||||
if let Some(text) = TextCast::to_ref(child.r()) {
|
if let Some(text) = TextCast::to_ref(child.r()) {
|
||||||
title.push_str(&CharacterDataCast::from_ref(text).data());
|
title.push_str(&CharacterDataCast::from_ref(text).data());
|
||||||
|
@ -1144,9 +1145,9 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
|
||||||
self.GetDocumentElement().root().map(|root| {
|
self.GetDocumentElement().root().map(|root| {
|
||||||
let root: JSRef<Node> = NodeCast::from_ref(root.r());
|
let root: JSRef<Node> = NodeCast::from_ref(root.r());
|
||||||
let head_node = root.traverse_preorder().find(|child| {
|
let head_node = root.traverse_preorder().find(|child| {
|
||||||
child.type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLHeadElement))
|
child.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLHeadElement))
|
||||||
});
|
}).root();
|
||||||
head_node.map(|head| {
|
head_node.r().map(|head| {
|
||||||
let title_node = head.children().map(|c| c.root()).find(|child| {
|
let title_node = head.children().map(|c| c.root()).find(|child| {
|
||||||
child.r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement))
|
child.r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTitleElement))
|
||||||
});
|
});
|
||||||
|
|
|
@ -224,12 +224,10 @@ impl<'a> Activatable for JSRef<'a, HTMLButtonElement> {
|
||||||
// and only then performing actions which may modify the DOM tree
|
// and only then performing actions which may modify the DOM tree
|
||||||
unsafe {
|
unsafe {
|
||||||
node.query_selector_iter("button[type=submit]".to_owned()).unwrap()
|
node.query_selector_iter("button[type=submit]".to_owned()).unwrap()
|
||||||
.filter_map(|t| {
|
.filter_map(HTMLButtonElementCast::to_temporary)
|
||||||
let h: Option<JSRef<HTMLButtonElement>> = HTMLButtonElementCast::to_ref(t);
|
.map(|t| t.root())
|
||||||
h
|
.find(|r| r.r().form_owner() == owner)
|
||||||
})
|
.map(|s| s.r().synthetic_click_activation(ctrlKey, shiftKey, altKey, metaKey));
|
||||||
.find(|r| r.form_owner() == owner)
|
|
||||||
.map(|s| s.synthetic_click_activation(ctrlKey, shiftKey, altKey, metaKey));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,12 +164,13 @@ impl HTMLCollection {
|
||||||
HTMLCollection::create(window, root, box ElementChildFilter)
|
HTMLCollection::create(window, root, box ElementChildFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn traverse<'a>(root: JSRef<'a, Node>)
|
fn traverse(root: JSRef<Node>)
|
||||||
-> FilterMap<Skip<TreeIterator<'a>>,
|
-> FilterMap<Skip<TreeIterator>,
|
||||||
fn(JSRef<Node>) -> Option<JSRef<Element>>> {
|
fn(Temporary<Node>) -> Option<Temporary<Element>>> {
|
||||||
root.traverse_preorder()
|
root.traverse_preorder()
|
||||||
.skip(1)
|
.skip(1)
|
||||||
.filter_map(ElementCast::to_ref as fn(JSRef<Node>) -> Option<JSRef<Element>>)
|
.filter_map(ElementCast::to_temporary as
|
||||||
|
fn(Temporary<Node>) -> Option<Temporary<Element>>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +182,7 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> {
|
||||||
CollectionTypeId::Live(ref root, ref filter) => {
|
CollectionTypeId::Live(ref root, ref filter) => {
|
||||||
let root = root.root();
|
let root = root.root();
|
||||||
HTMLCollection::traverse(root.r())
|
HTMLCollection::traverse(root.r())
|
||||||
.filter(|element| filter.filter(*element, root.r()))
|
.filter(|element| filter.filter(element.root().r(), root.r()))
|
||||||
.count() as u32
|
.count() as u32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,10 +199,8 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> {
|
||||||
CollectionTypeId::Live(ref root, ref filter) => {
|
CollectionTypeId::Live(ref root, ref filter) => {
|
||||||
let root = root.root();
|
let root = root.root();
|
||||||
HTMLCollection::traverse(root.r())
|
HTMLCollection::traverse(root.r())
|
||||||
.filter(|element| filter.filter(*element, root.r()))
|
.filter(|element| filter.filter(element.root().r(), root.r()))
|
||||||
.nth(index)
|
.nth(index)
|
||||||
.clone()
|
|
||||||
.map(Temporary::from_rooted)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,11 +223,12 @@ impl<'a> HTMLCollectionMethods for JSRef<'a, HTMLCollection> {
|
||||||
CollectionTypeId::Live(ref root, ref filter) => {
|
CollectionTypeId::Live(ref root, ref filter) => {
|
||||||
let root = root.root();
|
let root = root.root();
|
||||||
HTMLCollection::traverse(root.r())
|
HTMLCollection::traverse(root.r())
|
||||||
.filter(|element| filter.filter(*element, root.r()))
|
.map(|element| element.root())
|
||||||
|
.filter(|element| filter.filter(element.r(), root.r()))
|
||||||
.find(|elem| {
|
.find(|elem| {
|
||||||
elem.get_string_attribute(&atom!("name")) == key ||
|
elem.r().get_string_attribute(&atom!("name")) == key ||
|
||||||
elem.get_string_attribute(&atom!("id")) == key })
|
elem.r().get_string_attribute(&atom!("id")) == key })
|
||||||
.map(Temporary::from_rooted)
|
.map(|elem| Temporary::from_rooted(elem.r()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,13 +104,14 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLFieldSetElement> {
|
||||||
}
|
}
|
||||||
|
|
||||||
for descendant in child.r().traverse_preorder() {
|
for descendant in child.r().traverse_preorder() {
|
||||||
match descendant.type_id() {
|
let descendant = descendant.root();
|
||||||
|
match descendant.r().type_id() {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
||||||
descendant.set_disabled_state(true);
|
descendant.r().set_disabled_state(true);
|
||||||
descendant.set_enabled_state(false);
|
descendant.r().set_enabled_state(false);
|
||||||
},
|
},
|
||||||
_ => ()
|
_ => ()
|
||||||
}
|
}
|
||||||
|
@ -142,13 +143,14 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLFieldSetElement> {
|
||||||
}
|
}
|
||||||
|
|
||||||
for descendant in child.r().traverse_preorder() {
|
for descendant in child.r().traverse_preorder() {
|
||||||
match descendant.type_id() {
|
let descendant = descendant.root();
|
||||||
|
match descendant.r().type_id() {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) |
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) |
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
||||||
descendant.check_disabled_attribute();
|
descendant.r().check_disabled_attribute();
|
||||||
descendant.check_ancestors_disabled_state_for_form_control();
|
descendant.r().check_ancestors_disabled_state_for_form_control();
|
||||||
},
|
},
|
||||||
_ => ()
|
_ => ()
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ use dom::element::ElementTypeId;
|
||||||
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
|
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
|
||||||
use dom::htmlinputelement::{HTMLInputElement, HTMLInputElementHelpers};
|
use dom::htmlinputelement::{HTMLInputElement, HTMLInputElementHelpers};
|
||||||
use dom::htmlbuttonelement::{HTMLButtonElement};
|
use dom::htmlbuttonelement::{HTMLButtonElement};
|
||||||
use dom::htmltextareaelement::{HTMLTextAreaElement, HTMLTextAreaElementHelpers};
|
use dom::htmltextareaelement::HTMLTextAreaElementHelpers;
|
||||||
use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node, window_from_node};
|
use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node, window_from_node};
|
||||||
use hyper::method::Method;
|
use hyper::method::Method;
|
||||||
use hyper::header::ContentType;
|
use hyper::header::ContentType;
|
||||||
|
@ -255,16 +255,18 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
|
||||||
// TODO: This is an incorrect way of getting controls owned
|
// TODO: This is an incorrect way of getting controls owned
|
||||||
// by the form, but good enough until html5ever lands
|
// by the form, but good enough until html5ever lands
|
||||||
let data_set = node.traverse_preorder().filter_map(|child| {
|
let data_set = node.traverse_preorder().filter_map(|child| {
|
||||||
if child.get_disabled_state() {
|
let child = child.root();
|
||||||
|
if child.r().get_disabled_state() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
if child.ancestors().any(|a| a.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLDataListElement))) {
|
if child.r().ancestors()
|
||||||
|
.any(|a| a.root().r().type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLDataListElement))) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
// XXXManishearth don't include it if it is a button but not the submitter
|
// XXXManishearth don't include it if it is a button but not the submitter
|
||||||
match child.type_id() {
|
match child.r().type_id() {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
||||||
let input: JSRef<HTMLInputElement> = HTMLInputElementCast::to_ref(child).unwrap();
|
let input = HTMLInputElementCast::to_ref(child.r()).unwrap();
|
||||||
let ty = input.Type();
|
let ty = input.Type();
|
||||||
let name = input.Name();
|
let name = input.Name();
|
||||||
match ty.as_slice() {
|
match ty.as_slice() {
|
||||||
|
@ -368,10 +370,10 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
|
||||||
// TODO: This is an incorrect way of getting controls owned
|
// TODO: This is an incorrect way of getting controls owned
|
||||||
// by the form, but good enough until html5ever lands
|
// by the form, but good enough until html5ever lands
|
||||||
for child in node.traverse_preorder() {
|
for child in node.traverse_preorder() {
|
||||||
match child.type_id() {
|
let child = child.root();
|
||||||
|
match child.r().type_id() {
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
|
||||||
let input: JSRef<HTMLInputElement> = HTMLInputElementCast::to_ref(child)
|
let input = HTMLInputElementCast::to_ref(child.r()).unwrap();
|
||||||
.unwrap();
|
|
||||||
input.reset()
|
input.reset()
|
||||||
}
|
}
|
||||||
// TODO HTMLKeygenElement unimplemented
|
// TODO HTMLKeygenElement unimplemented
|
||||||
|
@ -384,8 +386,7 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
|
||||||
{}
|
{}
|
||||||
}
|
}
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
|
||||||
let textarea: JSRef<HTMLTextAreaElement> = HTMLTextAreaElementCast::to_ref(child)
|
let textarea = HTMLTextAreaElementCast::to_ref(child.r()).unwrap();
|
||||||
.unwrap();
|
|
||||||
textarea.reset()
|
textarea.reset()
|
||||||
}
|
}
|
||||||
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOutputElement)) => {
|
||||||
|
|
|
@ -346,12 +346,13 @@ fn broadcast_radio_checked(broadcaster: JSRef<HTMLInputElement>, group: Option<&
|
||||||
// There is no DOM tree manipulation here, so this is safe
|
// There is no DOM tree manipulation here, so this is safe
|
||||||
let iter = unsafe {
|
let iter = unsafe {
|
||||||
doc_node.query_selector_iter("input[type=radio]".to_owned()).unwrap()
|
doc_node.query_selector_iter("input[type=radio]".to_owned()).unwrap()
|
||||||
.filter_map(|t| HTMLInputElementCast::to_ref(t))
|
.filter_map(HTMLInputElementCast::to_temporary)
|
||||||
.filter(|&r| in_same_group(r, owner, group) && broadcaster != r)
|
.map(|t| t.root())
|
||||||
|
.filter(|r| in_same_group(r.r(), owner, group) && broadcaster != r.r())
|
||||||
};
|
};
|
||||||
for r in iter {
|
for r in iter {
|
||||||
if r.Checked() {
|
if r.r().Checked() {
|
||||||
r.SetChecked(false);
|
r.r().SetChecked(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -684,12 +685,14 @@ impl<'a> Activatable for JSRef<'a, HTMLInputElement> {
|
||||||
// Safe since we only manipulate the DOM tree after finding an element
|
// Safe since we only manipulate the DOM tree after finding an element
|
||||||
let checked_member = unsafe {
|
let checked_member = unsafe {
|
||||||
doc_node.query_selector_iter("input[type=radio]".to_owned()).unwrap()
|
doc_node.query_selector_iter("input[type=radio]".to_owned()).unwrap()
|
||||||
.filter_map(|t| HTMLInputElementCast::to_ref(t))
|
.filter_map(HTMLInputElementCast::to_temporary)
|
||||||
.filter(|&r| in_same_group(r, owner.r(),
|
.map(|t| t.root())
|
||||||
group.as_ref().map(|gr| gr.as_slice())))
|
.find(|r| {
|
||||||
.find(|r| r.Checked())
|
in_same_group(r.r(), owner.r(), group.as_ref().map(|gr| gr.as_slice())) &&
|
||||||
|
r.r().Checked()
|
||||||
|
})
|
||||||
};
|
};
|
||||||
cache.checked_radio.assign(checked_member);
|
cache.checked_radio.assign(checked_member.r());
|
||||||
cache.checked_changed = self.checked_changed.get();
|
cache.checked_changed = self.checked_changed.get();
|
||||||
self.SetChecked(true);
|
self.SetChecked(true);
|
||||||
}
|
}
|
||||||
|
@ -815,12 +818,10 @@ impl<'a> Activatable for JSRef<'a, HTMLInputElement> {
|
||||||
// and only then performing actions which may modify the DOM tree
|
// and only then performing actions which may modify the DOM tree
|
||||||
unsafe {
|
unsafe {
|
||||||
node.query_selector_iter("input[type=submit]".to_owned()).unwrap()
|
node.query_selector_iter("input[type=submit]".to_owned()).unwrap()
|
||||||
.filter_map(|t| {
|
.filter_map(HTMLInputElementCast::to_temporary)
|
||||||
let h: Option<JSRef<HTMLInputElement>> = HTMLInputElementCast::to_ref(t);
|
.map(|t| t.root())
|
||||||
h
|
.find(|r| r.r().form_owner() == owner)
|
||||||
})
|
.map(|s| s.r().synthetic_click_activation(ctrlKey, shiftKey, altKey, metaKey));
|
||||||
.find(|r| r.form_owner() == owner)
|
|
||||||
.map(|s| s.synthetic_click_activation(ctrlKey, shiftKey, altKey, metaKey));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -290,7 +290,8 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
|
||||||
let is_in_doc = self.is_in_doc();
|
let is_in_doc = self.is_in_doc();
|
||||||
|
|
||||||
for node in self.traverse_preorder() {
|
for node in self.traverse_preorder() {
|
||||||
vtable_for(&node).bind_to_tree(is_in_doc);
|
let node = node.root();
|
||||||
|
vtable_for(&node.r()).bind_to_tree(is_in_doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
let parent = self.parent_node().root();
|
let parent = self.parent_node().root();
|
||||||
|
@ -302,7 +303,8 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
|
||||||
fn node_removed(self, parent_in_doc: bool) {
|
fn node_removed(self, parent_in_doc: bool) {
|
||||||
assert!(self.parent_node().is_none());
|
assert!(self.parent_node().is_none());
|
||||||
for node in self.traverse_preorder() {
|
for node in self.traverse_preorder() {
|
||||||
vtable_for(&node).unbind_from_tree(parent_in_doc);
|
let node = node.root();
|
||||||
|
vtable_for(&node.r()).unbind_from_tree(parent_in_doc);
|
||||||
}
|
}
|
||||||
self.layout_data.dispose();
|
self.layout_data.dispose();
|
||||||
}
|
}
|
||||||
|
@ -381,14 +383,15 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct QuerySelectorIterator<'a> {
|
pub struct QuerySelectorIterator {
|
||||||
selectors: Vec<Selector>,
|
selectors: Vec<Selector>,
|
||||||
iterator: TreeIterator<'a>,
|
iterator: TreeIterator,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> QuerySelectorIterator<'a> {
|
impl<'a> QuerySelectorIterator {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn new(iter: TreeIterator<'a>, selectors: Vec<Selector>) -> QuerySelectorIterator<'a> {
|
unsafe fn new(iter: TreeIterator, selectors: Vec<Selector>)
|
||||||
|
-> QuerySelectorIterator {
|
||||||
QuerySelectorIterator {
|
QuerySelectorIterator {
|
||||||
selectors: selectors,
|
selectors: selectors,
|
||||||
iterator: iter,
|
iterator: iter,
|
||||||
|
@ -396,18 +399,21 @@ impl<'a> QuerySelectorIterator<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Iterator for QuerySelectorIterator<'a> {
|
impl<'a> Iterator for QuerySelectorIterator {
|
||||||
type Item = JSRef<'a, Node>;
|
type Item = Temporary<Node>;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<JSRef<'a, Node>> {
|
fn next(&mut self) -> Option<Temporary<Node>> {
|
||||||
let selectors = &self.selectors;
|
let selectors = &self.selectors;
|
||||||
// TODO(cgaebel): Is it worth it to build a bloom filter here
|
// TODO(cgaebel): Is it worth it to build a bloom filter here
|
||||||
// (instead of passing `None`)? Probably.
|
// (instead of passing `None`)? Probably.
|
||||||
self.iterator.find(|node| node.is_element() && matches(selectors, node, &mut None))
|
self.iterator.find(|node| {
|
||||||
|
let node = node.root();
|
||||||
|
node.r().is_element() && matches(selectors, &node.r(), &mut None)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait NodeHelpers<'a> {
|
pub trait NodeHelpers {
|
||||||
fn ancestors(self) -> AncestorIterator;
|
fn ancestors(self) -> AncestorIterator;
|
||||||
fn inclusive_ancestors(self) -> AncestorIterator;
|
fn inclusive_ancestors(self) -> AncestorIterator;
|
||||||
fn children(self) -> NodeSiblingIterator;
|
fn children(self) -> NodeSiblingIterator;
|
||||||
|
@ -484,7 +490,7 @@ pub trait NodeHelpers<'a> {
|
||||||
fn dump_indent(self, indent: u32);
|
fn dump_indent(self, indent: u32);
|
||||||
fn debug_str(self) -> String;
|
fn debug_str(self) -> String;
|
||||||
|
|
||||||
fn traverse_preorder(self) -> TreeIterator<'a>;
|
fn traverse_preorder(self) -> TreeIterator;
|
||||||
fn inclusively_following_siblings(self) -> NodeSiblingIterator;
|
fn inclusively_following_siblings(self) -> NodeSiblingIterator;
|
||||||
fn inclusively_preceding_siblings(self) -> ReverseSiblingIterator;
|
fn inclusively_preceding_siblings(self) -> ReverseSiblingIterator;
|
||||||
|
|
||||||
|
@ -495,7 +501,7 @@ pub trait NodeHelpers<'a> {
|
||||||
|
|
||||||
fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
|
fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn query_selector_iter(self, selectors: DOMString) -> Fallible<QuerySelectorIterator<'a>>;
|
unsafe fn query_selector_iter(self, selectors: DOMString) -> Fallible<QuerySelectorIterator>;
|
||||||
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>>;
|
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>>;
|
||||||
|
|
||||||
fn remove_self(self);
|
fn remove_self(self);
|
||||||
|
@ -508,7 +514,7 @@ pub trait NodeHelpers<'a> {
|
||||||
fn parse_fragment(self, markup: DOMString) -> Fallible<Temporary<DocumentFragment>>;
|
fn parse_fragment(self, markup: DOMString) -> Fallible<Temporary<DocumentFragment>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
impl<'a> NodeHelpers for JSRef<'a, Node> {
|
||||||
fn teardown(self) {
|
fn teardown(self) {
|
||||||
self.layout_data.dispose();
|
self.layout_data.dispose();
|
||||||
for kid in self.children() {
|
for kid in self.children() {
|
||||||
|
@ -745,7 +751,7 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterates over this node and all its descendants, in preorder.
|
/// Iterates over this node and all its descendants, in preorder.
|
||||||
fn traverse_preorder(self) -> TreeIterator<'a> {
|
fn traverse_preorder(self) -> TreeIterator {
|
||||||
TreeIterator::new(self)
|
TreeIterator::new(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -806,10 +812,9 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
||||||
Ok(ref selectors) => {
|
Ok(ref selectors) => {
|
||||||
let root = self.ancestors().last().root();
|
let root = self.ancestors().last().root();
|
||||||
let root = root.r().unwrap_or(self.clone());
|
let root = root.r().unwrap_or(self.clone());
|
||||||
Ok(root.traverse_preorder()
|
Ok(root.traverse_preorder().filter_map(ElementCast::to_temporary).find(|element| {
|
||||||
.filter_map(ElementCast::to_ref)
|
matches(selectors, &NodeCast::from_ref(element.root().r()), &mut None)
|
||||||
.find(|element| matches(selectors, &NodeCast::from_ref(*element), &mut None))
|
}))
|
||||||
.map(Temporary::from_rooted))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -819,7 +824,7 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
||||||
/// the iterator may be invalidated
|
/// the iterator may be invalidated
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn query_selector_iter(self, selectors: DOMString)
|
unsafe fn query_selector_iter(self, selectors: DOMString)
|
||||||
-> Fallible<QuerySelectorIterator<'a>> {
|
-> Fallible<QuerySelectorIterator> {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
let nodes;
|
let nodes;
|
||||||
let root = self.ancestors().last().root()
|
let root = self.ancestors().last().root()
|
||||||
|
@ -841,7 +846,7 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
|
||||||
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>> {
|
fn query_selector_all(self, selectors: DOMString) -> Fallible<Temporary<NodeList>> {
|
||||||
let mut nodes = RootedVec::new();
|
let mut nodes = RootedVec::new();
|
||||||
for node in try!(unsafe { self.query_selector_iter(selectors) }) {
|
for node in try!(unsafe { self.query_selector_iter(selectors) }) {
|
||||||
nodes.push(node.unrooted());
|
nodes.push(JS::from_rooted(node));
|
||||||
}
|
}
|
||||||
let window = window_from_node(self).root();
|
let window = window_from_node(self).root();
|
||||||
Ok(NodeList::new_simple_list(window.r(), &nodes))
|
Ok(NodeList::new_simple_list(window.r(), &nodes))
|
||||||
|
@ -1178,30 +1183,48 @@ impl Iterator for AncestorIterator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TreeIterator<'a> {
|
pub struct TreeIterator {
|
||||||
stack: Vec<JSRef<'a, Node>>,
|
current: Option<Temporary<Node>>,
|
||||||
|
depth: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> TreeIterator<'a> {
|
impl<'a> TreeIterator {
|
||||||
fn new(root: JSRef<'a, Node>) -> TreeIterator<'a> {
|
fn new(root: JSRef<'a, Node>) -> TreeIterator {
|
||||||
let mut stack = vec!();
|
|
||||||
stack.push(root);
|
|
||||||
|
|
||||||
TreeIterator {
|
TreeIterator {
|
||||||
stack: stack,
|
current: Some(Temporary::from_rooted(root)),
|
||||||
|
depth: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Iterator for TreeIterator<'a> {
|
impl Iterator for TreeIterator {
|
||||||
type Item = JSRef<'a, Node>;
|
type Item = Temporary<Node>;
|
||||||
|
|
||||||
fn next(&mut self) -> Option<JSRef<'a, Node>> {
|
// https://dom.spec.whatwg.org/#concept-tree-order
|
||||||
let ret = self.stack.pop();
|
fn next(&mut self) -> Option<Temporary<Node>> {
|
||||||
ret.map(|node| {
|
let current = match self.current.take() {
|
||||||
self.stack.extend(node.rev_children().map(|c| c.root().get_unsound_ref_forever()))
|
None => return None,
|
||||||
});
|
Some(current) => current,
|
||||||
ret
|
};
|
||||||
|
let node = current.root();
|
||||||
|
if let Some(first_child) = node.r().first_child() {
|
||||||
|
self.current = Some(first_child);
|
||||||
|
self.depth += 1;
|
||||||
|
return Some(current);
|
||||||
|
};
|
||||||
|
for ancestor in node.r().inclusive_ancestors() {
|
||||||
|
if self.depth == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if let Some(next_sibling) = ancestor.root().r().next_sibling() {
|
||||||
|
self.current = Some(next_sibling);
|
||||||
|
return Some(current);
|
||||||
|
}
|
||||||
|
self.depth -= 1;
|
||||||
|
}
|
||||||
|
debug_assert!(self.depth == 0);
|
||||||
|
self.current = None;
|
||||||
|
Some(current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1283,7 +1306,7 @@ impl Node {
|
||||||
let node_doc = document_from_node(node).root();
|
let node_doc = document_from_node(node).root();
|
||||||
if node_doc.r() != document {
|
if node_doc.r() != document {
|
||||||
for descendant in node.traverse_preorder() {
|
for descendant in node.traverse_preorder() {
|
||||||
descendant.set_owner_doc(document);
|
descendant.root().r().set_owner_doc(document);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1438,13 +1461,14 @@ impl Node {
|
||||||
parent.add_child(node, child);
|
parent.add_child(node, child);
|
||||||
let is_in_doc = parent.is_in_doc();
|
let is_in_doc = parent.is_in_doc();
|
||||||
for kid in node.traverse_preorder() {
|
for kid in node.traverse_preorder() {
|
||||||
let mut flags = kid.flags.get();
|
let kid = kid.root();
|
||||||
|
let mut flags = kid.r().flags.get();
|
||||||
if is_in_doc {
|
if is_in_doc {
|
||||||
flags.insert(IS_IN_DOC);
|
flags.insert(IS_IN_DOC);
|
||||||
} else {
|
} else {
|
||||||
flags.remove(IS_IN_DOC);
|
flags.remove(IS_IN_DOC);
|
||||||
}
|
}
|
||||||
kid.flags.set(flags);
|
kid.r().flags.set(flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1847,8 +1871,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
|
||||||
match self.type_id {
|
match self.type_id {
|
||||||
NodeTypeId::DocumentFragment |
|
NodeTypeId::DocumentFragment |
|
||||||
NodeTypeId::Element(..) => {
|
NodeTypeId::Element(..) => {
|
||||||
let content = Node::collect_text_contents(
|
let content = Node::collect_text_contents(self.traverse_preorder());
|
||||||
self.traverse_preorder().map(Temporary::from_rooted));
|
|
||||||
Some(content)
|
Some(content)
|
||||||
}
|
}
|
||||||
NodeTypeId::Comment |
|
NodeTypeId::Comment |
|
||||||
|
@ -2232,11 +2255,12 @@ impl<'a> NodeMethods for JSRef<'a, Node> {
|
||||||
|
|
||||||
let lastself = lastself.root();
|
let lastself = lastself.root();
|
||||||
for child in lastself.r().traverse_preorder() {
|
for child in lastself.r().traverse_preorder() {
|
||||||
if child == other {
|
let child = child.root();
|
||||||
|
if child.r() == other {
|
||||||
// step 6.
|
// step 6.
|
||||||
return NodeConstants::DOCUMENT_POSITION_PRECEDING;
|
return NodeConstants::DOCUMENT_POSITION_PRECEDING;
|
||||||
}
|
}
|
||||||
if child == self {
|
if child.r() == self {
|
||||||
// step 7.
|
// step 7.
|
||||||
return NodeConstants::DOCUMENT_POSITION_FOLLOWING;
|
return NodeConstants::DOCUMENT_POSITION_FOLLOWING;
|
||||||
}
|
}
|
||||||
|
@ -2307,7 +2331,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn parent_node(self) -> Option<JSRef<'a, Node>> {
|
fn parent_node(self) -> Option<JSRef<'a, Node>> {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn parent_node<'a, T: NodeHelpers<'a>>(this: T) -> Option<Temporary<Node>> {
|
fn parent_node<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
|
||||||
this.parent_node()
|
this.parent_node()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2317,7 +2341,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn first_child(self) -> Option<JSRef<'a, Node>> {
|
fn first_child(self) -> Option<JSRef<'a, Node>> {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn first_child<'a, T: NodeHelpers<'a>>(this: T) -> Option<Temporary<Node>> {
|
fn first_child<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
|
||||||
this.first_child()
|
this.first_child()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2327,7 +2351,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn last_child(self) -> Option<JSRef<'a, Node>> {
|
fn last_child(self) -> Option<JSRef<'a, Node>> {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn last_child<'a, T: NodeHelpers<'a>>(this: T) -> Option<Temporary<Node>> {
|
fn last_child<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
|
||||||
this.last_child()
|
this.last_child()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2337,7 +2361,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn prev_sibling(self) -> Option<JSRef<'a, Node>> {
|
fn prev_sibling(self) -> Option<JSRef<'a, Node>> {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn prev_sibling<'a, T: NodeHelpers<'a>>(this: T) -> Option<Temporary<Node>> {
|
fn prev_sibling<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
|
||||||
this.prev_sibling()
|
this.prev_sibling()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2347,7 +2371,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn next_sibling(self) -> Option<JSRef<'a, Node>> {
|
fn next_sibling(self) -> Option<JSRef<'a, Node>> {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn next_sibling<'a, T: NodeHelpers<'a>>(this: T) -> Option<Temporary<Node>> {
|
fn next_sibling<'a, T: NodeHelpers>(this: T) -> Option<Temporary<Node>> {
|
||||||
this.next_sibling()
|
this.next_sibling()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2357,7 +2381,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn is_document(self) -> bool {
|
fn is_document(self) -> bool {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn is_document<'a, T: NodeHelpers<'a>>(this: T) -> bool {
|
fn is_document<'a, T: NodeHelpers>(this: T) -> bool {
|
||||||
this.is_document()
|
this.is_document()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2367,7 +2391,7 @@ impl<'a> style::node::TNode<'a> for JSRef<'a, Node> {
|
||||||
fn is_element(self) -> bool {
|
fn is_element(self) -> bool {
|
||||||
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
// FIXME(zwarich): Remove this when UFCS lands and there is a better way
|
||||||
// of disambiguating methods.
|
// of disambiguating methods.
|
||||||
fn is_element<'a, T: NodeHelpers<'a>>(this: T) -> bool {
|
fn is_element<'a, T: NodeHelpers>(this: T) -> bool {
|
||||||
this.is_element()
|
this.is_element()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, Documen
|
||||||
use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, HTMLIFrameElementCast, NodeCast, EventCast};
|
use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, HTMLIFrameElementCast, NodeCast, EventCast};
|
||||||
use dom::bindings::conversions::FromJSValConvertible;
|
use dom::bindings::conversions::FromJSValConvertible;
|
||||||
use dom::bindings::conversions::StringificationBehavior;
|
use dom::bindings::conversions::StringificationBehavior;
|
||||||
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, RootedReference};
|
use dom::bindings::js::{JS, JSRef, OptionalRootable, RootedReference};
|
||||||
use dom::bindings::js::{RootCollection, RootCollectionPtr};
|
use dom::bindings::js::{RootCollection, RootCollectionPtr};
|
||||||
use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference};
|
use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference};
|
||||||
use dom::bindings::structuredclone::StructuredCloneData;
|
use dom::bindings::structuredclone::StructuredCloneData;
|
||||||
|
@ -811,9 +811,8 @@ impl ScriptTask {
|
||||||
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
||||||
|
|
||||||
doc.traverse_preorder()
|
doc.traverse_preorder()
|
||||||
.filter_map(HTMLIFrameElementCast::to_ref)
|
.filter_map(HTMLIFrameElementCast::to_temporary)
|
||||||
.find(|node| node.subpage_id() == Some(subpage_id))
|
.find(|node| node.root().r().subpage_id() == Some(subpage_id))
|
||||||
.map(Temporary::from_rooted)
|
|
||||||
}).root();
|
}).root();
|
||||||
|
|
||||||
if let Some(frame_element) = frame_element {
|
if let Some(frame_element) = frame_element {
|
||||||
|
@ -832,9 +831,8 @@ impl ScriptTask {
|
||||||
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
||||||
|
|
||||||
doc.traverse_preorder()
|
doc.traverse_preorder()
|
||||||
.filter_map(HTMLIFrameElementCast::to_ref)
|
.filter_map(HTMLIFrameElementCast::to_temporary)
|
||||||
.find(|node| node.subpage_id() == Some(old_subpage_id))
|
.find(|node| node.root().r().subpage_id() == Some(old_subpage_id))
|
||||||
.map(Temporary::from_rooted)
|
|
||||||
}).root();
|
}).root();
|
||||||
|
|
||||||
frame_element.unwrap().r().update_subpage_id(new_subpage_id);
|
frame_element.unwrap().r().update_subpage_id(new_subpage_id);
|
||||||
|
@ -952,10 +950,9 @@ impl ScriptTask {
|
||||||
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
||||||
|
|
||||||
doc.traverse_preorder()
|
doc.traverse_preorder()
|
||||||
.filter_map(HTMLIFrameElementCast::to_ref)
|
.filter_map(HTMLIFrameElementCast::to_temporary)
|
||||||
.find(|node| node.subpage_id() == Some(subpage_id))
|
.find(|node| node.root().r().subpage_id() == Some(subpage_id))
|
||||||
.map(ElementCast::from_ref)
|
.map(ElementCast::from_temporary)
|
||||||
.map(Temporary::from_rooted)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}).root();
|
}).root();
|
||||||
|
@ -1218,9 +1215,8 @@ impl ScriptTask {
|
||||||
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
|
||||||
|
|
||||||
doc.traverse_preorder()
|
doc.traverse_preorder()
|
||||||
.filter_map(HTMLIFrameElementCast::to_ref)
|
.filter_map(HTMLIFrameElementCast::to_temporary)
|
||||||
.find(|node| node.subpage_id() == Some(subpage_id))
|
.find(|node| node.root().r().subpage_id() == Some(subpage_id))
|
||||||
.map(Temporary::from_rooted)
|
|
||||||
}).root();
|
}).root();
|
||||||
if let Some(iframe) = iframe.r() {
|
if let Some(iframe) = iframe.r() {
|
||||||
iframe.navigate_child_browsing_context(load_data.url);
|
iframe.navigate_child_browsing_context(load_data.url);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue