зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #5721 - Finish implementation of ChildNode and ParentNode (from nox:nodeorstring); r=jdm
Source-Repo: https://github.com/servo/servo Source-Revision: 4fd4370a9680f4845f05efd43ce9cb26c7433f05
This commit is contained in:
Родитель
34641e0274
Коммит
91c44dc144
|
@ -8,6 +8,7 @@ use dom::bindings::cell::DOMRefCell;
|
|||
use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods;
|
||||
use dom::bindings::codegen::InheritTypes::{CharacterDataDerived, ElementCast};
|
||||
use dom::bindings::codegen::InheritTypes::NodeCast;
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::error::{Fallible, ErrorResult};
|
||||
use dom::bindings::error::Error::IndexSize;
|
||||
use dom::bindings::js::{JSRef, LayoutJS, Temporary};
|
||||
|
@ -118,6 +119,21 @@ impl<'a> CharacterDataMethods for JSRef<'a, CharacterData> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-before
|
||||
fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).before(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-after
|
||||
fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).after(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
|
||||
fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).replace_with(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-remove
|
||||
fn Remove(self) {
|
||||
let node: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
|
|
@ -19,6 +19,7 @@ use dom::bindings::codegen::InheritTypes::{HTMLAnchorElementDerived, HTMLAppletE
|
|||
use dom::bindings::codegen::InheritTypes::{HTMLAreaElementDerived, HTMLEmbedElementDerived};
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLFormElementDerived, HTMLImageElementDerived};
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLScriptElementDerived, CharacterDataCast};
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::error::Error::{NotSupported, InvalidCharacter, Security};
|
||||
use dom::bindings::error::Error::HierarchyRequest;
|
||||
|
@ -223,6 +224,8 @@ pub trait DocumentHelpers<'a> {
|
|||
button: MouseButton, point: Point2D<f32>);
|
||||
fn dispatch_key_event(self, key: Key, state: KeyState,
|
||||
modifiers: KeyModifiers, compositor: &mut Box<ScriptListener+'static>);
|
||||
fn node_from_nodes_and_strings(self, nodes: Vec<NodeOrString>)
|
||||
-> Fallible<Temporary<Node>>;
|
||||
|
||||
/// Handles a mouse-move event coming from the compositor.
|
||||
fn handle_mouse_move_event(self,
|
||||
|
@ -702,6 +705,34 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
|
|||
window.r().reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::KeyEvent);
|
||||
}
|
||||
|
||||
fn node_from_nodes_and_strings(self, nodes: Vec<NodeOrString>)
|
||||
-> Fallible<Temporary<Node>> {
|
||||
if nodes.len() == 1 {
|
||||
match nodes.into_iter().next().unwrap() {
|
||||
NodeOrString::eNode(node) => Ok(Temporary::from_unrooted(node)),
|
||||
NodeOrString::eString(string) => {
|
||||
Ok(NodeCast::from_temporary(self.CreateTextNode(string)))
|
||||
},
|
||||
}
|
||||
} else {
|
||||
let fragment = NodeCast::from_temporary(self.CreateDocumentFragment()).root();
|
||||
for node in nodes.into_iter() {
|
||||
match node {
|
||||
NodeOrString::eNode(node) => {
|
||||
try!(fragment.r().AppendChild(node.root().r()));
|
||||
},
|
||||
NodeOrString::eString(string) => {
|
||||
let node = NodeCast::from_temporary(self.CreateTextNode(string)).root();
|
||||
// No try!() here because appending a text node
|
||||
// should not fail.
|
||||
fragment.r().AppendChild(node.r()).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(Temporary::from_rooted(fragment.r()))
|
||||
}
|
||||
}
|
||||
|
||||
fn set_current_script(self, script: Option<JSRef<HTMLScriptElement>>) {
|
||||
self.current_script.assign(script);
|
||||
}
|
||||
|
@ -1377,6 +1408,16 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
|
|||
NodeCast::from_ref(self).child_elements().count() as u32
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
|
||||
fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).prepend(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-append
|
||||
fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).append(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
|
||||
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
|
||||
let root: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
|
|
@ -7,8 +7,9 @@ use dom::bindings::codegen::Bindings::DocumentFragmentBinding::DocumentFragmentM
|
|||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
||||
use dom::bindings::codegen::InheritTypes::DocumentFragmentDerived;
|
||||
use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast};
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::js::{JSRef, Temporary};
|
||||
use dom::bindings::error::Fallible;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::document::Document;
|
||||
use dom::element::Element;
|
||||
|
@ -73,6 +74,16 @@ impl<'a> DocumentFragmentMethods for JSRef<'a, DocumentFragment> {
|
|||
NodeCast::from_ref(self).child_elements().count() as u32
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
|
||||
fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).prepend(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-append
|
||||
fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).append(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
|
||||
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
|
||||
let root: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
use dom::bindings::codegen::Bindings::DocumentTypeBinding;
|
||||
use dom::bindings::codegen::Bindings::DocumentTypeBinding::DocumentTypeMethods;
|
||||
use dom::bindings::codegen::InheritTypes::{DocumentTypeDerived, NodeCast};
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::error::ErrorResult;
|
||||
use dom::bindings::js::{JSRef, Temporary};
|
||||
use dom::document::Document;
|
||||
use dom::eventtarget::{EventTarget, EventTargetTypeId};
|
||||
|
@ -87,6 +89,21 @@ impl<'a> DocumentTypeMethods for JSRef<'a, DocumentType> {
|
|||
self.system_id.clone()
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-before
|
||||
fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).before(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-after
|
||||
fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).after(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
|
||||
fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).replace_with(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-remove
|
||||
fn Remove(self) {
|
||||
let node: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
|
|
@ -23,6 +23,7 @@ use dom::bindings::codegen::InheritTypes::{HTMLTableElementDerived, HTMLTableCel
|
|||
use dom::bindings::codegen::InheritTypes::{HTMLTableRowElementDerived, HTMLTextAreaElementDerived};
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLTableSectionElementDerived, NodeCast};
|
||||
use dom::bindings::codegen::InheritTypes::HTMLAnchorElementCast;
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::error::Error::{InvalidCharacter, Syntax};
|
||||
use dom::bindings::error::Error::NoModificationAllowed;
|
||||
|
@ -1292,6 +1293,16 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
|
|||
NodeCast::from_ref(self).child_elements().count() as u32
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
|
||||
fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).prepend(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-append
|
||||
fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).append(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
|
||||
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
|
||||
let root: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
@ -1304,6 +1315,21 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
|
|||
root.query_selector_all(selectors)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-before
|
||||
fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).before(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-after
|
||||
fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).after(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
|
||||
fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
NodeCast::from_ref(self).replace_with(nodes)
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-remove
|
||||
fn Remove(self) {
|
||||
let node: JSRef<Node> = NodeCast::from_ref(self);
|
||||
|
|
|
@ -19,8 +19,9 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast, ElementDerived
|
|||
use dom::bindings::codegen::InheritTypes::{HTMLLegendElementDerived, HTMLFieldSetElementDerived};
|
||||
use dom::bindings::codegen::InheritTypes::{HTMLOptGroupElementDerived, NodeBase, NodeDerived};
|
||||
use dom::bindings::codegen::InheritTypes::{ProcessingInstructionCast, TextCast};
|
||||
use dom::bindings::codegen::UnionTypes::NodeOrString;
|
||||
use dom::bindings::conversions;
|
||||
use dom::bindings::error::Fallible;
|
||||
use dom::bindings::error::{ErrorResult, Fallible};
|
||||
use dom::bindings::error::Error::{NotFound, HierarchyRequest, Syntax};
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{JS, JSRef, LayoutJS, RootedReference, Temporary, Root, Unrooted};
|
||||
|
@ -500,6 +501,12 @@ pub trait NodeHelpers {
|
|||
fn get_bounding_content_box(self) -> Rect<Au>;
|
||||
fn get_content_boxes(self) -> Vec<Rect<Au>>;
|
||||
|
||||
fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult;
|
||||
fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult;
|
||||
fn replace_with(self, nodes: Vec<NodeOrString>) -> ErrorResult;
|
||||
fn prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult;
|
||||
fn append(self, nodes: Vec<NodeOrString>) -> ErrorResult;
|
||||
|
||||
fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn query_selector_iter(self, selectors: DOMString) -> Fallible<QuerySelectorIterator>;
|
||||
|
@ -513,6 +520,7 @@ pub trait NodeHelpers {
|
|||
fn teardown(self);
|
||||
|
||||
fn parse_fragment(self, markup: DOMString) -> Fallible<Temporary<DocumentFragment>>;
|
||||
|
||||
}
|
||||
|
||||
impl<'a> NodeHelpers for JSRef<'a, Node> {
|
||||
|
@ -803,6 +811,80 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
|
|||
window_from_node(self).root().r().content_boxes_query(self.to_trusted_node_address())
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-before
|
||||
fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
match self.parent_node().root() {
|
||||
None => {
|
||||
// Step 1.
|
||||
Ok(())
|
||||
},
|
||||
Some(ref parent_node) => {
|
||||
// Step 2.
|
||||
let doc = self.owner_doc().root();
|
||||
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
|
||||
// Step 3.
|
||||
Node::pre_insert(node.r(), parent_node.r(),
|
||||
Some(self)).map(|_| ())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-after
|
||||
fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
match self.parent_node().root() {
|
||||
None => {
|
||||
// Step 1.
|
||||
Ok(())
|
||||
},
|
||||
Some(ref parent_node) => {
|
||||
// Step 2.
|
||||
let doc = self.owner_doc().root();
|
||||
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
|
||||
// Step 3.
|
||||
// FIXME(https://github.com/servo/servo/issues/5720)
|
||||
let next_sibling = self.next_sibling().root();
|
||||
Node::pre_insert(node.r(), parent_node.r(),
|
||||
next_sibling.r()).map(|_| ())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-childnode-replacewith
|
||||
fn replace_with(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
match self.parent_node().root() {
|
||||
None => {
|
||||
// Step 1.
|
||||
Ok(())
|
||||
},
|
||||
Some(ref parent_node) => {
|
||||
// Step 2.
|
||||
let doc = self.owner_doc().root();
|
||||
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
|
||||
// Step 3.
|
||||
parent_node.r().ReplaceChild(node.r(), self).map(|_| ())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-prepend
|
||||
fn prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
// Step 1.
|
||||
let doc = self.owner_doc().root();
|
||||
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
|
||||
// Step 2.
|
||||
let first_child = self.first_child().root();
|
||||
Node::pre_insert(node.r(), self, first_child.r()).map(|_| ())
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-append
|
||||
fn append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
|
||||
// Step 1.
|
||||
let doc = self.owner_doc().root();
|
||||
let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root();
|
||||
// Step 2.
|
||||
self.AppendChild(node.r()).map(|_| ())
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
|
||||
fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
|
||||
// Step 1.
|
||||
|
|
|
@ -9,10 +9,12 @@
|
|||
|
||||
[NoInterfaceObject]
|
||||
interface ChildNode {
|
||||
// Not implemented yet:
|
||||
// void before((Node or DOMString)... nodes);
|
||||
// void after((Node or DOMString)... nodes);
|
||||
// void replace((Node or DOMString)... nodes);
|
||||
[Throws]
|
||||
void before((Node or DOMString)... nodes);
|
||||
[Throws]
|
||||
void after((Node or DOMString)... nodes);
|
||||
[Throws]
|
||||
void replaceWith((Node or DOMString)... nodes);
|
||||
void remove();
|
||||
};
|
||||
|
||||
|
|
|
@ -18,9 +18,10 @@ interface ParentNode {
|
|||
[Pure]
|
||||
readonly attribute unsigned long childElementCount;
|
||||
|
||||
// Not implemented yet
|
||||
// void prepend((Node or DOMString)... nodes);
|
||||
// void append((Node or DOMString)... nodes);
|
||||
[Throws]
|
||||
void prepend((Node or DOMString)... nodes);
|
||||
[Throws]
|
||||
void append((Node or DOMString)... nodes);
|
||||
|
||||
//Element? query(DOMString relativeSelectors);
|
||||
//[NewObject]
|
||||
|
|
Загрузка…
Ссылка в новой задаче