Add a with_imm_element_like() method.

… gives a generic element from a generic node.
This commit is contained in:
Simon Sapin 2013-10-16 18:44:41 +01:00
parent 62f1f03c16
commit 6c41be9c13
3 changed files with 19 additions and 7 deletions

View file

@ -120,12 +120,12 @@ pub enum ElementTypeId {
// Element methods
//
impl<'self> ElementLike<'self> for Element {
fn get_local_name(&'self self) -> &'self str {
impl ElementLike for Element {
fn get_local_name<'a>(&'a self) -> &'a str {
self.tag_name.as_slice()
}
fn get_attr(&'self self, name: &str) -> Option<&'self str> {
fn get_attr<'a>(&'a self, name: &str) -> Option<&'a str> {
// FIXME: Need an each() that links lifetimes in Rust.
for attr in self.attrs.iter() {
// FIXME: only case-insensitive in the HTML namespace (as opposed to SVG, etc.)

View file

@ -25,7 +25,7 @@ use extra::arc::Arc;
use js::jsapi::{JSObject, JSContext};
use netsurfcss::util::VoidPtrLike;
use newcss::complete::CompleteSelectResults;
use servo_util::tree::{TreeNode, TreeNodeRef};
use servo_util::tree::{TreeNode, TreeNodeRef, TreeNodeRefAsElement};
use servo_util::range::Range;
use gfx::display_list::DisplayList;
@ -156,6 +156,14 @@ impl<View> TreeNodeRef<Node<View>> for AbstractNode<View> {
}
}
impl<View> TreeNodeRefAsElement<Node<View>, Element> for AbstractNode<View> {
#[inline]
fn with_imm_element_like<R>(self, f: &fn(&Element) -> R) -> R {
self.with_imm_element(f)
}
}
impl<View> TreeNode<AbstractNode<View>> for Node<View> { }
impl<'self, View> AbstractNode<View> {

View file

@ -250,6 +250,10 @@ pub trait TreeNodeRef<Node>: Clone {
}
}
pub trait TreeNodeRefAsElement<Node, E: ElementLike>: TreeNodeRef<Node> {
fn with_imm_element_like<R>(self, f: &fn(&E) -> R) -> R;
}
fn gather<Node, Ref: TreeNodeRef<Node>>(cur: &Ref, refs: &mut ~[Ref],
postorder: bool, prune: &fn(&Ref) -> bool) {
// prune shouldn't mutate, so don't clone
@ -326,7 +330,7 @@ pub trait TreeNode<Ref: TreeNodeRef<Self>> {
}
pub trait ElementLike<'self> {
fn get_local_name(&'self self) -> &'self str;
fn get_attr(&'self self, name: &str) -> Option<&'self str>;
pub trait ElementLike {
fn get_local_name<'a>(&'a self) -> &'a str;
fn get_attr<'a>(&'a self, name: &str) -> Option<&'a str>;
}