From 62f1f03c161049a4f938a7e1de5dc7fcf78219f6 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Wed, 16 Oct 2013 16:47:04 +0100 Subject: [PATCH] Move Element::get_attr to a trait defined in util::tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … and add a get_local_name() method to that trait. --- src/components/main/css/select_handler.rs | 1 + src/components/main/layout/box.rs | 1 + src/components/script/dom/document.rs | 2 +- src/components/script/dom/element.rs | 25 ++++++++++++------- src/components/script/dom/htmldocument.rs | 2 +- src/components/script/dom/htmlimageelement.rs | 2 ++ .../script/html/hubbub_html_parser.rs | 2 +- src/components/script/script_task.rs | 2 +- src/components/style/selector_matching.rs | 2 ++ src/components/util/tree.rs | 6 +++++ 10 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/components/main/css/select_handler.rs b/src/components/main/css/select_handler.rs index e031b153b0f..77038c38b88 100644 --- a/src/components/main/css/select_handler.rs +++ b/src/components/main/css/select_handler.rs @@ -9,6 +9,7 @@ use std::str::eq_slice; use newcss::select::SelectHandler; use script::dom::node::{AbstractNode, LayoutView}; +use servo_util::tree::ElementLike; pub struct NodeSelectHandler { node: AbstractNode, diff --git a/src/components/main/layout/box.rs b/src/components/main/layout/box.rs index edf8cdaab71..179be6169a4 100644 --- a/src/components/main/layout/box.rs +++ b/src/components/main/layout/box.rs @@ -38,6 +38,7 @@ use script::dom::node::{AbstractNode, LayoutView}; use servo_net::image::holder::ImageHolder; use servo_net::local_image_cache::LocalImageCache; use servo_util::range::*; +use servo_util::tree::ElementLike; use extra::url::Url; /// Render boxes (`struct RenderBox`) are the leaves of the layout tree. They cannot position diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 4687205066d..62fab67b51c 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -24,7 +24,7 @@ use html::hubbub_html_parser::build_element_from_tag; use js::jsapi::{JSObject, JSContext, JSVal}; use js::jsapi::{JSTRACE_OBJECT, JSTracer, JS_CallTracer}; use js::glue::RUST_OBJECT_TO_JSVAL; -use servo_util::tree::TreeNodeRef; +use servo_util::tree::{TreeNodeRef, ElementLike}; use std::hashmap::HashMap; diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index fd50118a9ec..62d591ad46b 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -14,6 +14,7 @@ use dom::node::{ElementNodeTypeId, Node, ScriptView, AbstractNode}; use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; use layout_interface::{ContentBoxesResponse}; use newcss::stylesheet::Stylesheet; +use servo_util::tree::ElementLike; use js::jsapi::{JSContext, JSObject}; @@ -119,17 +120,12 @@ pub enum ElementTypeId { // Element methods // -impl<'self> Element { - pub fn new(type_id: ElementTypeId, tag_name: ~str, document: AbstractDocument) -> Element { - Element { - node: Node::new(ElementNodeTypeId(type_id), document), - tag_name: tag_name, - attrs: ~[], - style_attribute: None, - } +impl<'self> ElementLike<'self> for Element { + fn get_local_name(&'self self) -> &'self str { + self.tag_name.as_slice() } - pub fn get_attr(&'self self, name: &str) -> Option<&'self str> { + fn get_attr(&'self self, name: &str) -> Option<&'self 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.) @@ -140,6 +136,17 @@ impl<'self> Element { } return None; } +} + +impl<'self> Element { + pub fn new(type_id: ElementTypeId, tag_name: ~str, document: AbstractDocument) -> Element { + Element { + node: Node::new(ElementNodeTypeId(type_id), document), + tag_name: tag_name, + attrs: ~[], + style_attribute: None, + } + } pub fn set_attr(&mut self, abstract_self: AbstractNode, diff --git a/src/components/script/dom/htmldocument.rs b/src/components/script/dom/htmldocument.rs index fc521220ee3..77151d15d01 100644 --- a/src/components/script/dom/htmldocument.rs +++ b/src/components/script/dom/htmldocument.rs @@ -13,7 +13,7 @@ use dom::window::Window; use js::jsapi::{JSObject, JSContext, JSTracer}; -use servo_util::tree::TreeNodeRef; +use servo_util::tree::{TreeNodeRef, ElementLike}; use std::libc; use std::ptr; diff --git a/src/components/script/dom/htmlimageelement.rs b/src/components/script/dom/htmlimageelement.rs index 282343919fe..5f0519f5d66 100644 --- a/src/components/script/dom/htmlimageelement.rs +++ b/src/components/script/dom/htmlimageelement.rs @@ -1,3 +1,4 @@ + /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -11,6 +12,7 @@ use layout_interface::{ContentBoxQuery, ContentBoxResponse}; use servo_net::image_cache_task; use servo_net::image_cache_task::ImageCacheTask; use servo_util::url::make_url; +use servo_util::tree::ElementLike; pub struct HTMLImageElement { htmlelement: HTMLElement, diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index e3b948641e6..b5eb8e4e7f8 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -26,7 +26,7 @@ use hubbub::hubbub; use servo_msg::constellation_msg::{ConstellationChan, SubpageId}; use servo_net::image_cache_task::ImageCacheTask; use servo_net::resource_task::{Load, Payload, Done, ResourceTask}; -use servo_util::tree::TreeNodeRef; +use servo_util::tree::{TreeNodeRef, ElementLike}; use servo_util::url::make_url; use extra::url::Url; use extra::future::{Future, from_port}; diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 31a0bd6eb9d..9897be2b013 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -46,7 +46,7 @@ use js::rust::{Compartment, Cx}; use js; use servo_net::image_cache_task::ImageCacheTask; use servo_net::resource_task::ResourceTask; -use servo_util::tree::TreeNodeRef; +use servo_util::tree::{TreeNodeRef, ElementLike}; use servo_util::url::make_url; use extra::url::Url; use extra::future::{from_value, Future}; diff --git a/src/components/style/selector_matching.rs b/src/components/style/selector_matching.rs index 1d5a5ad9375..3c2b3a5812c 100644 --- a/src/components/style/selector_matching.rs +++ b/src/components/style/selector_matching.rs @@ -11,6 +11,7 @@ use media_queries::{Device, Screen}; use properties::{PropertyDeclaration, PropertyDeclarationBlock}; use script::dom::node::{AbstractNode, ScriptView}; use script::dom::element::Element; +use servo_util::tree::ElementLike; pub enum StylesheetOrigin { @@ -192,6 +193,7 @@ fn matches_simple_selector(selector: &SimpleSelector, element: &Element) -> bool match *selector { // TODO: case-sensitivity depends on the document type + // TODO: intern element names LocalNameSelector(ref name) => element.tag_name.eq_ignore_ascii_case(name.as_slice()), NamespaceSelector(_) => false, // TODO, when the DOM supports namespaces on elements. // TODO: case-sensitivity depends on the document type and quirks mode diff --git a/src/components/util/tree.rs b/src/components/util/tree.rs index 2b3b467ac45..70f75b5f3c5 100644 --- a/src/components/util/tree.rs +++ b/src/components/util/tree.rs @@ -324,3 +324,9 @@ pub trait TreeNode> { TreeNodeRef::::set_next_sibling(self, new_next_sibling) } } + + +pub trait ElementLike<'self> { + fn get_local_name(&'self self) -> &'self str; + fn get_attr(&'self self, name: &str) -> Option<&'self str>; +}