diff options
Diffstat (limited to 'components/script')
30 files changed, 147 insertions, 110 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index c3754adf3fe..b06ae8e8e48 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -63,28 +63,30 @@ features = ["unstable"] path = "../gfx_traits" [dependencies] -app_units = {version = "0.1", features = ["plugins"]} -cssparser = { version = "0.5", features = [ "serde-serialization" ] } -log = "0.3" +app_units = {version = "0.2", features = ["plugins"]} +bitflags = "0.3" +caseless = "0.1.0" +cssparser = {version = "0.5.2", features = ["heap_size", "serde-serialization"]} encoding = "0.2" +euclid = {version = "0.6.1", features = ["plugins"]} fnv = "1.0" +heapsize = "0.2.5" +heapsize_plugin = "0.1.2" +html5ever = {version = "0.4.2", features = ["heap_size", "unstable"]} hyper = { version = "0.7", features = [ "serde-serialization" ] } -time = "0.1.12" -bitflags = "0.3" -rustc-serialize = "0.3" +image = "0.5.0" libc = "0.2" -unicase = "1.0" +log = "0.3" num = "0.1.24" -websocket = "0.14.0" -uuid = "0.1.16" -smallvec = "0.1" -html5ever = { version = "0.4", features = ["unstable"] } -selectors = "0.2" -string_cache = { version = "0.2", features = ["unstable"] } -euclid = {version = "0.4", features = ["plugins"]} rand = "0.3" -serde = "0.6" -caseless = "0.1.0" -image = "0.5.0" -url = "0.5.2" ref_slice = "0.1.0" +rustc-serialize = "0.3" +selectors = {version = "0.4.1", features = ["heap_size"]} +serde = "0.6" +smallvec = "0.1" +string_cache = {version = "0.2.7", features = ["heap_size", "unstable"]} +time = "0.1.12" +unicase = "1.0" +url = {version = "0.5.4", features = ["heap_size"]} +uuid = "0.1.16" +websocket = "0.14.0" diff --git a/components/script/cors.rs b/components/script/cors.rs index 7bf5127a22e..e64583e0a58 100644 --- a/components/script/cors.rs +++ b/components/script/cors.rs @@ -27,7 +27,6 @@ use std::sync::{Arc, Mutex}; use time::{self, Timespec, now}; use unicase::UniCase; use url::{SchemeData, Url}; -use util::mem::HeapSizeOf; use util::thread::spawn_named; /// Interface for network listeners concerned with CORS checks. Proper network requests @@ -41,6 +40,7 @@ pub struct CORSRequest { pub origin: Url, pub destination: Url, pub mode: RequestMode, + #[ignore_heap_size_of = "Defined in hyper"] pub method: Method, #[ignore_heap_size_of = "Defined in hyper"] pub headers: Headers, diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 95f22e693e5..dafd14f58c9 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -14,7 +14,6 @@ use js::jsapi::{JSContext, JSObject, RootedValue}; use js::jsapi::{JS_IsExceptionPending, JS_ReportPendingException, JS_SetPendingException}; use js::jsapi::{JS_RestoreFrameChain, JS_SaveFrameChain}; use js::jsval::UndefinedValue; -use util::mem::HeapSizeOf; /// DOM exceptions that can be thrown by a native DOM method. #[derive(Debug, Clone, HeapSizeOf)] diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 6abf5f9b4e5..37d673f3c26 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -30,6 +30,7 @@ use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::trace::JSTraceable; use dom::bindings::trace::trace_reflector; use dom::node::Node; +use heapsize::HeapSizeOf; use js::jsapi::{Heap, JSObject, JSTracer}; use js::jsval::JSVal; use layout_interface::TrustedNodeAddress; @@ -40,7 +41,6 @@ use std::hash::{Hash, Hasher}; use std::mem; use std::ops::Deref; use std::ptr; -use util::mem::HeapSizeOf; use util::thread_state; /// A traced reference to a DOM object diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index df69bc77fd0..26c8568eadf 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -10,7 +10,6 @@ use std::hash::{Hash, Hasher}; use std::ops; use std::str; use std::str::FromStr; -use util::mem::HeapSizeOf; use util::str::is_token; /// Encapsulates the IDL `ByteString` type. diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index e62bd5d9583..1362731339a 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -65,8 +65,6 @@ use profile_traits::mem::ProfilerChan as MemProfilerChan; use profile_traits::time::ProfilerChan as TimeProfilerChan; use script_thread::ScriptChan; use script_traits::{LayoutMsg, ScriptMsg, TimerEventId, TimerSource, UntrustedNodeAddress}; -use selectors::parser::PseudoElement; -use selectors::states::*; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use std::boxed::FnBox; @@ -84,8 +82,10 @@ use std::sync::atomic::AtomicBool; use std::sync::mpsc::{Receiver, Sender}; use string_cache::{Atom, Namespace, QualName}; use style::attr::{AttrIdentifier, AttrValue}; +use style::element_state::*; use style::properties::PropertyDeclarationBlock; use style::restyle_hints::ElementSnapshot; +use style::selector_impl::PseudoElement; use style::values::specified::Length; use url::Url; use util::str::{DOMString, LengthOrPercentageOrAuto}; diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index d34d8f3f9f4..83e7a2e4cb2 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -13,6 +13,7 @@ use dom::bindings::inheritance::TopTypeId; use dom::bindings::trace::trace_object; use dom::browsingcontext; use dom::window; +use heapsize::HeapSizeOf; use js; use js::error::throw_type_error; use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper}; @@ -36,7 +37,6 @@ use libc::{self, c_uint}; use std::default::Default; use std::ffi::CString; use std::ptr; -use util::mem::HeapSizeOf; use util::non_geckolib::jsstring_to_str; /// Proxy handler for a WindowProxy. diff --git a/components/script/dom/bindings/weakref.rs b/components/script/dom/bindings/weakref.rs index e311d4a40bb..99adb8a0c02 100644 --- a/components/script/dom/bindings/weakref.rs +++ b/components/script/dom/bindings/weakref.rs @@ -15,6 +15,7 @@ use core::nonzero::NonZero; use dom::bindings::js::Root; use dom::bindings::reflector::Reflectable; use dom::bindings::trace::JSTraceable; +use heapsize::HeapSizeOf; use js::jsapi::{JSTracer, JS_GetReservedSlot, JS_SetReservedSlot}; use js::jsval::PrivateValue; use libc::c_void; @@ -22,7 +23,6 @@ use std::cell::{Cell, UnsafeCell}; use std::iter::Iterator; use std::mem; use std::ops::{Deref, DerefMut, Drop}; -use util::mem::HeapSizeOf; /// The index of the slot wherein a pointer to the weak holder cell is /// stored for weak-referenceable bindings. We use slot 1 for holding it, diff --git a/components/script/dom/crypto.rs b/components/script/dom/crypto.rs index b8c595f3aa4..6e0351d37ee 100644 --- a/components/script/dom/crypto.rs +++ b/components/script/dom/crypto.rs @@ -20,6 +20,7 @@ no_jsmanaged_fields!(OsRng); #[dom_struct] pub struct Crypto { reflector_: Reflector, + #[ignore_heap_size_of = "Defined in rand"] rng: DOMRefCell<OsRng>, } diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 479d2e00f95..f6683f9eae5 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -11,7 +11,6 @@ use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::element::{Element, StylePriority}; use dom::node::{Node, NodeDamage, document_from_node, window_from_node}; use dom::window::Window; -use selectors::parser::PseudoElement; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cell::Ref; @@ -19,6 +18,7 @@ use string_cache::Atom; use style::error_reporting::ParseErrorReporter; use style::properties::{PropertyDeclaration, Shorthand}; use style::properties::{is_supported_property, parse_one_declaration}; +use style::selector_impl::PseudoElement; use util::str::{DOMString, str_join}; // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 66cad82dbb8..3cdf3f6ba43 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -68,7 +68,6 @@ use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks}; use selectors::matching::{DeclarationBlock, matches}; use selectors::matching::{common_style_affecting_attributes, rare_style_affecting_attributes}; use selectors::parser::{AttrSelector, NamespaceConstraint, parse_author_origin_selector_list_from_str}; -use selectors::states::*; use smallvec::VecLike; use std::ascii::AsciiExt; use std::borrow::Cow; @@ -77,13 +76,14 @@ use std::default::Default; use std::mem; use std::sync::Arc; use string_cache::{Atom, Namespace, QualName}; +use style::element_state::*; use style::error_reporting::ParseErrorReporter; use style::properties::DeclaredValue; use style::properties::longhands::{self, background_image, border_spacing, font_family, font_size}; use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, parse_style_attribute}; +use style::selector_impl::{NonTSPseudoClass, ServoSelectorImpl}; use style::values::CSSFloat; use style::values::specified::{self, CSSColor, CSSRGBA, LengthOrPercentage}; -use util::mem::HeapSizeOf; use util::str::{DOMString, LengthOrPercentageOrAuto}; // TODO: Update focus state when the top-level browsing context gains or loses system focus, @@ -1689,17 +1689,9 @@ impl VirtualMethods for Element { } } -macro_rules! state_getter { - ($( - $(#[$Flag_attr: meta])* - state $css: expr => $variant: ident / $method: ident / - $flag: ident = $value: expr, - )+) => { - $( fn $method(&self) -> bool { Element::get_state(self).contains($flag) } )+ - } -} - impl<'a> ::selectors::Element for Root<Element> { + type Impl = ServoSelectorImpl; + fn parent_element(&self) -> Option<Root<Element>> { self.upcast::<Node>().GetParentElement() } @@ -1734,46 +1726,52 @@ impl<'a> ::selectors::Element for Root<Element> { }) } - fn is_link(&self) -> bool { - // FIXME: This is HTML only. - let node = self.upcast::<Node>(); - match node.type_id() { - // https://html.spec.whatwg.org/multipage/#selector-link - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => { - self.has_attribute(&atom!("href")) - }, - _ => false, - } - } - - #[inline] - fn is_unvisited_link(&self) -> bool { - self.is_link() - } - - #[inline] - fn is_visited_link(&self) -> bool { - // https://github.com/servo/servo/issues/8718 - false - } - fn get_local_name(&self) -> &Atom { self.local_name() } + fn get_namespace(&self) -> &Namespace { self.namespace() } - state_pseudo_classes!(state_getter); + fn match_non_ts_pseudo_class(&self, pseudo_class: NonTSPseudoClass) -> bool { + match pseudo_class { + // https://github.com/servo/servo/issues/8718 + NonTSPseudoClass::Link | + NonTSPseudoClass::AnyLink => self.is_link(), + NonTSPseudoClass::Visited => false, + + NonTSPseudoClass::ServoNonZeroBorder => { + match self.downcast::<HTMLTableElement>() { + None => false, + Some(this) => { + match this.get_border() { + None | Some(0) => false, + Some(_) => true, + } + } + } + }, + + NonTSPseudoClass::Active | + NonTSPseudoClass::Focus | + NonTSPseudoClass::Hover | + NonTSPseudoClass::Enabled | + NonTSPseudoClass::Disabled | + NonTSPseudoClass::Checked | + NonTSPseudoClass::Indeterminate => + Element::get_state(self).contains(pseudo_class.state_flag()), + } + } fn get_id(&self) -> Option<Atom> { self.id_attribute.borrow().clone() } + fn has_class(&self, name: &Atom) -> bool { Element::has_class(&**self, name) } + fn each_class<F>(&self, mut callback: F) where F: FnMut(&Atom) { @@ -1785,17 +1783,6 @@ impl<'a> ::selectors::Element for Root<Element> { } } } - fn has_servo_nonzero_border(&self) -> bool { - match self.downcast::<HTMLTableElement>() { - None => false, - Some(this) => { - match this.get_border() { - None | Some(0) => false, - Some(_) => true, - } - } - } - } fn match_attr<F>(&self, attr: &AttrSelector, test: F) -> bool where F: Fn(&str) -> bool @@ -1886,6 +1873,20 @@ impl Element { } } + fn is_link(&self) -> bool { + // FIXME: This is HTML only. + let node = self.upcast::<Node>(); + match node.type_id() { + // https://html.spec.whatwg.org/multipage/#selector-link + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) | + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => { + self.has_attribute(&atom!("href")) + }, + _ => false, + } + } + /// Please call this method *only* for real click events /// /// https://html.spec.whatwg.org/multipage/#run-authentic-click-activation-steps diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 48682ec2211..91afac1bf1c 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -21,6 +21,7 @@ use dom::eventdispatcher::dispatch_event; use dom::virtualmethods::VirtualMethods; use dom::window::Window; use fnv::FnvHasher; +use heapsize::HeapSizeOf; use js::jsapi::{CompileFunction, JS_GetFunctionObject, RootedValue}; use js::jsapi::{HandleObject, JSContext, RootedFunction}; use js::jsapi::{JSAutoCompartment, JSAutoRequest}; @@ -28,14 +29,13 @@ use js::rust::{AutoObjectVectorWrapper, CompileOptionsWrapper}; use libc::{c_char, size_t}; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; -use std::collections::hash_state::DefaultState; use std::default::Default; use std::ffi::CString; +use std::hash::BuildHasherDefault; use std::rc::Rc; use std::{intrinsics, ptr}; use string_cache::Atom; use url::Url; -use util::mem::HeapSizeOf; use util::str::DOMString; #[derive(PartialEq, Clone, JSTraceable)] @@ -161,7 +161,7 @@ pub struct EventListenerEntry { #[dom_struct] pub struct EventTarget { reflector_: Reflector, - handlers: DOMRefCell<HashMap<Atom, Vec<EventListenerEntry>, DefaultState<FnvHasher>>>, + handlers: DOMRefCell<HashMap<Atom, Vec<EventListenerEntry>, BuildHasherDefault<FnvHasher>>>, } impl EventTarget { diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 5a8ffaf0df6..31d4b0a8740 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -20,10 +20,10 @@ use dom::node::{Node, UnbindContext, document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use std::ascii::AsciiExt; use std::cell::Cell; use string_cache::Atom; +use style::element_state::*; use util::str::DOMString; #[derive(JSTraceable, PartialEq, Copy, Clone)] diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index f0348c27b76..ce5d9a1f27a 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -30,13 +30,13 @@ use dom::node::{Node, SEQUENTIALLY_FOCUSABLE}; use dom::node::{document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::default::Default; use std::intrinsics; use std::rc::Rc; use string_cache::Atom; +use style::element_state::*; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index 009f9f93282..0390d9aa599 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -16,8 +16,8 @@ use dom::htmllegendelement::HTMLLegendElement; use dom::node::{Node, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use string_cache::Atom; +use style::element_state::*; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 368285f8a9f..e7116b5d8ce 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -32,10 +32,10 @@ use msg::constellation_msg::ConstellationChan; use script_thread::ScriptThreadEventCategory::InputEvent; use script_thread::{CommonScriptMsg, Runnable}; use script_traits::ScriptMsg as ConstellationMsg; -use selectors::states::*; use std::borrow::ToOwned; use std::cell::Cell; use string_cache::Atom; +use style::element_state::*; use textinput::KeyReaction::{DispatchInput, Nothing, RedrawSelection, TriggerDefaultAction}; use textinput::Lines::Single; use textinput::TextInput; diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index b0624d426f9..a554377ea7a 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -13,8 +13,8 @@ use dom::htmlelement::HTMLElement; use dom::htmloptionelement::HTMLOptionElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use string_cache::Atom; +use style::element_state::*; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 3e6019384ab..cd521702a34 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -18,9 +18,9 @@ use dom::htmlselectelement::HTMLSelectElement; use dom::node::{Node, UnbindContext}; use dom::text::Text; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use std::cell::Cell; use string_cache::Atom; +use style::element_state::*; use util::str::{DOMString, split_html_space_chars, str_join}; #[dom_struct] diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index 6db068d6da2..1b5ddb22183 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -20,8 +20,8 @@ use dom::node::{Node, UnbindContext, window_from_node}; use dom::nodelist::NodeList; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; -use selectors::states::*; use string_cache::Atom; +use style::element_state::*; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 95f1438f6e3..dfcfdc77f73 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -26,9 +26,9 @@ use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; use script_traits::ScriptMsg as ConstellationMsg; -use selectors::states::*; use std::cell::Cell; use string_cache::Atom; +use style::element_state::*; use textinput::{KeyReaction, Lines, TextInput}; use util::str::DOMString; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 33dadfe527b..a50aad1a78e 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -9,7 +9,6 @@ use core::nonzero::NonZero; use devtools_traits::NodeInfo; use document_loader::DocumentLoader; use dom::attr::Attr; -use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; @@ -47,6 +46,7 @@ use dom::text::Text; use dom::virtualmethods::{VirtualMethods, vtable_for}; use dom::window::Window; use euclid::rect::Rect; +use heapsize::{HeapSizeOf, heap_size_of}; use js::jsapi::{JSContext, JSObject, JSRuntime}; use layout_interface::{LayoutChan, Msg}; use libc::{self, c_void, uintptr_t}; @@ -57,12 +57,13 @@ use selectors::matching::matches; use selectors::parser::Selector; use selectors::parser::parse_author_origin_selector_list_from_str; use std::borrow::ToOwned; -use std::cell::Cell; +use std::cell::{Cell, UnsafeCell}; use std::cmp::max; use std::default::Default; use std::iter::{self, FilterMap, Peekable}; use std::mem; use string_cache::{Atom, Namespace, QualName}; +use style::selector_impl::ServoSelectorImpl; use util::str::DOMString; use util::thread_state; use uuid::Uuid; @@ -119,7 +120,7 @@ pub struct Node { /// node is finalized. style_and_layout_data: Cell<Option<OpaqueStyleAndLayoutData>>, - unique_id: DOMRefCell<Option<Box<Uuid>>>, + unique_id: UniqueId, } bitflags! { @@ -291,12 +292,12 @@ impl Node { } pub struct QuerySelectorIterator { - selectors: Vec<Selector>, + selectors: Vec<Selector<ServoSelectorImpl>>, iterator: TreeIterator, } impl<'a> QuerySelectorIterator { - fn new(iter: TreeIterator, selectors: Vec<Selector>) + fn new(iter: TreeIterator, selectors: Vec<Selector<ServoSelectorImpl>>) -> QuerySelectorIterator { QuerySelectorIterator { selectors: selectors, @@ -754,11 +755,7 @@ impl Node { } pub fn get_unique_id(&self) -> String { - if self.unique_id.borrow().is_none() { - let mut unique_id = self.unique_id.borrow_mut(); - *unique_id = Some(Box::new(Uuid::new_v4())); - } - self.unique_id.borrow().as_ref().unwrap().to_simple_string() + self.unique_id.borrow().to_simple_string() } pub fn summarize(&self) -> NodeInfo { @@ -1265,7 +1262,7 @@ impl Node { style_and_layout_data: Cell::new(None), - unique_id: DOMRefCell::new(None), + unique_id: UniqueId::new(), } } @@ -2437,3 +2434,40 @@ impl<'a> UnbindContext<'a> { index } } + +/// A node's unique ID, for devtools. +struct UniqueId { + cell: UnsafeCell<Option<Box<Uuid>>>, +} + +no_jsmanaged_fields!(UniqueId); + +impl HeapSizeOf for UniqueId { + #[allow(unsafe_code)] + fn heap_size_of_children(&self) -> usize { + if let &Some(ref uuid) = unsafe { &*self.cell.get() } { + heap_size_of(&** uuid as *const Uuid as *const c_void) + } else { + 0 + } + } +} + +impl UniqueId { + /// Create a new `UniqueId` value. The underlying `Uuid` is lazily created. + fn new() -> UniqueId { + UniqueId { cell: UnsafeCell::new(None) } + } + + /// The Uuid of that unique ID. + #[allow(unsafe_code)] + fn borrow(&self) -> &Uuid { + unsafe { + let ptr = self.cell.get(); + if (*ptr).is_none() { + *ptr = Some(box Uuid::new_v4()); + } + &(&*ptr).as_ref().unwrap() + } + } +} diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index 03db51ba0d8..6807a7a2d3c 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -23,10 +23,10 @@ use dom::document::Document; use dom::documentfragment::DocumentFragment; use dom::node::{Node, UnbindContext}; use dom::text::Text; +use heapsize::HeapSizeOf; use js::jsapi::JSTracer; use std::cell::{Cell, UnsafeCell}; use std::cmp::{Ord, Ordering, PartialEq, PartialOrd}; -use util::mem::HeapSizeOf; use util::str::DOMString; #[dom_struct] diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index c9658a1b5c2..c8544698ecb 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -8,7 +8,6 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::LocationBinding::LocationMethods; use dom::bindings::codegen::Bindings::WebSocketBinding; use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods}; -use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::UnionTypes::StringOrStringSequence::{self, eString, eStringSequence}; use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, Fallible}; @@ -24,6 +23,7 @@ use dom::closeevent::CloseEvent; use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; +use dom::urlhelper::UrlHelper; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use js::jsapi::{JSAutoCompartment, JSAutoRequest, RootedValue}; use js::jsapi::{JS_GetArrayBufferData, JS_NewArrayBuffer}; @@ -233,7 +233,7 @@ impl WebSocket { } // Step 6: Origin. - let origin = global.as_window().Location().Origin().0; + let origin = UrlHelper::Origin(&global.get_url()).0; // Step 7. let ws = WebSocket::new(global, resource_url.clone()); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2ca2090e547..c8ea1d9f0f8 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -58,7 +58,6 @@ use script_thread::{HistoryTraversalThreadSource, FileReadingThreadSource, Senda use script_thread::{ScriptChan, ScriptPort, MainThreadScriptChan, MainThreadScriptMsg, RunnableWrapper}; use script_traits::{DocumentState, MsDuration, ScriptToCompositorMsg, TimerEvent, TimerEventId}; use script_traits::{MozBrowserEvent, ScriptMsg as ConstellationMsg, TimerEventRequest, TimerSource}; -use selectors::parser::PseudoElement; use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cell::Cell; @@ -74,6 +73,7 @@ use std::sync::mpsc::{Sender, channel}; use string_cache::Atom; use style::context::ReflowGoal; use style::error_reporting::ParseErrorReporter; +use style::selector_impl::PseudoElement; use time; use timers::{ActiveTimers, IsInterval, ScheduledCallback, TimerCallback, TimerHandle}; use url::Url; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index e6b7374ef39..93e46d14510 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -62,7 +62,6 @@ use string_cache::Atom; use time; use timers::{ScheduledCallback, TimerHandle}; use url::Url; -use util::mem::HeapSizeOf; use util::str::DOMString; pub type SendParam = BlobOrStringOrURLSearchParams; @@ -127,11 +126,13 @@ pub struct XMLHttpRequest { response_xml: MutNullableHeap<JS<Document>>, #[ignore_heap_size_of = "Defined in hyper"] response_headers: DOMRefCell<Headers>, + #[ignore_heap_size_of = "Defined in hyper"] override_mime_type: DOMRefCell<Option<Mime>>, #[ignore_heap_size_of = "Defined in rust-encoding"] override_charset: DOMRefCell<Option<EncodingRef>>, // Associated concepts + #[ignore_heap_size_of = "Defined in hyper"] request_method: DOMRefCell<Method>, request_url: DOMRefCell<Option<Url>>, #[ignore_heap_size_of = "Defined in hyper"] @@ -1220,7 +1221,6 @@ impl XMLHttpRequest { } } - #[allow(dead_code)] fn final_mime_type(&self) -> Option<Mime> { if self.override_mime_type.borrow().is_some() { self.override_mime_type.borrow().clone() diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs index 7c555efcca6..c759b358e79 100644 --- a/components/script/layout_interface.rs +++ b/components/script/layout_interface.rs @@ -18,12 +18,12 @@ use net_traits::image_cache_thread::ImageCacheThread; use profile_traits::mem::ReportsChan; use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg}; use script_traits::{OpaqueScriptLayoutChannel, UntrustedNodeAddress}; -use selectors::parser::PseudoElement; use std::any::Any; use std::sync::Arc; use std::sync::mpsc::{Receiver, Sender, channel}; use string_cache::Atom; use style::context::ReflowGoal; +use style::selector_impl::PseudoElement; use style::stylesheets::Stylesheet; use url::Url; use util::ipc::OptionalOpaqueIpcSender; diff --git a/components/script/lib.rs b/components/script/lib.rs index a776fe2d484..dfd11938075 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -12,7 +12,6 @@ #![feature(custom_attribute)] #![feature(custom_derive)] #![feature(fnbox)] -#![feature(hashmap_hasher)] #![feature(mpsc_select)] #![feature(nonzero)] #![feature(on_unimplemented)] @@ -26,6 +25,7 @@ #![doc = "The script crate contains all matters DOM."] +#![plugin(heapsize_plugin)] #![plugin(plugins)] extern crate angle; @@ -42,6 +42,7 @@ extern crate encoding; extern crate euclid; extern crate fnv; extern crate gfx_traits; +extern crate heapsize; extern crate html5ever; extern crate hyper; extern crate image; @@ -60,7 +61,7 @@ extern crate rand; extern crate ref_slice; extern crate rustc_serialize; extern crate script_traits; -#[macro_use(state_pseudo_classes)] extern crate selectors; +extern crate selectors; extern crate serde; extern crate smallvec; #[macro_use(atom, ns)] extern crate string_cache; diff --git a/components/script/mem.rs b/components/script/mem.rs index 113f03b8396..e276b1a5c3d 100644 --- a/components/script/mem.rs +++ b/components/script/mem.rs @@ -6,8 +6,8 @@ use dom::bindings::conversions::get_dom_class; use dom::bindings::reflector::Reflectable; +use heapsize::{HeapSizeOf, heap_size_of}; use libc::c_void; -use util::mem::{HeapSizeOf, heap_size_of}; // This is equivalent to measuring a Box<T>, except that DOM objects lose their // associated box in order to stash their pointers in a reserved slot of their diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 5d533f0e419..02fb79e04a8 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -12,7 +12,6 @@ use std::borrow::ToOwned; use std::cmp::{max, min}; use std::default::Default; use std::usize; -use util::mem::HeapSizeOf; use util::str::DOMString; #[derive(Copy, Clone, PartialEq)] diff --git a/components/script/timers.rs b/components/script/timers.rs index 7f608f98f46..20797d02cb0 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -9,6 +9,7 @@ use dom::bindings::reflector::Reflectable; use dom::bindings::trace::JSTraceable; use dom::window::ScriptHelpers; use euclid::length::Length; +use heapsize::HeapSizeOf; use ipc_channel::ipc::IpcSender; use js::jsapi::{HandleValue, Heap, RootedValue}; use js::jsval::{JSVal, UndefinedValue}; @@ -19,7 +20,6 @@ use std::cell::Cell; use std::cmp::{self, Ord, Ordering}; use std::default::Default; use std::rc::Rc; -use util::mem::HeapSizeOf; use util::str::DOMString; #[derive(JSTraceable, PartialEq, Eq, Copy, Clone, HeapSizeOf, Hash, PartialOrd, Ord, Debug)] @@ -359,6 +359,7 @@ impl ActiveTimers { }; self.suspension_offset.set(self.suspension_offset.get() + additional_offset); + self.suspended_since.set(None); self.schedule_timer_call(); } |