diff options
Diffstat (limited to 'components/script/dom')
166 files changed, 893 insertions, 407 deletions
diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 782ab3fd884..06950a515b0 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -23,12 +23,13 @@ use std::cell::Ref; use std::mem; use std::ops::Deref; +#[derive(HeapSizeOf)] pub enum AttrSettingType { FirstSetAttr, ReplacedAttr, } -#[derive(JSTraceable, PartialEq, Clone)] +#[derive(JSTraceable, PartialEq, Clone, HeapSizeOf)] pub enum AttrValue { String(DOMString), TokenList(DOMString, Vec<Atom>), @@ -110,6 +111,7 @@ impl Deref for AttrValue { // https://dom.spec.whatwg.org/#interface-attr #[dom_struct] +#[derive(HeapSizeOf)] pub struct Attr { reflector_: Reflector, local_name: Atom, diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index d6ca15dd546..f1b239a1922 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -97,8 +97,8 @@ numericTags = [ IDLType.Tags.int16, IDLType.Tags.uint16, IDLType.Tags.int32, IDLType.Tags.uint32, IDLType.Tags.int64, IDLType.Tags.uint64, - IDLType.Tags.unrestricted_float, IDLType.Tags.float, - IDLType.Tags.unrestricted_double, IDLType.Tags.double + IDLType.Tags.unrestricted_float, + IDLType.Tags.unrestricted_double ] @@ -1056,7 +1056,9 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, defaultStr = "None" else: tag = defaultValue.type.tag() - if tag in numericTags: + if tag in [IDLType.Tags.float, IDLType.Tags.double]: + defaultStr = "Finite::wrap(%s)" % defaultValue.value + elif tag in numericTags: defaultStr = str(defaultValue.value) else: assert(tag == IDLType.Tags.bool) @@ -2089,7 +2091,9 @@ class CGAbstractMethod(CGThing): def define(self): body = self.definition_body() - if self.unsafe: + + # Method will already be marked `unsafe` if `self.extern == True` + if self.unsafe and not self.extern: body = CGWrapper(CGIndenter(body), pre="unsafe {\n", post="\n}") return CGWrapper(CGIndenter(body), @@ -4032,8 +4036,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): 'successCode': fillDescriptor, 'pre': 'let mut result_root = RootedValue::new(cx, UndefinedValue());' } - get += ("if index.is_some() {\n" + - " let index = index.unwrap();\n" + + get += ("if let Some(index) = index {\n" + " let this = UnwrapProxy(proxy);\n" + " let this = &*this;\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define() + "\n" + @@ -4102,8 +4105,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): if not (self.descriptor.operations['IndexedCreator'] is indexedSetter): raise TypeError("Can't handle creator that's different from the setter") set += ("let index = get_array_index_from_id(cx, id);\n" + - "if index.is_some() {\n" + - " let index = index.unwrap();\n" + + "if let Some(index) = index {\n" + " let this = UnwrapProxy(proxy);\n" + " let this = &*this;\n" + CGIndenter(CGProxyIndexedSetter(self.descriptor)).define() + @@ -4186,8 +4188,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod): indexedGetter = self.descriptor.operations['IndexedGetter'] if indexedGetter: indexed = ("let index = get_array_index_from_id(cx, id);\n" + - "if index.is_some() {\n" + - " let index = index.unwrap();\n" + + "if let Some(index) = index {\n" + " let this = UnwrapProxy(proxy);\n" + " let this = &*this;\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor)).define() + "\n" + @@ -4259,8 +4260,7 @@ if !expando.ptr.is_null() { indexedGetter = self.descriptor.operations['IndexedGetter'] if indexedGetter: getIndexedOrExpando = ("let index = get_array_index_from_id(cx, id);\n" + - "if index.is_some() {\n" + - " let index = index.unwrap();\n" + + "if let Some(index) = index {\n" + " let this = UnwrapProxy(proxy);\n" + " let this = &*this;\n" + CGIndenter(CGProxyIndexedGetter(self.descriptor, templateValues)).define()) diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index a40c563ae35..5741ab8fce5 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -2920,8 +2920,7 @@ class IDLValue(IDLObject): elif self.type.isInteger() and type.isFloat(): # Convert an integer literal into float if -2**24 <= self.value <= 2**24: - floatType = BuiltinTypes[IDLBuiltinType.Types.float] - return IDLValue(self.location, floatType, float(self.value)) + return IDLValue(self.location, type, float(self.value)) else: raise WebIDLError("Converting value %s to %s will lose precision." % (self.value, type), [location]) @@ -2939,7 +2938,7 @@ class IDLValue(IDLObject): math.isnan(self.value))): raise WebIDLError("Trying to convert unrestricted value %s to non-unrestricted" % self.value, [location]); - return self + return IDLValue(self.location, type, self.value) elif self.type.isString() and type.isUSVString(): # Allow USVStrings to use default value just like # DOMString. No coercion is required in this case as Codegen.py diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 373c6c7cbe0..023254d55a5 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -9,6 +9,7 @@ use dom::bindings::conversions::ToJSValConvertible; use dom::bindings::global::GlobalRef; use dom::domexception::{DOMException, DOMErrorName}; +use util::mem::HeapSizeOf; use util::str::DOMString; use js::jsapi::{JSContext, JSObject, RootedValue}; @@ -24,7 +25,7 @@ use std::ptr; use std::mem; /// DOM exceptions that can be thrown by a native DOM method. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, HeapSizeOf)] pub enum Error { /// IndexSizeError DOMException IndexSize, diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 053059cec9f..6c2b36c40e9 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -15,7 +15,7 @@ use dom::document::DocumentHelpers; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; use dom::window::{self, WindowHelpers, ScriptHelpers}; use devtools_traits::ScriptToDevtoolsControlMsg; -use script_task::{ScriptChan, ScriptPort, ScriptMsg, ScriptTask}; +use script_task::{ScriptChan, ScriptPort, CommonScriptMsg, ScriptTask}; use msg::constellation_msg::{ConstellationChan, PipelineId, WorkerId}; use net_traits::ResourceTask; @@ -27,6 +27,8 @@ use js::jsapi::{GetGlobalForObjectCrossCompartment}; use js::jsapi::{JSContext, JSObject, JS_GetClass, MutableHandleValue}; use url::Url; +use util::mem::HeapSizeOf; + /// A freely-copyable reference to a rooted global object. #[derive(Copy, Clone)] pub enum GlobalRef<'a> { @@ -47,7 +49,7 @@ pub enum GlobalRoot { /// A traced reference to a global object, for use in fields of traced Rust /// structures. -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] #[must_root] pub enum GlobalField { /// A field for a `Window` object. @@ -166,7 +168,7 @@ impl<'a> GlobalRef<'a> { /// Process a single event as if it were the next event in the task queue for /// this global. - pub fn process_event(&self, msg: ScriptMsg) { + pub fn process_event(&self, msg: CommonScriptMsg) { match *self { GlobalRef::Window(_) => ScriptTask::process_event(msg), GlobalRef::Worker(ref worker) => worker.process_event(msg), diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 0fde5678ab2..b622485f602 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -386,7 +386,7 @@ pub unsafe fn trace_roots(tracer: *mut JSTracer) { STACK_ROOTS.with(|ref collection| { let RootCollectionPtr(collection) = collection.get().unwrap(); let collection = &*(*collection).roots.get(); - for root in collection.iter() { + for root in collection { trace_reflector(tracer, "reflector", &**root); } }); @@ -463,4 +463,3 @@ impl<T: Reflectable> Drop for Root<T> { unsafe { (*self.root_list).unroot(self); } } } - diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs index e4017c684e8..8d1f0876e6b 100644 --- a/components/script/dom/bindings/refcounted.rs +++ b/components/script/dom/bindings/refcounted.rs @@ -25,7 +25,7 @@ use dom::bindings::js::Root; use dom::bindings::utils::{Reflector, Reflectable}; use dom::bindings::trace::trace_reflector; -use script_task::{ScriptMsg, ScriptChan}; +use script_task::{ScriptChan, CommonScriptMsg}; use js::jsapi::{JSContext, JSTracer}; @@ -130,7 +130,7 @@ impl<T: Reflectable> Drop for Trusted<T> { // It's possible this send will fail if the script task // has already exited. There's not much we can do at this // point though. - let msg = ScriptMsg::RefcountCleanup(TrustedReference(self.ptr)); + let msg = CommonScriptMsg::RefcountCleanup(TrustedReference(self.ptr)); let _ = self.script_chan.send(msg); } } diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index 5ee26f86543..6c7fea1dc10 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -11,8 +11,10 @@ use std::ops; use std::str; use std::str::FromStr; +use util::mem::HeapSizeOf; + /// Encapsulates the IDL `ByteString` type. -#[derive(JSTraceable,Clone,Eq,PartialEq)] +#[derive(JSTraceable, Clone, Eq, PartialEq, HeapSizeOf)] pub struct ByteString(Vec<u8>); impl ByteString { @@ -48,7 +50,7 @@ impl ByteString { /// [RFC 2616](http://tools.ietf.org/html/rfc2616#page-17). pub fn is_token(&self) -> bool { let ByteString(ref vec) = *self; - if vec.len() == 0 { + if vec.is_empty() { return false; // A token must be at least a single character } vec.iter().all(|&x| { diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 770515cce40..423aa62844a 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -55,7 +55,6 @@ use libc; use msg::constellation_msg::{PipelineId, SubpageId, WindowSizeData, WorkerId}; use net_traits::image_cache_task::{ImageCacheChan, ImageCacheTask}; use net_traits::storage_task::StorageType; -use script_traits::ScriptControlChan; use script_traits::UntrustedNodeAddress; use serde::{Serialize, Deserialize}; use smallvec::SmallVec; @@ -65,6 +64,7 @@ use net_traits::image::base::Image; use profile_traits::mem::ProfilerChan; use util::str::{LengthOrPercentageOrAuto}; use selectors::parser::PseudoElement; +use std::boxed::FnBox; use std::cell::{Cell, UnsafeCell, RefCell}; use std::collections::{HashMap, HashSet}; use std::collections::hash_state::HashState; @@ -280,7 +280,7 @@ no_jsmanaged_fields!(Receiver<T>); no_jsmanaged_fields!(Rect<T>); no_jsmanaged_fields!(Size2D<T>); no_jsmanaged_fields!(Arc<T>); -no_jsmanaged_fields!(Image, ImageCacheChan, ImageCacheTask, ScriptControlChan); +no_jsmanaged_fields!(Image, ImageCacheChan, ImageCacheTask); no_jsmanaged_fields!(Atom, Namespace); no_jsmanaged_fields!(Trusted<T>); no_jsmanaged_fields!(PropertyDeclarationBlock); @@ -314,7 +314,7 @@ impl JSTraceable for Box<ScriptChan+Send> { } } -impl JSTraceable for Box<Fn(f64, )> { +impl JSTraceable for Box<FnBox(f64, )> { #[inline] fn trace(&self, _trc: *mut JSTracer) { // Do nothing @@ -429,7 +429,7 @@ impl RootedTraceableSet { } unsafe fn trace(&self, tracer: *mut JSTracer) { - for info in self.set.iter() { + for info in &self.set { (info.trace)(info.ptr, tracer); } } diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 80db27bd894..d5c7d589ed4 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -235,7 +235,7 @@ pub fn do_create_interface_objects(cx: *mut JSContext, members, s.as_ptr()) } - for ctor in named_constructors.iter() { + for ctor in named_constructors { let (cnative, cname, cnargs) = *ctor; let cs = CString::new(cname).unwrap(); @@ -321,7 +321,7 @@ fn create_interface_object(cx: *mut JSContext, /// Fails on JSAPI failure. fn define_constants(cx: *mut JSContext, obj: HandleObject, constants: &'static [ConstantSpec]) { - for spec in constants.iter() { + for spec in constants { let value = RootedValue::new(cx, spec.get_value()); unsafe { assert!(JS_DefineProperty(cx, obj, spec.name.as_ptr() as *const libc::c_char, diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index b20c5997a7b..51a5ac0ab8c 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -17,7 +17,7 @@ use std::borrow::ToOwned; use std::cmp::{min, max}; use std::cell::{Cell}; -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] pub enum BlobTypeId { Blob, File, @@ -25,6 +25,7 @@ pub enum BlobTypeId { // http://dev.w3.org/2006/webapi/FileAPI/#blob #[dom_struct] +#[derive(HeapSizeOf)] pub struct Blob { reflector_: Reflector, type_: BlobTypeId, diff --git a/components/script/dom/canvasgradient.rs b/components/script/dom/canvasgradient.rs index 3068b031490..ca91a7a7857 100644 --- a/components/script/dom/canvasgradient.rs +++ b/components/script/dom/canvasgradient.rs @@ -2,11 +2,12 @@ * 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/. */ -use cssparser::RGBA; use canvas_traits::{CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::CanvasGradientBinding; use dom::bindings::codegen::Bindings::CanvasGradientBinding::CanvasGradientMethods; +use dom::bindings::error::Error::{IndexSize, Syntax}; +use dom::bindings::error::ErrorResult; use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; use dom::bindings::num::Finite; @@ -15,13 +16,14 @@ use dom::canvasrenderingcontext2d::parse_color; // https://html.spec.whatwg.org/multipage/#canvasgradient #[dom_struct] +#[derive(HeapSizeOf)] pub struct CanvasGradient { reflector_: Reflector, style: CanvasGradientStyle, stops: DOMRefCell<Vec<CanvasGradientStop>>, } -#[derive(JSTraceable, Clone)] +#[derive(JSTraceable, Clone, HeapSizeOf)] pub enum CanvasGradientStyle { Linear(LinearGradientStyle), Radial(RadialGradientStyle), @@ -44,18 +46,21 @@ impl CanvasGradient { impl<'a> CanvasGradientMethods for &'a CanvasGradient { // https://html.spec.whatwg.org/multipage/#dom-canvasgradient-addcolorstop - fn AddColorStop(self, offset: Finite<f64>, color: String) { - let default_black = RGBA { - red: 0.0, - green: 0.0, - blue: 0.0, - alpha: 1.0, + fn AddColorStop(self, offset: Finite<f64>, color: String) -> ErrorResult { + if *offset < 0f64 || *offset > 1f64 { + return Err(IndexSize); + } + + let color = match parse_color(&color) { + Ok(color) => color, + _ => return Err(Syntax) }; self.stops.borrow_mut().push(CanvasGradientStop { offset: (*offset) as f64, - color: parse_color(&color).unwrap_or(default_black), + color: color, }); + Ok(()) } } diff --git a/components/script/dom/canvaspattern.rs b/components/script/dom/canvaspattern.rs index 25293e526f0..49dae9c419b 100644 --- a/components/script/dom/canvaspattern.rs +++ b/components/script/dom/canvaspattern.rs @@ -12,6 +12,7 @@ use euclid::size::Size2D; // https://html.spec.whatwg.org/multipage/#canvaspattern #[dom_struct] +#[derive(HeapSizeOf)] pub struct CanvasPattern { reflector_: Reflector, surface_data: Vec<u8>, diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index d533d100d33..6d3c6edddda 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -51,7 +51,7 @@ use url::Url; use util::vec::byte_swap; #[must_root] -#[derive(JSTraceable, Clone)] +#[derive(JSTraceable, Clone, HeapSizeOf)] pub enum CanvasFillOrStrokeStyle { Color(RGBA), Gradient(JS<CanvasGradient>), @@ -60,10 +60,12 @@ pub enum CanvasFillOrStrokeStyle { // https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d #[dom_struct] +#[derive(HeapSizeOf)] pub struct CanvasRenderingContext2D { reflector_: Reflector, global: GlobalField, renderer_id: usize, + #[ignore_heap_size_of = "Defined in ipc-channel"] ipc_renderer: IpcSender<CanvasMsg>, canvas: JS<HTMLCanvasElement>, state: RefCell<CanvasContextState>, @@ -71,7 +73,7 @@ pub struct CanvasRenderingContext2D { } #[must_root] -#[derive(JSTraceable, Clone)] +#[derive(JSTraceable, Clone, HeapSizeOf)] struct CanvasContextState { global_alpha: f64, global_composition: CompositionOrBlending, diff --git a/components/script/dom/closeevent.rs b/components/script/dom/closeevent.rs index b4c6a955500..07a6fb39379 100644 --- a/components/script/dom/closeevent.rs +++ b/components/script/dom/closeevent.rs @@ -16,6 +16,7 @@ use script_task::ScriptChan; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct CloseEvent { event: Event, wasClean: bool, diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs index da617903806..930d737a168 100644 --- a/components/script/dom/comment.rs +++ b/components/script/dom/comment.rs @@ -16,6 +16,7 @@ use util::str::DOMString; /// An HTML comment. #[dom_struct] +#[derive(HeapSizeOf)] pub struct Comment { characterdata: CharacterData, } diff --git a/components/script/dom/console.rs b/components/script/dom/console.rs index 535f25d895b..0d7d3c9d8f3 100644 --- a/components/script/dom/console.rs +++ b/components/script/dom/console.rs @@ -13,6 +13,7 @@ use util::str::DOMString; // https://developer.mozilla.org/en-US/docs/Web/API/Console #[dom_struct] +#[derive(HeapSizeOf)] pub struct Console { reflector_: Reflector, global: GlobalField, @@ -100,7 +101,7 @@ fn propagate_console_msg(console: &&Console, console_message: ConsoleMessage) { let global = console.global.root(); let pipelineId = global.r().pipeline(); global.r().devtools_chan().as_ref().map(|chan| { - chan.send(ScriptToDevtoolsControlMsg::SendConsoleMessage( + chan.send(ScriptToDevtoolsControlMsg::ConsoleAPI( pipelineId, console_message.clone(), global.r().get_worker_id())).unwrap(); }); } diff --git a/components/script/dom/crypto.rs b/components/script/dom/crypto.rs index ef7bc62c9d9..857e220aca1 100644 --- a/components/script/dom/crypto.rs +++ b/components/script/dom/crypto.rs @@ -22,6 +22,7 @@ no_jsmanaged_fields!(OsRng); // https://developer.mozilla.org/en-US/docs/Web/API/Crypto #[dom_struct] +#[derive(HeapSizeOf)] pub struct Crypto { reflector_: Reflector, rng: DOMRefCell<OsRng>, diff --git a/components/script/dom/css.rs b/components/script/dom/css.rs index 5f4bce94d28..c88b3ea92fc 100644 --- a/components/script/dom/css.rs +++ b/components/script/dom/css.rs @@ -10,6 +10,7 @@ use util::str::DOMString; use cssparser::serialize_identifier; #[dom_struct] +#[derive(HeapSizeOf)] pub struct CSS { reflector_: Reflector, } diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index aceeaec9ff0..bbfdbc8231e 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -25,6 +25,7 @@ use std::cell::Ref; // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface #[dom_struct] +#[derive(HeapSizeOf)] pub struct CSSStyleDeclaration { reflector_: Reflector, owner: JS<HTMLElement>, @@ -32,7 +33,7 @@ pub struct CSSStyleDeclaration { pseudo: Option<PseudoElement>, } -#[derive(PartialEq)] +#[derive(PartialEq, HeapSizeOf)] pub enum CSSModificationAccess { ReadWrite, Readonly @@ -44,8 +45,8 @@ macro_rules! css_properties( fn $getter(self) -> DOMString { self.GetPropertyValue($cssprop.to_owned()) } - fn $setter(self, value: DOMString) { - self.SetPropertyValue($cssprop.to_owned(), value).unwrap(); + fn $setter(self, value: DOMString) -> ErrorResult { + self.SetPropertyValue($cssprop.to_owned(), value) } )* ); diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index 303eebb8ca5..a020b7ef5cd 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -17,8 +17,10 @@ use util::str::DOMString; // https://dom.spec.whatwg.org/#interface-customevent #[dom_struct] +#[derive(HeapSizeOf)] pub struct CustomEvent { event: Event, + #[ignore_heap_size_of = "Defined in rust-mozjs"] detail: MutHeapJSVal, } diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index bce639a5c6b..3ef4104c11c 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -22,8 +22,7 @@ use dom::messageevent::MessageEvent; use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, WorkerEventHandler, WorkerErrorHandler}; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; use dom::workerglobalscope::{WorkerGlobalScopeTypeId, WorkerGlobalScopeInit}; -use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource, ScriptPort}; -use script_task::StackRootTLS; +use script_task::{ScriptTask, ScriptChan, TimerSource, ScriptPort, StackRootTLS, CommonScriptMsg}; use devtools_traits::DevtoolScriptControlMsg; use msg::constellation_msg::PipelineId; @@ -45,17 +44,25 @@ use std::mem::replace; use std::rc::Rc; use std::sync::mpsc::{Sender, Receiver, channel, Select, RecvError}; +/// Messages used to control the worker event loops +pub enum WorkerScriptMsg { + /// Common variants associated with the script messages + Common(CommonScriptMsg), + /// Message sent through Worker.postMessage + DOMMessage(StructuredCloneData), +} + /// A ScriptChan that can be cloned freely and will silently send a TrustedWorkerAddress with -/// every message. While this SendableWorkerScriptChan is alive, the associated Worker object -/// will remain alive. +/// common event loop messages. While this SendableWorkerScriptChan is alive, the associated +/// Worker object will remain alive. #[derive(JSTraceable, Clone)] pub struct SendableWorkerScriptChan { - sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, + sender: Sender<(TrustedWorkerAddress, CommonScriptMsg)>, worker: TrustedWorkerAddress, } impl ScriptChan for SendableWorkerScriptChan { - fn send(&self, msg: ScriptMsg) -> Result<(), ()> { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { return self.sender.send((self.worker.clone(), msg)).map_err(|_| ()); } @@ -67,6 +74,39 @@ impl ScriptChan for SendableWorkerScriptChan { } } +/// A ScriptChan that can be cloned freely and will silently send a TrustedWorkerAddress with +/// worker event loop messages. While this SendableWorkerScriptChan is alive, the associated +/// Worker object will remain alive. +#[derive(JSTraceable, Clone)] +pub struct WorkerThreadWorkerChan { + sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, + worker: TrustedWorkerAddress, +} + +impl ScriptChan for WorkerThreadWorkerChan { + fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { + return self.sender + .send((self.worker.clone(), WorkerScriptMsg::Common(msg))) + .map_err(|_| ()); + } + + fn clone(&self) -> Box<ScriptChan + Send> { + box WorkerThreadWorkerChan { + sender: self.sender.clone(), + worker: self.worker.clone(), + } + } +} + +impl ScriptPort for Receiver<(TrustedWorkerAddress, WorkerScriptMsg)> { + fn recv(&self) -> CommonScriptMsg { + match self.recv().unwrap().1 { + WorkerScriptMsg::Common(script_msg) => script_msg, + WorkerScriptMsg::DOMMessage(_) => panic!("unexpected worker event message!"), + } + } +} + /// Set the `worker` field of a related DedicatedWorkerGlobalScope object to a particular /// value for the duration of this object's lifetime. This ensures that the related Worker /// object only lives as long as necessary (ie. while events are being executed), while @@ -92,18 +132,23 @@ impl<'a> Drop for AutoWorkerReset<'a> { } enum MixedMessage { - FromWorker((TrustedWorkerAddress, ScriptMsg)), + FromWorker((TrustedWorkerAddress, WorkerScriptMsg)), FromDevtools(DevtoolScriptControlMsg), } // https://html.spec.whatwg.org/multipage/#dedicatedworkerglobalscope #[dom_struct] +#[derive(HeapSizeOf)] pub struct DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope, id: PipelineId, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>, - own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, + #[ignore_heap_size_of = "Defined in std"] + receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>, + #[ignore_heap_size_of = "Defined in std"] + own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, + #[ignore_heap_size_of = "Trusted<T> has unclear ownership like JS<T>"] worker: DOMRefCell<Option<TrustedWorkerAddress>>, + #[ignore_heap_size_of = "Can't measure trait objects"] /// Sender to the parent thread. parent_sender: Box<ScriptChan+Send>, } @@ -115,8 +160,8 @@ impl DedicatedWorkerGlobalScope { devtools_port: Receiver<DevtoolScriptControlMsg>, runtime: Rc<Runtime>, parent_sender: Box<ScriptChan+Send>, - own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) + own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, + receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>) -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope::new_inherited( @@ -136,8 +181,8 @@ impl DedicatedWorkerGlobalScope { devtools_port: Receiver<DevtoolScriptControlMsg>, runtime: Rc<Runtime>, parent_sender: Box<ScriptChan+Send>, - own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) + own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, + receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>) -> Root<DedicatedWorkerGlobalScope> { let scope = box DedicatedWorkerGlobalScope::new_inherited( init, worker_url, id, devtools_port, runtime.clone(), parent_sender, @@ -153,8 +198,8 @@ impl DedicatedWorkerGlobalScope { devtools_ipc_port: IpcReceiver<DevtoolScriptControlMsg>, worker: TrustedWorkerAddress, parent_sender: Box<ScriptChan+Send>, - own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, - receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) { + own_sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, + receiver: Receiver<(TrustedWorkerAddress, WorkerScriptMsg)>) { let serialized_worker_url = worker_url.serialize(); spawn_named(format!("WebWorker for {}", serialized_worker_url), move || { task_state::initialize(SCRIPT | IN_WORKER); @@ -165,7 +210,7 @@ impl DedicatedWorkerGlobalScope { let (url, source) = match load_whole_resource(&init.resource_task, worker_url) { Err(_) => { println!("error loading script {}", serialized_worker_url); - parent_sender.send(ScriptMsg::RunnableMsg( + parent_sender.send(CommonScriptMsg::RunnableMsg( box WorkerEventHandler::new(worker))).unwrap(); return; } @@ -196,7 +241,7 @@ impl DedicatedWorkerGlobalScope { while let Ok(event) = global.receive_event() { global.handle_event(event); } - }, reporter_name, parent_sender, ScriptMsg::CollectReports); + }, reporter_name, parent_sender, CommonScriptMsg::CollectReports); }); } } @@ -205,12 +250,12 @@ pub trait DedicatedWorkerGlobalScopeHelpers { fn script_chan(self) -> Box<ScriptChan+Send>; fn pipeline(self) -> PipelineId; fn new_script_pair(self) -> (Box<ScriptChan+Send>, Box<ScriptPort+Send>); - fn process_event(self, msg: ScriptMsg); + fn process_event(self, msg: CommonScriptMsg); } impl<'a> DedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalScope { fn script_chan(self) -> Box<ScriptChan+Send> { - box SendableWorkerScriptChan { + box WorkerThreadWorkerChan { sender: self.own_sender.clone(), worker: self.worker.borrow().as_ref().unwrap().clone(), } @@ -229,13 +274,13 @@ impl<'a> DedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalScope { (chan, box rx) } - fn process_event(self, msg: ScriptMsg) { - self.handle_script_event(msg); + fn process_event(self, msg: CommonScriptMsg) { + self.handle_script_event(WorkerScriptMsg::Common(msg)); } } trait PrivateDedicatedWorkerGlobalScopeHelpers { - fn handle_script_event(self, msg: ScriptMsg); + fn handle_script_event(self, msg: WorkerScriptMsg); fn dispatch_error_to_worker(self, &ErrorEvent); fn receive_event(self) -> Result<MixedMessage, RecvError>; fn handle_event(self, event: MixedMessage); @@ -267,9 +312,9 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalS } } - fn handle_script_event(self, msg: ScriptMsg) { + fn handle_script_event(self, msg: WorkerScriptMsg) { match msg { - ScriptMsg::DOMMessage(data) => { + WorkerScriptMsg::DOMMessage(data) => { let scope = WorkerGlobalScopeCast::from_ref(self); let target = EventTargetCast::from_ref(self); let _ar = JSAutoRequest::new(scope.get_cx()); @@ -278,24 +323,27 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalS data.read(GlobalRef::Worker(scope), message.handle_mut()); MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message.handle()); }, - ScriptMsg::RunnableMsg(runnable) => { + WorkerScriptMsg::Common(CommonScriptMsg::RunnableMsg(runnable)) => { runnable.handler() }, - ScriptMsg::RefcountCleanup(addr) => { + WorkerScriptMsg::Common(CommonScriptMsg::RefcountCleanup(addr)) => { LiveDOMReferences::cleanup(addr); - } - ScriptMsg::FireTimer(TimerSource::FromWorker, timer_id) => { + }, + WorkerScriptMsg::Common( + CommonScriptMsg::FireTimer(TimerSource::FromWorker, timer_id)) => { let scope = WorkerGlobalScopeCast::from_ref(self); scope.handle_fire_timer(timer_id); - } - ScriptMsg::CollectReports(reports_chan) => { + }, + WorkerScriptMsg::Common(CommonScriptMsg::CollectReports(reports_chan)) => { let scope = WorkerGlobalScopeCast::from_ref(self); let cx = scope.get_cx(); let path_seg = format!("url({})", scope.get_url()); let reports = ScriptTask::get_reports(cx, path_seg); reports_chan.send(reports); - } - _ => panic!("Unexpected message"), + }, + WorkerScriptMsg::Common(CommonScriptMsg::FireTimer(_, _)) => { + panic!("obtained a fire timeout from window for the worker!") + }, } } @@ -326,7 +374,7 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalS let line_num = errorevent.Lineno(); let col_num = errorevent.Colno(); let worker = self.worker.borrow().as_ref().unwrap().clone(); - self.parent_sender.send(ScriptMsg::RunnableMsg( + self.parent_sender.send(CommonScriptMsg::RunnableMsg( box WorkerErrorHandler::new(worker, msg, file_name, line_num, col_num))).unwrap(); } } @@ -336,7 +384,7 @@ impl<'a> DedicatedWorkerGlobalScopeMethods for &'a DedicatedWorkerGlobalScope { fn PostMessage(self, cx: *mut JSContext, message: HandleValue) -> ErrorResult { let data = try!(StructuredCloneData::write(cx, message)); let worker = self.worker.borrow().as_ref().unwrap().clone(); - self.parent_sender.send(ScriptMsg::RunnableMsg( + self.parent_sender.send(CommonScriptMsg::RunnableMsg( box WorkerMessageHandler::new(worker, data))).unwrap(); Ok(()) } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 616ca867a2e..dfd0024960e 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -94,6 +94,7 @@ use js::jsapi::{JSContext, JSObject, JSRuntime}; use num::ToPrimitive; use std::iter::FromIterator; use std::borrow::ToOwned; +use std::boxed::FnBox; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::ascii::AsciiExt; @@ -104,7 +105,7 @@ use std::sync::mpsc::channel; use std::rc::Rc; use time; -#[derive(JSTraceable, PartialEq)] +#[derive(JSTraceable, PartialEq, HeapSizeOf)] pub enum IsHTMLDocument { HTMLDocument, NonHTMLDocument, @@ -148,7 +149,7 @@ pub struct Document { /// https://html.spec.whatwg.org/multipage/#list-of-animation-frame-callbacks /// List of animation frame callbacks #[ignore_heap_size_of = "closures are hard"] - animation_frame_list: RefCell<HashMap<i32, Box<Fn(f64)>>>, + animation_frame_list: RefCell<HashMap<i32, Box<FnBox(f64)>>>, /// Tracks all outstanding loads related to this document. loader: DOMRefCell<DocumentLoader>, /// The current active HTML parser, to allow resuming after interruptions. @@ -171,7 +172,7 @@ impl DocumentDerived for EventTarget { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct ImagesFilter; impl CollectionFilter for ImagesFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -179,7 +180,7 @@ impl CollectionFilter for ImagesFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct EmbedsFilter; impl CollectionFilter for EmbedsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -187,7 +188,7 @@ impl CollectionFilter for EmbedsFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct LinksFilter; impl CollectionFilter for LinksFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -196,7 +197,7 @@ impl CollectionFilter for LinksFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct FormsFilter; impl CollectionFilter for FormsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -204,7 +205,7 @@ impl CollectionFilter for FormsFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct ScriptsFilter; impl CollectionFilter for ScriptsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -212,7 +213,7 @@ impl CollectionFilter for ScriptsFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct AnchorsFilter; impl CollectionFilter for AnchorsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -220,7 +221,7 @@ impl CollectionFilter for AnchorsFilter { } } -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] struct AppletsFilter; impl CollectionFilter for AppletsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { @@ -292,7 +293,7 @@ pub trait DocumentHelpers<'a> { fn set_current_script(self, script: Option<&HTMLScriptElement>); fn trigger_mozbrowser_event(self, event: MozBrowserEvent); /// https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe - fn request_animation_frame(self, callback: Box<Fn(f64, )>) -> i32; + fn request_animation_frame(self, callback: Box<FnBox(f64, )>) -> i32; /// https://html.spec.whatwg.org/multipage/#dom-window-cancelanimationframe fn cancel_animation_frame(self, ident: i32); /// https://html.spec.whatwg.org/multipage/#run-the-animation-frame-callbacks @@ -751,7 +752,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { // Build a list of elements that are currently under the mouse. let mouse_over_addresses = self.get_nodes_under_mouse(&point); let mut mouse_over_targets: RootedVec<JS<Node>> = RootedVec::new(); - for node_address in mouse_over_addresses.iter() { + for node_address in &mouse_over_addresses { let node = node::from_untrusted_node_address(js_runtime, *node_address); mouse_over_targets.push(node.r().inclusive_ancestors() .find(|node| node.r().is_element()) @@ -949,7 +950,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { } /// https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe - fn request_animation_frame(self, callback: Box<Fn(f64, )>) -> i32 { + fn request_animation_frame(self, callback: Box<FnBox(f64)>) -> i32 { let window = self.window.root(); let window = window.r(); let ident = self.animation_frame_ident.get() + 1; @@ -969,7 +970,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { /// https://html.spec.whatwg.org/multipage/#dom-window-cancelanimationframe fn cancel_animation_frame(self, ident: i32) { self.animation_frame_list.borrow_mut().remove(&ident); - if self.animation_frame_list.borrow().len() == 0 { + if self.animation_frame_list.borrow().is_empty() { let window = self.window.root(); let window = window.r(); let ConstellationChan(ref chan) = window.constellation_chan(); @@ -1053,6 +1054,7 @@ impl<'a> DocumentHelpers<'a> for &'a Document { } } +#[derive(HeapSizeOf)] pub enum MouseEventType { Click, MouseDown, @@ -1060,7 +1062,7 @@ pub enum MouseEventType { } -#[derive(PartialEq)] +#[derive(PartialEq, HeapSizeOf)] pub enum DocumentSource { FromParser, NotFromParser, @@ -1236,6 +1238,27 @@ impl<'a> DocumentMethods for &'a Document { } } + // https://html.spec.whatwg.org/#dom-document-hasfocus + fn HasFocus(self) -> bool { + let target = self; // Step 1. + let window = self.window.root(); + let window = window.r(); + let browsing_context = window.browsing_context(); + let browsing_context = browsing_context.as_ref(); + + match browsing_context { + Some(browsing_context) => { + let condidate = browsing_context.active_document(); // Step 2. + if condidate.node.get_unique_id() == target.node.get_unique_id() { // Step 3. + true + } else { + false //TODO Step 4. + } + } + None => false + } + } + // https://dom.spec.whatwg.org/#dom-document-documenturi fn DocumentURI(self) -> DOMString { self.URL() @@ -1806,7 +1829,7 @@ impl<'a> DocumentMethods for &'a Document { // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:dom-document-nameditem-filter fn NamedGetter(self, _cx: *mut JSContext, name: DOMString, found: &mut bool) -> *mut JSObject { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct NamedElementFilter { name: Atom, } @@ -1897,6 +1920,7 @@ fn is_scheme_host_port_tuple(url: &Url) -> bool { url.host().is_some() && url.port_or_default().is_some() } +#[derive(HeapSizeOf)] pub enum DocumentProgressTask { DOMContentLoaded, Load, diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index 07baab72224..76dbf0e993a 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -21,6 +21,7 @@ use util::str::DOMString; // https://dom.spec.whatwg.org/#documentfragment #[dom_struct] +#[derive(HeapSizeOf)] pub struct DocumentFragment { node: Node, } diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs index 3de5397c206..2a13acb2fe2 100644 --- a/components/script/dom/documenttype.rs +++ b/components/script/dom/documenttype.rs @@ -18,6 +18,7 @@ use std::borrow::ToOwned; // https://dom.spec.whatwg.org/#documenttype /// The `DOCTYPE` tag. #[dom_struct] +#[derive(HeapSizeOf)] pub struct DocumentType { node: Node, name: DOMString, diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index e724b0bcafb..7ac87ce61c4 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -13,7 +13,7 @@ use util::str::DOMString; use std::borrow::ToOwned; #[repr(u16)] -#[derive(JSTraceable, Copy, Clone, Debug)] +#[derive(JSTraceable, Copy, Clone, Debug, HeapSizeOf)] pub enum DOMErrorName { IndexSizeError = DOMExceptionConstants::INDEX_SIZE_ERR, HierarchyRequestError = DOMExceptionConstants::HIERARCHY_REQUEST_ERR, @@ -41,6 +41,7 @@ pub enum DOMErrorName { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMException { reflector_: Reflector, code: DOMErrorName, diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index 28b5dccfd40..902e19efbea 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -27,6 +27,7 @@ use std::borrow::ToOwned; // https://dom.spec.whatwg.org/#domimplementation #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMImplementation { reflector_: Reflector, document: JS<Document>, diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index a225817b985..a011db403df 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -21,6 +21,7 @@ use util::str::DOMString; use std::borrow::ToOwned; #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMParser { reflector_: Reflector, window: JS<Window>, //XXXjdm Document instead? diff --git a/components/script/dom/dompoint.rs b/components/script/dom/dompoint.rs index a0cfcf09776..0da4d13d415 100644 --- a/components/script/dom/dompoint.rs +++ b/components/script/dom/dompoint.rs @@ -12,6 +12,7 @@ use dom::dompointreadonly::{DOMPointReadOnly, DOMPointWriteMethods}; // http://dev.w3.org/fxtf/geometry/Overview.html#dompoint #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMPoint { point: DOMPointReadOnly } diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index b0a3d33f5e1..57bc2ae24b7 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -11,6 +11,7 @@ use std::cell::Cell; // http://dev.w3.org/fxtf/geometry/Overview.html#dompointreadonly #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMPointReadOnly { reflector_: Reflector, x: Cell<f64>, diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index 8d54301e39e..a3608d3d865 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -12,6 +12,7 @@ use dom::window::Window; use util::geometry::Au; #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMRect { reflector_: Reflector, top: f32, diff --git a/components/script/dom/domrectlist.rs b/components/script/dom/domrectlist.rs index c016e2354f1..640a07a49c7 100644 --- a/components/script/dom/domrectlist.rs +++ b/components/script/dom/domrectlist.rs @@ -11,6 +11,7 @@ use dom::domrect::DOMRect; use dom::window::Window; #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMRectList { reflector_: Reflector, rects: Vec<JS<DOMRect>>, diff --git a/components/script/dom/domstringmap.rs b/components/script/dom/domstringmap.rs index 254bdccaf5e..fe86d4d4b64 100644 --- a/components/script/dom/domstringmap.rs +++ b/components/script/dom/domstringmap.rs @@ -13,6 +13,7 @@ use dom::htmlelement::{HTMLElement, HTMLElementCustomAttributeHelpers}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMStringMap { reflector_: Reflector, element: JS<HTMLElement>, diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index b77b34cf743..df7dadb2b44 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -19,6 +19,7 @@ use string_cache::Atom; use std::borrow::ToOwned; #[dom_struct] +#[derive(HeapSizeOf)] pub struct DOMTokenList { reflector_: Reflector, element: JS<Element>, @@ -100,7 +101,7 @@ impl<'a> DOMTokenListMethods for &'a DOMTokenList { fn Add(self, tokens: Vec<DOMString>) -> ErrorResult { let element = self.element.root(); let mut atoms = element.r().get_tokenlist_attribute(&self.local_name); - for token in tokens.iter() { + for token in &tokens { let token = try!(self.check_token_exceptions(&token)); if !atoms.iter().any(|atom| *atom == token) { atoms.push(token); @@ -114,7 +115,7 @@ impl<'a> DOMTokenListMethods for &'a DOMTokenList { fn Remove(self, tokens: Vec<DOMString>) -> ErrorResult { let element = self.element.root(); let mut atoms = element.r().get_tokenlist_attribute(&self.local_name); - for token in tokens.iter() { + for token in &tokens { let token = try!(self.check_token_exceptions(&token)); atoms.iter().position(|atom| *atom == token).map(|index| { atoms.remove(index) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 4db26945f2e..8da1c8c9373 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -92,6 +92,7 @@ use std::mem; use std::sync::Arc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Element { node: Node, local_name: Atom, @@ -125,7 +126,7 @@ pub enum ElementTypeId { Element, } -#[derive(PartialEq)] +#[derive(PartialEq, HeapSizeOf)] pub enum ElementCreator { ParserCreated, ScriptCreated, @@ -562,7 +563,7 @@ impl LayoutElementHelpers for LayoutJS<Element> { } } -#[derive(PartialEq, Eq, Copy, Clone)] +#[derive(PartialEq, Eq, Copy, Clone, HeapSizeOf)] pub enum StylePriority { Important, Normal, @@ -712,7 +713,7 @@ impl<'a> ElementHelpers<'a> for &'a Element { let (from, to) = if style_priority == StylePriority::Important { (&mut declarations.normal, &mut declarations.important) } else { - (&mut declarations.normal, &mut declarations.important) + (&mut declarations.important, &mut declarations.normal) }; // Usually, the reference counts of `from` and `to` will be 1 here. But transitions diff --git a/components/script/dom/errorevent.rs b/components/script/dom/errorevent.rs index 4efc449b364..ee9d5178d30 100644 --- a/components/script/dom/errorevent.rs +++ b/components/script/dom/errorevent.rs @@ -22,12 +22,14 @@ use std::cell::Cell; use js::jsval::JSVal; #[dom_struct] +#[derive(HeapSizeOf)] pub struct ErrorEvent { event: Event, message: DOMRefCell<DOMString>, filename: DOMRefCell<DOMString>, lineno: Cell<u32>, colno: Cell<u32>, + #[ignore_heap_size_of = "Defined in rust-mozjs"] error: MutHeapJSVal, } diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index a6a83e2ea5d..43250102b5d 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -20,6 +20,7 @@ use time; #[derive(JSTraceable, Copy, Clone)] #[repr(u16)] +#[derive(HeapSizeOf)] pub enum EventPhase { None = EventConstants::NONE, Capturing = EventConstants::CAPTURING_PHASE, @@ -27,7 +28,7 @@ pub enum EventPhase { Bubbling = EventConstants::BUBBLING_PHASE, } -#[derive(JSTraceable, PartialEq)] +#[derive(JSTraceable, PartialEq, HeapSizeOf)] pub enum EventTypeId { CustomEvent, HTMLEvent, @@ -41,19 +42,20 @@ pub enum EventTypeId { CloseEvent } -#[derive(PartialEq)] +#[derive(PartialEq, HeapSizeOf)] pub enum EventBubbles { Bubbles, DoesNotBubble } -#[derive(PartialEq)] +#[derive(PartialEq, HeapSizeOf)] pub enum EventCancelable { Cancelable, NotCancelable } #[dom_struct] +#[derive(HeapSizeOf)] pub struct Event { reflector_: Reflector, type_id: EventTypeId, diff --git a/components/script/dom/eventdispatcher.rs b/components/script/dom/eventdispatcher.rs index 0c6c7e14b18..a99acb7b911 100644 --- a/components/script/dom/eventdispatcher.rs +++ b/components/script/dom/eventdispatcher.rs @@ -45,7 +45,7 @@ pub fn dispatch_event<'a, 'b>(target: &'a EventTarget, let stopped = match cur_target.get_listeners_for(&type_, ListenerPhase::Capturing) { Some(listeners) => { event.set_current_target(cur_target); - for listener in listeners.iter() { + for listener in &listeners { // Explicitly drop any exception on the floor. let _ = listener.HandleEvent_(*cur_target, event, Report); @@ -90,7 +90,7 @@ pub fn dispatch_event<'a, 'b>(target: &'a EventTarget, let stopped = match cur_target.get_listeners_for(&type_, ListenerPhase::Bubbling) { Some(listeners) => { event.set_current_target(cur_target); - for listener in listeners.iter() { + for listener in &listeners { // Explicitly drop any exception on the floor. let _ = listener.HandleEvent_(*cur_target, event, Report); diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index f5cc0806c64..563c60bc9b3 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -11,6 +11,7 @@ use dom::blob::{Blob, BlobTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct File { blob: Blob, name: DOMString, diff --git a/components/script/dom/filelist.rs b/components/script/dom/filelist.rs index 75e06d026d5..b6a650cee65 100644 --- a/components/script/dom/filelist.rs +++ b/components/script/dom/filelist.rs @@ -12,6 +12,7 @@ use dom::window::Window; // https://w3c.github.io/FileAPI/#dfn-filelist #[dom_struct] +#[derive(HeapSizeOf)] pub struct FileList { reflector_: Reflector, list: Vec<JS<File>> diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 2e0cec633ed..4b8721a21e6 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -22,14 +22,14 @@ use encoding::types::{EncodingRef, DecoderTrap}; use encoding::label::encoding_from_whatwg_label; use hyper::mime::{Mime, Attr}; use std::sync::mpsc; -use script_task::{ScriptChan, ScriptMsg, Runnable, ScriptPort}; +use script_task::{ScriptChan, Runnable, ScriptPort, CommonScriptMsg}; use std::cell::{Cell, RefCell}; use std::sync::mpsc::Receiver; use util::str::DOMString; use util::task::spawn_named; use rustc_serialize::base64::{Config, ToBase64, CharacterSet, Newline}; -#[derive(PartialEq, Clone, Copy, JSTraceable)] +#[derive(PartialEq, Clone, Copy, JSTraceable, HeapSizeOf)] pub enum FileReaderFunction { ReadAsText, ReadAsDataUrl, @@ -37,7 +37,7 @@ pub enum FileReaderFunction { pub type TrustedFileReader = Trusted<FileReader>; -#[derive(Clone)] +#[derive(Clone, HeapSizeOf)] pub struct ReadMetaData { pub blobtype: DOMString, pub label: Option<DOMString>, @@ -55,11 +55,11 @@ impl ReadMetaData { } } -#[derive(PartialEq, Clone, Copy, JSTraceable)] +#[derive(PartialEq, Clone, Copy, JSTraceable, HeapSizeOf)] pub struct GenerationId(u32); #[repr(u16)] -#[derive(Copy, Clone, Debug, PartialEq, JSTraceable)] +#[derive(Copy, Clone, Debug, PartialEq, JSTraceable, HeapSizeOf)] pub enum FileReaderReadyState { Empty = FileReaderConstants::EMPTY, Loading = FileReaderConstants::LOADING, @@ -67,6 +67,7 @@ pub enum FileReaderReadyState { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct FileReader { eventtarget: EventTarget, global: GlobalField, @@ -407,22 +408,22 @@ fn perform_annotated_read_operation(gen_id: GenerationId, data: ReadMetaData, bl let chan = &script_chan; // Step 4 let task = box FileReaderEvent::ProcessRead(filereader.clone(), gen_id); - chan.send(ScriptMsg::RunnableMsg(task)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); let task = box FileReaderEvent::ProcessReadData(filereader.clone(), gen_id, DOMString::new()); - chan.send(ScriptMsg::RunnableMsg(task)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); let bytes = match blob_contents.recv() { Ok(bytes) => bytes, Err(_) => { let task = box FileReaderEvent::ProcessReadError(filereader, gen_id, DOMErrorName::NotFoundError); - chan.send(ScriptMsg::RunnableMsg(task)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); return; } }; let task = box FileReaderEvent::ProcessReadEOF(filereader, gen_id, data, bytes); - chan.send(ScriptMsg::RunnableMsg(task)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); } diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 5b7f497b8f3..ff2b6d78fdc 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -23,12 +23,14 @@ use std::collections::hash_map::Entry::{Occupied, Vacant}; #[derive(JSTraceable, Clone)] #[must_root] +#[derive(HeapSizeOf)] pub enum FormDatum { StringData(DOMString), FileData(JS<File>) } #[dom_struct] +#[derive(HeapSizeOf)] pub struct FormData { reflector_: Reflector, data: DOMRefCell<HashMap<DOMString, Vec<FormDatum>>>, diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index b47d799c8ae..8b539c6b4f0 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -33,6 +33,7 @@ use url::UrlParser; use std::default::Default; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLAnchorElement { htmlelement: HTMLElement, rel_list: MutNullableHeap<JS<DOMTokenList>>, diff --git a/components/script/dom/htmlappletelement.rs b/components/script/dom/htmlappletelement.rs index 108ee71e1bf..ab9db6955dd 100644 --- a/components/script/dom/htmlappletelement.rs +++ b/components/script/dom/htmlappletelement.rs @@ -20,6 +20,7 @@ use string_cache::Atom; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLAppletElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index 3af940f5d8b..ee93a27c67f 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -22,6 +22,7 @@ use string_cache::Atom; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLAreaElement { htmlelement: HTMLElement, rel_list: MutNullableHeap<JS<DOMTokenList>>, diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs index 8b7c86a3fe4..10872b6e83b 100644 --- a/components/script/dom/htmlaudioelement.rs +++ b/components/script/dom/htmlaudioelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLAudioElement { htmlmediaelement: HTMLMediaElement } diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index 98799a44a89..5a7c0a6d611 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -19,6 +19,7 @@ use util::str::DOMString; use url::{Url, UrlParser}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLBaseElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 3c5b01bc6c7..b886c9e91ec 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -35,6 +35,7 @@ use time; const INITIAL_REFLOW_DELAY: u64 = 200_000_000; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLBodyElement { htmlelement: HTMLElement, background_color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs index 8050a3fdef8..962fcc54837 100644 --- a/components/script/dom/htmlbrelement.rs +++ b/components/script/dom/htmlbrelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLBRElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 927ac9688c7..b1cc150fe52 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -29,6 +29,7 @@ use std::cell::Cell; #[derive(JSTraceable, PartialEq, Copy, Clone)] #[allow(dead_code)] +#[derive(HeapSizeOf)] enum ButtonType { ButtonSubmit, ButtonReset, @@ -37,6 +38,7 @@ enum ButtonType { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLButtonElement { htmlelement: HTMLElement, button_type: Cell<ButtonType> diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 85adf1b625f..6f307542148 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -38,7 +38,7 @@ const DEFAULT_WIDTH: u32 = 300; const DEFAULT_HEIGHT: u32 = 150; #[must_root] -#[derive(JSTraceable, Clone, Copy)] +#[derive(JSTraceable, Clone, Copy, HeapSizeOf)] pub enum CanvasContext { Context2d(JS<CanvasRenderingContext2D>), WebGL(JS<WebGLRenderingContext>), @@ -47,6 +47,7 @@ pub enum CanvasContext { impl HeapGCValue for CanvasContext {} #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLCanvasElement { htmlelement: HTMLElement, context: MutNullableHeap<CanvasContext>, diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 226c3d58d9f..88414aa6a84 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -30,8 +30,10 @@ pub enum CollectionTypeId { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLCollection { reflector_: Reflector, + #[ignore_heap_size_of = "Contains a trait object; can't measure due to #6870"] collection: CollectionTypeId, } @@ -57,7 +59,7 @@ impl HTMLCollection { fn all_elements(window: &Window, root: &Node, namespace_filter: Option<Namespace>) -> Root<HTMLCollection> { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct AllElementFilter { namespace_filter: Option<Namespace> } @@ -79,7 +81,7 @@ impl HTMLCollection { return HTMLCollection::all_elements(window, root, None); } - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct TagNameFilter { tag: Atom, ascii_lower_tag: Atom, @@ -110,7 +112,7 @@ impl HTMLCollection { if tag == "*" { return HTMLCollection::all_elements(window, root, namespace_filter); } - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct TagNameNSFilter { tag: Atom, namespace_filter: Option<Namespace> @@ -135,7 +137,7 @@ impl HTMLCollection { pub fn by_class_name(window: &Window, root: &Node, classes: DOMString) -> Root<HTMLCollection> { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct ClassNameFilter { classes: Vec<Atom> } @@ -153,7 +155,7 @@ impl HTMLCollection { } pub fn children(window: &Window, root: &Node) -> Root<HTMLCollection> { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct ElementChildFilter; impl CollectionFilter for ElementChildFilter { fn filter(&self, elem: &Element, root: &Node) -> bool { diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs index e63d41f30a8..da5bc60f522 100644 --- a/components/script/dom/htmldataelement.rs +++ b/components/script/dom/htmldataelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDataElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index ee8615edc3b..e4037c8ba47 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -17,6 +17,7 @@ use dom::node::{Node, NodeTypeId, window_from_node}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDataListElement { htmlelement: HTMLElement } @@ -51,7 +52,7 @@ impl HTMLDataListElement { impl<'a> HTMLDataListElementMethods for &'a HTMLDataListElement { // https://html.spec.whatwg.org/multipage/#dom-datalist-options fn Options(self) -> Root<HTMLCollection> { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct HTMLDataListOptionsFilter; impl CollectionFilter for HTMLDataListOptionsFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 98d5e6bbac7..482c92a80e4 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -18,6 +18,7 @@ use util::str::DOMString; use std::borrow::ToOwned; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDialogElement { htmlelement: HTMLElement, return_value: DOMRefCell<DOMString>, diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs index 3f1fcfd4759..916868bf753 100644 --- a/components/script/dom/htmldirectoryelement.rs +++ b/components/script/dom/htmldirectoryelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDirectoryElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs index 21b1e6cacd1..2c2edd0b0d0 100644 --- a/components/script/dom/htmldivelement.rs +++ b/components/script/dom/htmldivelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDivElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs index 6446ac408d2..a582ebd75ce 100644 --- a/components/script/dom/htmldlistelement.rs +++ b/components/script/dom/htmldlistelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLDListElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 2a196073513..e5f8f35221b 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -40,6 +40,7 @@ use std::intrinsics; use std::rc::Rc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLElement { element: Element, style_decl: MutNullableHeap<JS<CSSStyleDeclaration>>, diff --git a/components/script/dom/htmlembedelement.rs b/components/script/dom/htmlembedelement.rs index 6cabca7e80e..9855702e2e5 100644 --- a/components/script/dom/htmlembedelement.rs +++ b/components/script/dom/htmlembedelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLEmbedElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlfieldsetelement.rs b/components/script/dom/htmlfieldsetelement.rs index 0736a0e33c2..55fd44f1c7a 100644 --- a/components/script/dom/htmlfieldsetelement.rs +++ b/components/script/dom/htmlfieldsetelement.rs @@ -22,6 +22,7 @@ use dom::virtualmethods::VirtualMethods; use util::str::{DOMString, StaticStringVec}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLFieldSetElement { htmlelement: HTMLElement } @@ -56,7 +57,7 @@ impl HTMLFieldSetElement { impl<'a> HTMLFieldSetElementMethods for &'a HTMLFieldSetElement { // https://www.whatwg.org/html/#dom-fieldset-elements fn Elements(self) -> Root<HTMLCollection> { - #[derive(JSTraceable)] + #[derive(JSTraceable, HeapSizeOf)] struct ElementsFilter; impl CollectionFilter for ElementsFilter { fn filter<'a>(&self, elem: &'a Element, _root: &'a Node) -> bool { diff --git a/components/script/dom/htmlfontelement.rs b/components/script/dom/htmlfontelement.rs index 6a10967e441..61152a47a00 100644 --- a/components/script/dom/htmlfontelement.rs +++ b/components/script/dom/htmlfontelement.rs @@ -19,6 +19,7 @@ use cssparser::RGBA; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLFontElement { htmlelement: HTMLElement, color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 6d2f620079d..b63037486c0 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -34,7 +34,7 @@ use hyper::header::ContentType; use hyper::mime; use msg::constellation_msg::LoadData; use util::str::DOMString; -use script_task::{ScriptChan, ScriptMsg}; +use script_task::{ScriptChan, MainThreadScriptMsg}; use url::UrlParser; use url::form_urlencoded::serialize; use string_cache::Atom; @@ -43,6 +43,7 @@ use std::borrow::ToOwned; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLFormElement { htmlelement: HTMLElement, marked_for_reset: Cell<bool>, @@ -149,13 +150,13 @@ impl<'a> HTMLFormElementMethods for &'a HTMLFormElement { } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] pub enum SubmittedFrom { FromFormSubmitMethod, NotFromFormSubmitMethod } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] pub enum ResetFrom { FromFormResetMethod, NotFromFormResetMethod @@ -231,7 +232,8 @@ impl<'a> HTMLFormElementHelpers for &'a HTMLFormElement { } // This is wrong. https://html.spec.whatwg.org/multipage/#planned-navigation - win.r().script_chan().send(ScriptMsg::Navigate(win.r().pipeline(), load_data)).unwrap(); + win.r().main_thread_script_chan().send(MainThreadScriptMsg::Navigate( + win.r().pipeline(), load_data)).unwrap(); } fn get_form_dataset<'b>(self, submitter: Option<FormSubmitter<'b>>) -> Vec<FormDatum> { @@ -349,7 +351,7 @@ impl<'a> HTMLFormElementHelpers for &'a HTMLFormElement { // TODO: Handle `dirnames` (needs directionality support) // https://html.spec.whatwg.org/multipage/#the-directionality let mut ret: Vec<FormDatum> = data_set.collect(); - for datum in ret.iter_mut() { + for datum in &mut ret { match &*datum.ty { "file" | "textarea" => (), _ => { @@ -415,27 +417,28 @@ impl<'a> HTMLFormElementHelpers for &'a HTMLFormElement { } // TODO: add file support +#[derive(HeapSizeOf)] pub struct FormDatum { pub ty: DOMString, pub name: DOMString, pub value: DOMString } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] pub enum FormEncType { TextPlainEncoded, UrlEncoded, FormDataEncoded } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] pub enum FormMethod { FormGet, FormPost, FormDialog } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] pub enum FormSubmitter<'a> { FormElement(&'a HTMLFormElement), InputElement(&'a HTMLInputElement), diff --git a/components/script/dom/htmlframeelement.rs b/components/script/dom/htmlframeelement.rs index d9899ba614d..450cabfb293 100644 --- a/components/script/dom/htmlframeelement.rs +++ b/components/script/dom/htmlframeelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLFrameElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index d6f53fb4650..19129e612e2 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLFrameSetElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlheadelement.rs b/components/script/dom/htmlheadelement.rs index 1165501f3ee..bfc46895de7 100644 --- a/components/script/dom/htmlheadelement.rs +++ b/components/script/dom/htmlheadelement.rs @@ -15,6 +15,7 @@ use dom::virtualmethods::VirtualMethods; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLHeadElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlheadingelement.rs b/components/script/dom/htmlheadingelement.rs index 4ec34c65a1e..b339a75a8a4 100644 --- a/components/script/dom/htmlheadingelement.rs +++ b/components/script/dom/htmlheadingelement.rs @@ -12,7 +12,7 @@ use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::node::{Node, NodeTypeId}; use util::str::DOMString; -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] pub enum HeadingLevel { Heading1, Heading2, @@ -23,6 +23,7 @@ pub enum HeadingLevel { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLHeadingElement { htmlelement: HTMLElement, level: HeadingLevel, diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index b04c137e934..6e1c228a7d6 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLHRElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlhtmlelement.rs b/components/script/dom/htmlhtmlelement.rs index 96190c0599c..497ca631e78 100644 --- a/components/script/dom/htmlhtmlelement.rs +++ b/components/script/dom/htmlhtmlelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLHtmlElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index c7c8a240772..978489f3f3b 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -43,6 +43,7 @@ use util::str::{self, LengthOrPercentageOrAuto}; use js::jsapi::{RootedValue, JSAutoRequest, JSAutoCompartment}; use js::jsval::UndefinedValue; +#[derive(HeapSizeOf)] enum SandboxAllowance { AllowNothing = 0x00, AllowSameOrigin = 0x01, @@ -54,6 +55,7 @@ enum SandboxAllowance { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLIFrameElement { htmlelement: HTMLElement, subpage_id: Cell<Option<SubpageId>>, @@ -378,7 +380,7 @@ impl<'a> VirtualMethods for &'a HTMLIFrameElement { &atom!("sandbox") => { let mut modes = SandboxAllowance::AllowNothing as u8; if let Some(ref tokens) = attr.value().tokens() { - for token in tokens.iter() { + for token in *tokens { modes |= match &*token.to_ascii_lowercase() { "allow-same-origin" => SandboxAllowance::AllowSameOrigin, "allow-forms" => SandboxAllowance::AllowForms, @@ -457,4 +459,3 @@ impl<'a> VirtualMethods for &'a HTMLIFrameElement { } } } - diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 82caf25c4f3..ce08c2b7a89 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -23,7 +23,7 @@ use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::node::{document_from_node, Node, NodeTypeId, NodeHelpers, NodeDamage, window_from_node}; use dom::virtualmethods::VirtualMethods; use dom::window::WindowHelpers; -use script_task::{Runnable, ScriptChan, ScriptMsg}; +use script_task::{Runnable, ScriptChan, CommonScriptMsg}; use util::str::DOMString; use string_cache::Atom; @@ -37,6 +37,7 @@ use std::borrow::ToOwned; use std::sync::Arc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLImageElement { htmlelement: HTMLElement, url: DOMRefCell<Option<Url>>, @@ -139,9 +140,9 @@ impl<'a> PrivateHTMLImageElementHelpers for &'a HTMLImageElement { // Return the image via a message to the script task, which marks the element // as dirty and triggers a reflow. let image_response = message.to().unwrap(); - script_chan.send(ScriptMsg::RunnableMsg(box ImageResponseHandlerRunnable::new( - trusted_node.clone(), - image_response))).unwrap(); + script_chan.send(CommonScriptMsg::RunnableMsg( + box ImageResponseHandlerRunnable::new( + trusted_node.clone(), image_response))).unwrap(); }); image_cache.request_image(img_url, @@ -344,4 +345,3 @@ impl<'a> VirtualMethods for &'a HTMLImageElement { } } } - diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 2e883feae1d..f8a6e0a426d 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -46,6 +46,7 @@ const DEFAULT_RESET_VALUE: &'static str = "Reset"; #[derive(JSTraceable, PartialEq, Copy, Clone)] #[allow(dead_code)] +#[derive(HeapSizeOf)] enum InputType { InputSubmit, InputReset, @@ -59,6 +60,7 @@ enum InputType { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLInputElement { htmlelement: HTMLElement, input_type: Cell<InputType>, @@ -68,6 +70,7 @@ pub struct HTMLInputElement { indeterminate: Cell<bool>, value_changed: Cell<bool>, size: Cell<u32>, + #[ignore_heap_size_of = "#7193"] textinput: DOMRefCell<TextInput<ConstellationChan>>, activation_state: DOMRefCell<InputActivationState>, } @@ -80,6 +83,7 @@ impl PartialEq for HTMLInputElement { #[derive(JSTraceable)] #[must_root] +#[derive(HeapSizeOf)] struct InputActivationState { indeterminate: bool, checked: bool, diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs index 45d10e9bf89..4b66644f060 100644 --- a/components/script/dom/htmllabelelement.rs +++ b/components/script/dom/htmllabelelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLLabelElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index 7795af24806..50d67a400d1 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLLegendElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmllielement.rs b/components/script/dom/htmllielement.rs index 658664c82c4..a5f15fefec9 100644 --- a/components/script/dom/htmllielement.rs +++ b/components/script/dom/htmllielement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLLIElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 03c69584d0f..b5012a2b6f3 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -39,6 +39,7 @@ use url::UrlParser; use string_cache::Atom; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLLinkElement { htmlelement: HTMLElement, rel_list: MutNullableHeap<JS<DOMTokenList>>, diff --git a/components/script/dom/htmlmapelement.rs b/components/script/dom/htmlmapelement.rs index 98927d6357c..64b4b7b55a7 100644 --- a/components/script/dom/htmlmapelement.rs +++ b/components/script/dom/htmlmapelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLMapElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 847132c6452..95b7cc5060b 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -11,6 +11,7 @@ use dom::node::NodeTypeId; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLMediaElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 926fbf2c11f..cc2fe60ecbd 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLMetaElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index ee9e556308d..6247b701a87 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLMeterElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlmodelement.rs b/components/script/dom/htmlmodelement.rs index c7888ea2046..446c4b70544 100644 --- a/components/script/dom/htmlmodelement.rs +++ b/components/script/dom/htmlmodelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLModElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 745b7821c55..08406a85ea5 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -25,6 +25,7 @@ use util::str::DOMString; use std::sync::Arc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLObjectElement { htmlelement: HTMLElement, image: DOMRefCell<Option<Arc<Image>>>, diff --git a/components/script/dom/htmlolistelement.rs b/components/script/dom/htmlolistelement.rs index c71028709de..6bf0e106f60 100644 --- a/components/script/dom/htmlolistelement.rs +++ b/components/script/dom/htmlolistelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLOListElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmloptgroupelement.rs b/components/script/dom/htmloptgroupelement.rs index 76f0a3c283e..297a0dcedb8 100644 --- a/components/script/dom/htmloptgroupelement.rs +++ b/components/script/dom/htmloptgroupelement.rs @@ -20,6 +20,7 @@ use dom::virtualmethods::VirtualMethods; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLOptGroupElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs index 28b7f0651ae..93ed56c437e 100644 --- a/components/script/dom/htmloptionelement.rs +++ b/components/script/dom/htmloptionelement.rs @@ -23,6 +23,7 @@ use dom::virtualmethods::VirtualMethods; use util::str::{DOMString, split_html_space_chars}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLOptionElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs index ad7f64e1b75..117294c3b6e 100644 --- a/components/script/dom/htmloutputelement.rs +++ b/components/script/dom/htmloutputelement.rs @@ -15,6 +15,7 @@ use dom::validitystate::ValidityState; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLOutputElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlparagraphelement.rs b/components/script/dom/htmlparagraphelement.rs index 62f7d271c4a..aa5aec990c9 100644 --- a/components/script/dom/htmlparagraphelement.rs +++ b/components/script/dom/htmlparagraphelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLParagraphElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlparamelement.rs b/components/script/dom/htmlparamelement.rs index 2942ccf49ca..5df9ff982ef 100644 --- a/components/script/dom/htmlparamelement.rs +++ b/components/script/dom/htmlparamelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLParamElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlpreelement.rs b/components/script/dom/htmlpreelement.rs index 956301296ef..3fc2fea0387 100644 --- a/components/script/dom/htmlpreelement.rs +++ b/components/script/dom/htmlpreelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLPreElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs index 7449f79dcac..a03dfe8f1e4 100644 --- a/components/script/dom/htmlprogresselement.rs +++ b/components/script/dom/htmlprogresselement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLProgressElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlquoteelement.rs b/components/script/dom/htmlquoteelement.rs index a08f95147e4..c7ad4d75d9a 100644 --- a/components/script/dom/htmlquoteelement.rs +++ b/components/script/dom/htmlquoteelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLQuoteElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index b4c8a5e4946..b2a068e61b0 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -33,7 +33,7 @@ use dom::servohtmlparser::ServoHTMLParserHelpers; use dom::virtualmethods::VirtualMethods; use dom::window::{WindowHelpers, ScriptHelpers}; use network_listener::{NetworkListener, PreInvoke}; -use script_task::{ScriptChan, ScriptMsg, Runnable}; +use script_task::{ScriptChan, Runnable, CommonScriptMsg}; use js::jsapi::RootedValue; use js::jsval::UndefinedValue; @@ -52,6 +52,7 @@ use string_cache::Atom; use url::{Url, UrlParser}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLScriptElement { htmlelement: HTMLElement, @@ -74,6 +75,7 @@ pub struct HTMLScriptElement { /// Document of the parser that created this element parser_document: JS<Document>, + #[ignore_heap_size_of = "Defined in rust-encoding"] /// https://html.spec.whatwg.org/multipage/#concept-script-encoding block_character_encoding: DOMRefCell<EncodingRef>, } @@ -160,6 +162,7 @@ static SCRIPT_JS_MIMES: StaticStringVec = &[ "text/x-javascript", ]; +#[derive(HeapSizeOf)] pub enum ScriptOrigin { Internal(String, Url), External(Result<(Metadata, Vec<u8>), String>), @@ -228,7 +231,7 @@ impl<'a> HTMLScriptElementHelpers for &'a HTMLScriptElement { } // Step 4. let text = self.Text(); - if text.len() == 0 && !element.has_attribute(&atom!("src")) { + if text.is_empty() && !element.has_attribute(&atom!("src")) { return NextParserState::Continue; } // Step 5. @@ -456,7 +459,7 @@ impl<'a> HTMLScriptElementHelpers for &'a HTMLScriptElement { element: handler, is_error: false, }; - chan.send(ScriptMsg::RunnableMsg(dispatcher)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(dispatcher)).unwrap(); } } @@ -469,7 +472,7 @@ impl<'a> HTMLScriptElementHelpers for &'a HTMLScriptElement { element: handler, is_error: true, }; - chan.send(ScriptMsg::RunnableMsg(dispatcher)).unwrap(); + chan.send(CommonScriptMsg::RunnableMsg(dispatcher)).unwrap(); } fn dispatch_before_script_execute_event(self) -> bool { diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs index a24c892335a..f2628f6b882 100644 --- a/components/script/dom/htmlselectelement.rs +++ b/components/script/dom/htmlselectelement.rs @@ -25,6 +25,7 @@ use string_cache::Atom; use std::borrow::ToOwned; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLSelectElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlsourceelement.rs b/components/script/dom/htmlsourceelement.rs index d93eb56f132..5b00feab231 100644 --- a/components/script/dom/htmlsourceelement.rs +++ b/components/script/dom/htmlsourceelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLSourceElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlspanelement.rs b/components/script/dom/htmlspanelement.rs index 8772b143871..8bbad4c20bb 100644 --- a/components/script/dom/htmlspanelement.rs +++ b/components/script/dom/htmlspanelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLSpanElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 22c4c705ccb..a8a989641a0 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -22,6 +22,7 @@ use style::media_queries::parse_media_query_list; use cssparser::Parser as CssParser; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLStyleElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmltablecaptionelement.rs b/components/script/dom/htmltablecaptionelement.rs index 6f6c9223902..ca6ee6037d2 100644 --- a/components/script/dom/htmltablecaptionelement.rs +++ b/components/script/dom/htmltablecaptionelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableCaptionElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 873cbb184e8..6f5d580eee8 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -36,6 +36,7 @@ impl PartialEq for HTMLTableCellElementTypeId { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableCellElement { htmlelement: HTMLElement, background_color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs index 37981cebc2d..ab7f26da579 100644 --- a/components/script/dom/htmltablecolelement.rs +++ b/components/script/dom/htmltablecolelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableColElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmltabledatacellelement.rs b/components/script/dom/htmltabledatacellelement.rs index 684ec8078a4..a26c5da8bbf 100644 --- a/components/script/dom/htmltabledatacellelement.rs +++ b/components/script/dom/htmltabledatacellelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableDataCellElement { htmltablecellelement: HTMLTableCellElement, } diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index 96db990368b..e889716572d 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -27,6 +27,7 @@ use string_cache::Atom; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableElement { htmlelement: HTMLElement, background_color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmltableheadercellelement.rs b/components/script/dom/htmltableheadercellelement.rs index c7aa052eb7d..3bcd41db05d 100644 --- a/components/script/dom/htmltableheadercellelement.rs +++ b/components/script/dom/htmltableheadercellelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableHeaderCellElement { htmltablecellelement: HTMLTableCellElement, } diff --git a/components/script/dom/htmltablerowelement.rs b/components/script/dom/htmltablerowelement.rs index 7ebae106632..5d200eac16f 100644 --- a/components/script/dom/htmltablerowelement.rs +++ b/components/script/dom/htmltablerowelement.rs @@ -18,6 +18,7 @@ use util::str::{self, DOMString}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableRowElement { htmlelement: HTMLElement, background_color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmltablesectionelement.rs b/components/script/dom/htmltablesectionelement.rs index 6c37c0923c3..ceb03aa60ec 100644 --- a/components/script/dom/htmltablesectionelement.rs +++ b/components/script/dom/htmltablesectionelement.rs @@ -18,6 +18,7 @@ use util::str::{self, DOMString}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTableSectionElement { htmlelement: HTMLElement, background_color: Cell<Option<RGBA>>, diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index 2d37dd5593a..ba3250e0744 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTemplateElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 22e843fa08f..9cd91e217bd 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -28,7 +28,7 @@ use dom::node::{NodeHelpers, NodeTypeId, document_from_node, window_from_node}; use textinput::{TextInput, Lines, KeyReaction}; use dom::virtualmethods::VirtualMethods; use dom::window::WindowHelpers; -use script_task::{ScriptMsg, Runnable}; +use script_task::{Runnable, CommonScriptMsg}; use msg::constellation_msg::ConstellationChan; use util::str::DOMString; @@ -38,8 +38,10 @@ use std::borrow::ToOwned; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTextAreaElement { htmlelement: HTMLElement, + #[ignore_heap_size_of = "#7193"] textinput: DOMRefCell<TextInput<ConstellationChan>>, cols: Cell<u32>, rows: Cell<u32>, @@ -366,7 +368,7 @@ impl<'a> VirtualMethods for &'a HTMLTextAreaElement { let dispatcher = ChangeEventRunnable { element: handler, }; - let _ = chan.send(ScriptMsg::RunnableMsg(box dispatcher)); + let _ = chan.send(CommonScriptMsg::RunnableMsg(box dispatcher)); } self.force_relayout(); diff --git a/components/script/dom/htmltimeelement.rs b/components/script/dom/htmltimeelement.rs index 828ba4b912a..37bca69f08d 100644 --- a/components/script/dom/htmltimeelement.rs +++ b/components/script/dom/htmltimeelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTimeElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmltitleelement.rs b/components/script/dom/htmltitleelement.rs index e4f51b03629..edc8c73946f 100644 --- a/components/script/dom/htmltitleelement.rs +++ b/components/script/dom/htmltitleelement.rs @@ -19,6 +19,7 @@ use dom::virtualmethods::VirtualMethods; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTitleElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs index ba13e20ed4d..599a214f1d9 100644 --- a/components/script/dom/htmltrackelement.rs +++ b/components/script/dom/htmltrackelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLTrackElement { htmlelement: HTMLElement, } diff --git a/components/script/dom/htmlulistelement.rs b/components/script/dom/htmlulistelement.rs index 0287757d002..40133f9b365 100644 --- a/components/script/dom/htmlulistelement.rs +++ b/components/script/dom/htmlulistelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLUListElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlunknownelement.rs b/components/script/dom/htmlunknownelement.rs index 33bc8a72cb8..a4f35a35534 100644 --- a/components/script/dom/htmlunknownelement.rs +++ b/components/script/dom/htmlunknownelement.rs @@ -13,6 +13,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLUnknownElement { htmlelement: HTMLElement } diff --git a/components/script/dom/htmlvideoelement.rs b/components/script/dom/htmlvideoelement.rs index b95f683bcd2..1ccd7f8eb0c 100644 --- a/components/script/dom/htmlvideoelement.rs +++ b/components/script/dom/htmlvideoelement.rs @@ -14,6 +14,7 @@ use dom::node::{Node, NodeTypeId}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct HTMLVideoElement { htmlmediaelement: HTMLMediaElement } diff --git a/components/script/dom/imagedata.rs b/components/script/dom/imagedata.rs index 513ef791689..00b725b7b97 100644 --- a/components/script/dom/imagedata.rs +++ b/components/script/dom/imagedata.rs @@ -18,6 +18,7 @@ use std::default::Default; #[dom_struct] #[allow(raw_pointer_derive)] +#[derive(HeapSizeOf)] pub struct ImageData { reflector_: Reflector, width: u32, diff --git a/components/script/dom/keyboardevent.rs b/components/script/dom/keyboardevent.rs index 0153ad214be..ff41ad9ca3c 100644 --- a/components/script/dom/keyboardevent.rs +++ b/components/script/dom/keyboardevent.rs @@ -24,6 +24,7 @@ use std::cell::{RefCell, Cell}; no_jsmanaged_fields!(Key); #[dom_struct] +#[derive(HeapSizeOf)] pub struct KeyboardEvent { uievent: UIEvent, key: Cell<Option<Key>>, @@ -746,6 +747,7 @@ fn key_keycode(key: Key) -> u32 { } } +#[derive(HeapSizeOf)] pub struct KeyEventProperties { pub key_string: &'static str, pub code: &'static str, diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index 69cfb4b7d5b..a3e2a24cb1a 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -16,6 +16,7 @@ use util::str::DOMString; use url::{Url, UrlParser}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Location { reflector_: Reflector, window: JS<Window>, diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index 5d5c2d5112d..a445dd4bcd9 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -22,6 +22,7 @@ use std::borrow::ToOwned; use std::default::Default; #[dom_struct] +#[derive(HeapSizeOf)] pub struct MessageEvent { event: Event, data: Heap<JSVal>, diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index fd3831e535b..a160d7a6c1f 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -20,6 +20,7 @@ use std::cell::Cell; use std::default::Default; #[dom_struct] +#[derive(HeapSizeOf)] pub struct MouseEvent { uievent: UIEvent, screen_x: Cell<i32>, diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index 5f5462c3542..8894764e073 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -16,6 +16,7 @@ use util::str::DOMString; use string_cache::Atom; #[dom_struct] +#[derive(HeapSizeOf)] pub struct NamedNodeMap { reflector_: Reflector, owner: JS<Element>, diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 825ccfdf2e5..c88e2bf3aa5 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -12,6 +12,7 @@ use dom::window::Window; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Navigator { reflector_: Reflector, } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 94a0a1e05c0..ac5b6ac3401 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -40,7 +40,7 @@ use dom::element::{AttributeHandlers, Element, ElementCreator, ElementTypeId}; use dom::element::ElementHelpers; use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::htmlelement::HTMLElementTypeId; -use dom::nodelist::NodeList; +use dom::nodelist::{NodeList, NodeListHelpers}; use dom::processinginstruction::{ProcessingInstruction, ProcessingInstructionHelpers}; use dom::text::Text; use dom::virtualmethods::{VirtualMethods, vtable_for}; @@ -107,6 +107,9 @@ pub struct Node { /// The live list of children return by .childNodes. child_list: MutNullableHeap<JS<NodeList>>, + /// The live count of children of this node. + children_count: Cell<u32>, + /// A bitfield of flags for node items. flags: Cell<NodeFlags>, @@ -200,7 +203,7 @@ impl Drop for Node { /// suppress observers flag /// https://dom.spec.whatwg.org/#concept-node-insert /// https://dom.spec.whatwg.org/#concept-node-remove -#[derive(Copy, Clone)] +#[derive(Copy, Clone, HeapSizeOf)] enum SuppressObserver { Suppressed, Unsuppressed @@ -437,6 +440,7 @@ pub trait NodeHelpers { fn type_id(self) -> NodeTypeId; fn len(self) -> u32; fn index(self) -> u32; + fn children_count(self) -> u32; fn owner_doc(self) -> Root<Document>; fn set_owner_doc(self, document: &Document); @@ -574,7 +578,7 @@ impl<'a> NodeHelpers for &'a Node { NodeTypeId::CharacterData(_) => { CharacterDataCast::to_ref(self).unwrap().Length() }, - _ => self.children().count() as u32 + _ => self.children_count(), } } @@ -583,6 +587,10 @@ impl<'a> NodeHelpers for &'a Node { self.preceding_siblings().count() as u32 } + fn children_count(self) -> u32 { + self.children_count.get() + } + #[inline] fn is_anchor_element(self) -> bool { self.type_id == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) @@ -1083,36 +1091,26 @@ pub fn from_untrusted_node_address(_runtime: *mut JSRuntime, candidate: Untruste } } +#[allow(unsafe_code)] pub trait LayoutNodeHelpers { - #[allow(unsafe_code)] unsafe fn type_id_for_layout(&self) -> NodeTypeId; - #[allow(unsafe_code)] unsafe fn parent_node_ref(&self) -> Option<LayoutJS<Node>>; - #[allow(unsafe_code)] unsafe fn first_child_ref(&self) -> Option<LayoutJS<Node>>; - #[allow(unsafe_code)] unsafe fn last_child_ref(&self) -> Option<LayoutJS<Node>>; - #[allow(unsafe_code)] unsafe fn prev_sibling_ref(&self) -> Option<LayoutJS<Node>>; - #[allow(unsafe_code)] unsafe fn next_sibling_ref(&self) -> Option<LayoutJS<Node>>; - #[allow(unsafe_code)] unsafe fn owner_doc_for_layout(&self) -> LayoutJS<Document>; - #[allow(unsafe_code)] unsafe fn is_element_for_layout(&self) -> bool; - #[allow(unsafe_code)] unsafe fn get_flag(&self, flag: NodeFlags) -> bool; - #[allow(unsafe_code)] unsafe fn set_flag(&self, flag: NodeFlags, value: bool); - #[allow(unsafe_code)] + unsafe fn children_count(&self) -> u32; + unsafe fn layout_data(&self) -> Ref<Option<LayoutData>>; - #[allow(unsafe_code)] unsafe fn layout_data_mut(&self) -> RefMut<Option<LayoutData>>; - #[allow(unsafe_code)] unsafe fn layout_data_unchecked(&self) -> *const Option<LayoutData>; fn get_hover_state_for_layout(&self) -> bool; @@ -1193,6 +1191,12 @@ impl LayoutNodeHelpers for LayoutJS<Node> { #[inline] #[allow(unsafe_code)] + unsafe fn children_count(&self) -> u32 { + (*self.unsafe_get()).children_count.get() + } + + #[inline] + #[allow(unsafe_code)] unsafe fn layout_data(&self) -> Ref<Option<LayoutData>> { (*self.unsafe_get()).layout_data.borrow() } @@ -1451,7 +1455,7 @@ impl Iterator for TreeIterator { } /// Specifies whether children must be recursively cloned or not. -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, HeapSizeOf)] pub enum CloneChildrenFlag { CloneChildren, DoNotCloneChildren @@ -1489,6 +1493,7 @@ impl Node { prev_sibling: Default::default(), owner_doc: MutNullableHeap::new(doc.map(JS::from_ref)), child_list: Default::default(), + children_count: Cell::new(0u32), flags: Cell::new(NodeFlags::new(type_id)), layout_data: LayoutDataRef::new(), @@ -2130,7 +2135,7 @@ impl<'a> NodeMethods for &'a Node { NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => { // Step 1-2. - let node = if value.len() == 0 { + let node = if value.is_empty() { None } else { let document = self.owner_doc(); @@ -2411,7 +2416,7 @@ impl<'a> NodeMethods for &'a Node { } // Step 5. - if this.children().count() != node.children().count() { + if this.children_count() != node.children_count() { return false; } @@ -2564,6 +2569,30 @@ impl<'a> VirtualMethods for &'a Node { let eventtarget: &&EventTarget = EventTargetCast::from_borrowed_ref(self); Some(eventtarget as &VirtualMethods) } + + fn children_changed(&self, mutation: &ChildrenMutation) { + if let Some(ref s) = self.super_type() { + s.children_changed(mutation); + } + match *mutation { + ChildrenMutation::Append { added, .. } | + ChildrenMutation::Insert { added, .. } | + ChildrenMutation::Prepend { added, .. } => { + self.children_count.set( + self.children_count.get() + added.len() as u32); + }, + ChildrenMutation::Replace { added, .. } => { + self.children_count.set( + self.children_count.get() - 1u32 + added.len() as u32); + }, + ChildrenMutation::ReplaceAll { added, .. } => { + self.children_count.set(added.len() as u32); + }, + } + if let Some(list) = self.child_list.get().map(|list| list.root()) { + list.as_children_list().children_changed(mutation); + } + } } pub trait DisabledStateHelpers { @@ -2619,7 +2648,7 @@ impl<'a> DisabledStateHelpers for &'a Node { } /// A summary of the changes that happened to a node. -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, PartialEq, HeapSizeOf)] pub enum NodeDamage { /// The node's `style` attribute changed. NodeStyleDamaged, diff --git a/components/script/dom/nodeiterator.rs b/components/script/dom/nodeiterator.rs index fcee35ed80d..7e641c83cfd 100644 --- a/components/script/dom/nodeiterator.rs +++ b/components/script/dom/nodeiterator.rs @@ -19,12 +19,15 @@ use std::cell::Cell; use std::rc::Rc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct NodeIterator { reflector_: Reflector, root_node: JS<Node>, + #[ignore_heap_size_of = "Defined in rust-mozjs"] reference_node: MutHeap<JS<Node>>, pointer_before_reference_node: Cell<bool>, what_to_show: u32, + #[ignore_heap_size_of = "Can't measure due to #6870"] filter: Filter, } diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs index 35ed6861459..bcf941a6aa0 100644 --- a/components/script/dom/nodelist.rs +++ b/components/script/dom/nodelist.rs @@ -2,23 +2,27 @@ * 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/. */ +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::Bindings::NodeListBinding; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use dom::bindings::global::GlobalRef; -use dom::bindings::js::{JS, Root}; +use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::utils::{Reflector, reflect_dom_object}; -use dom::node::{Node, NodeHelpers}; +use dom::node::{ChildrenMutation, Node, NodeHelpers}; use dom::window::Window; -#[derive(JSTraceable)] +use std::cell::Cell; + +#[derive(JSTraceable, HeapSizeOf)] #[must_root] pub enum NodeListType { Simple(Vec<JS<Node>>), - Children(JS<Node>) + Children(ChildrenList), } // https://dom.spec.whatwg.org/#interface-nodelist #[dom_struct] +#[derive(HeapSizeOf)] pub struct NodeList { reflector_: Reflector, list_type: NodeListType, @@ -45,7 +49,7 @@ impl NodeList { } pub fn new_child_list(window: &Window, node: &Node) -> Root<NodeList> { - NodeList::new(window, NodeListType::Children(JS::from_ref(node))) + NodeList::new(window, NodeListType::Children(ChildrenList::new(node))) } } @@ -54,22 +58,17 @@ impl<'a> NodeListMethods for &'a NodeList { fn Length(self) -> u32 { match self.list_type { NodeListType::Simple(ref elems) => elems.len() as u32, - NodeListType::Children(ref node) => { - let node = node.root(); - node.r().children().count() as u32 - } + NodeListType::Children(ref list) => list.len(), } } // https://dom.spec.whatwg.org/#dom-nodelist-item fn Item(self, index: u32) -> Option<Root<Node>> { match self.list_type { - _ if index >= self.Length() => None, - NodeListType::Simple(ref elems) => Some(elems[index as usize].root()), - NodeListType::Children(ref node) => { - let node = node.root(); - node.r().children().nth(index as usize) - } + NodeListType::Simple(ref elems) => { + elems.get(index as usize).map(|node| Root::from_rooted(*node)) + }, + NodeListType::Children(ref list) => list.item(index), } } @@ -81,3 +80,194 @@ impl<'a> NodeListMethods for &'a NodeList { } } +pub trait NodeListHelpers<'a> { + fn as_children_list(self) -> &'a ChildrenList; +} + +impl<'a> NodeListHelpers<'a> for &'a NodeList { + fn as_children_list(self) -> &'a ChildrenList { + if let NodeListType::Children(ref list) = self.list_type { + list + } else { + panic!("called as_children_list() on a simple node list") + } + } +} + +#[derive(JSTraceable, HeapSizeOf)] +#[must_root] +pub struct ChildrenList { + node: JS<Node>, + #[ignore_heap_size_of = "Defined in rust-mozjs"] + last_visited: MutNullableHeap<JS<Node>>, + last_index: Cell<u32>, +} + +impl ChildrenList { + fn new(node: &Node) -> ChildrenList { + let last_visited = node.GetFirstChild(); + ChildrenList { + node: JS::from_ref(node), + last_visited: + MutNullableHeap::new(last_visited.as_ref().map(JS::from_rooted)), + last_index: Cell::new(0u32), + } + } + + pub fn len(&self) -> u32 { + self.node.root().children_count() + } + + pub fn item(&self, index: u32) -> Option<Root<Node>> { + // This always start traversing the children from the closest element + // among parent's first and last children and the last visited one. + let len = self.len() as u32; + if index >= len { + return None; + } + if index == 0u32 { + // Item is first child if any, not worth updating last visited. + return self.node.root().GetFirstChild(); + } + let last_index = self.last_index.get(); + if index == last_index { + // Item is last visited child, no need to update last visited. + return Some(self.last_visited.get().unwrap().root()); + } + let last_visited = if index - 1u32 == last_index { + // Item is last visited's next sibling. + self.last_visited.get().unwrap().root().GetNextSibling().unwrap() + } else if last_index > 0 && index == last_index - 1u32 { + // Item is last visited's previous sibling. + self.last_visited.get().unwrap().root().GetPreviousSibling().unwrap() + } else if index > last_index { + if index == len - 1u32 { + // Item is parent's last child, not worth updating last visited. + return Some(self.node.root().GetLastChild().unwrap()); + } + if index <= last_index + (len - last_index) / 2u32 { + // Item is closer to the last visited child and follows it. + self.last_visited.get().unwrap().root() + .inclusively_following_siblings() + .nth((index - last_index) as usize).unwrap() + } else { + // Item is closer to parent's last child and obviously + // precedes it. + self.node.root().GetLastChild().unwrap() + .inclusively_preceding_siblings() + .nth((len - index - 1u32) as usize).unwrap() + } + } else if index >= last_index / 2u32 { + // Item is closer to the last visited child and precedes it. + self.last_visited.get().unwrap().root() + .inclusively_preceding_siblings() + .nth((last_index - index) as usize).unwrap() + } else { + // Item is closer to parent's first child and obviously follows it. + debug_assert!(index < last_index / 2u32); + self.node.root().GetFirstChild().unwrap() + .inclusively_following_siblings() + .nth(index as usize) + .unwrap() + }; + self.last_visited.set(Some(JS::from_rooted(&last_visited))); + self.last_index.set(index); + Some(last_visited) + } + + pub fn children_changed(&self, mutation: &ChildrenMutation) { + fn prepend(list: &ChildrenList, added: &[&Node], next: &Node) { + let len = added.len() as u32; + if len == 0u32 { + return; + } + let index = list.last_index.get(); + if index < len { + list.last_visited.set(Some(JS::from_ref(added[index as usize]))); + } else if index / 2u32 >= len { + // If last index is twice as large as the number of added nodes, + // updating only it means that less nodes will be traversed if + // caller is traversing the node list linearly. + list.last_index.set(len + index); + } else { + // If last index is not twice as large but still larger, + // it's better to update it to the number of added nodes. + list.last_visited.set(Some(JS::from_ref(next))); + list.last_index.set(len); + } + } + + fn replace(list: &ChildrenList, + prev: Option<&Node>, + removed: &Node, + added: &[&Node], + next: Option<&Node>) { + let index = list.last_index.get(); + if removed == &*list.last_visited.get().unwrap().root() { + let visited = match (prev, added, next) { + (None, _, None) => { + // Such cases where parent had only one child should + // have been changed into ChildrenMutation::ReplaceAll + // by ChildrenMutation::replace(). + unreachable!() + }, + (_, [node, ..], _) => node, + (_, [], Some(next)) => next, + (Some(prev), [], None) => { + list.last_index.set(index - 1u32); + prev + }, + }; + list.last_visited.set(Some(JS::from_ref(visited))); + } else { + match (prev, next) { + (Some(_), None) => {}, + (None, Some(next)) => { + list.last_index.set(index - 1); + prepend(list, added, next); + }, + (Some(_), Some(_)) => { + list.reset(); + }, + (None, None) => unreachable!(), + } + } + } + + match *mutation { + ChildrenMutation::Append { .. } => {}, + ChildrenMutation::Insert { .. } => { + self.reset(); + }, + ChildrenMutation::Prepend { added, next } => { + prepend(self, added, next); + }, + ChildrenMutation::Replace { prev, removed, added, next } => { + replace(self, prev, removed, added, next); + }, + ChildrenMutation::ReplaceAll { added, .. } => { + let len = added.len(); + let index = self.last_index.get(); + if len == 0 { + self.last_visited.set(None); + self.last_index.set(0u32); + } else if index < len as u32 { + self.last_visited.set(Some(JS::from_ref(added[index as usize]))); + } else { + // Setting last visited to parent's last child serves no purpose, + // so the middle is arbitrarily chosen here in case the caller + // wants random access. + let middle = len / 2; + self.last_visited.set(Some(JS::from_ref(added[middle]))); + self.last_index.set(middle as u32); + } + }, + } + } + + fn reset(&self) { + self.last_visited.set( + self.node.root().GetFirstChild().map(|node| JS::from_rooted(&node))); + self.last_index.set(0u32); + } +} diff --git a/components/script/dom/performance.rs b/components/script/dom/performance.rs index b566d4308fd..71ed3b186ea 100644 --- a/components/script/dom/performance.rs +++ b/components/script/dom/performance.rs @@ -15,6 +15,7 @@ use time; pub type DOMHighResTimeStamp = Finite<f64>; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Performance { reflector_: Reflector, timing: JS<PerformanceTiming>, diff --git a/components/script/dom/performancetiming.rs b/components/script/dom/performancetiming.rs index 9e3a7151f14..d1588f72927 100644 --- a/components/script/dom/performancetiming.rs +++ b/components/script/dom/performancetiming.rs @@ -10,6 +10,7 @@ use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::window::Window; #[dom_struct] +#[derive(HeapSizeOf)] pub struct PerformanceTiming { reflector_: Reflector, navigationStart: u64, diff --git a/components/script/dom/processinginstruction.rs b/components/script/dom/processinginstruction.rs index 41dac86ed04..6b4ae05f592 100644 --- a/components/script/dom/processinginstruction.rs +++ b/components/script/dom/processinginstruction.rs @@ -14,6 +14,7 @@ use util::str::DOMString; /// An HTML processing instruction node. #[dom_struct] +#[derive(HeapSizeOf)] pub struct ProcessingInstruction { characterdata: CharacterData, target: DOMString, diff --git a/components/script/dom/progressevent.rs b/components/script/dom/progressevent.rs index a181ba0c6d6..1dc1f2b9917 100644 --- a/components/script/dom/progressevent.rs +++ b/components/script/dom/progressevent.rs @@ -14,6 +14,7 @@ use dom::event::{Event, EventTypeId, EventBubbles, EventCancelable}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct ProgressEvent { event: Event, length_computable: bool, diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs index c5664874b7d..bf810546be8 100644 --- a/components/script/dom/range.rs +++ b/components/script/dom/range.rs @@ -26,6 +26,7 @@ use std::cmp::{Ord, Ordering, PartialEq, PartialOrd}; use std::rc::Rc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Range { reflector_: Reflector, inner: Rc<RefCell<RangeInner>>, @@ -682,6 +683,7 @@ impl<'a> RangeMethods for &'a Range { #[derive(JSTraceable)] #[must_root] #[privatize] +#[derive(HeapSizeOf)] pub struct RangeInner { start: BoundaryPoint, end: BoundaryPoint, @@ -816,6 +818,7 @@ impl RangeInner { #[derive(JSTraceable)] #[must_root] #[privatize] +#[derive(HeapSizeOf)] pub struct BoundaryPoint { node: JS<Node>, offset: u32, diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs index ff0be321c0c..831fd393670 100644 --- a/components/script/dom/screen.rs +++ b/components/script/dom/screen.rs @@ -10,6 +10,7 @@ use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::window::Window; #[dom_struct] +#[derive(HeapSizeOf)] pub struct Screen { reflector_: Reflector, } diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index a81fe125973..c14603df876 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -36,7 +36,7 @@ use hyper::header::ContentType; use hyper::mime::{Mime, TopLevel, SubLevel}; #[must_root] -#[derive(JSTraceable)] +#[derive(JSTraceable, HeapSizeOf)] pub struct Sink { pub base_url: Option<Url>, pub document: JS<Document>, @@ -157,8 +157,10 @@ impl PreInvoke for ParserContext { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct ServoHTMLParser { reflector_: Reflector, + #[ignore_heap_size_of = "Defined in html5ever"] tokenizer: DOMRefCell<Tokenizer>, /// Input chunks received but not yet passed to the parser. pending_input: DOMRefCell<Vec<String>>, diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 636ceb5fb12..4aced1a1029 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -17,13 +17,13 @@ use ipc_channel::ipc; use util::str::DOMString; use page::IterablePage; use net_traits::storage_task::{StorageTask, StorageTaskMsg, StorageType}; +use script_task::{ScriptTask, MainThreadRunnable, MainThreadScriptMsg}; use std::borrow::ToOwned; use std::sync::mpsc::channel; use url::Url; -use script_task::{ScriptTask, ScriptMsg, MainThreadRunnable}; - #[dom_struct] +#[derive(HeapSizeOf)] pub struct Storage { reflector_: Reflector, global: GlobalField, @@ -147,12 +147,12 @@ impl<'a> PrivateStorageHelpers for &'a Storage { new_value: Option<DOMString>){ let global_root = self.global.root(); let global_ref = global_root.r(); + let main_script_chan = global_ref.as_window().main_thread_script_chan(); let script_chan = global_ref.script_chan(); let trusted_storage = Trusted::new(global_ref.get_cx(), self, script_chan.clone()); - script_chan.send(ScriptMsg::MainThreadRunnableMsg( - box StorageEventRunnable::new(trusted_storage, key, - old_value, new_value))).unwrap(); + main_script_chan.send(MainThreadScriptMsg::MainThreadRunnableMsg( + box StorageEventRunnable::new(trusted_storage, key, old_value, new_value))).unwrap(); } } diff --git a/components/script/dom/storageevent.rs b/components/script/dom/storageevent.rs index 8f722ece866..7fd1c039284 100644 --- a/components/script/dom/storageevent.rs +++ b/components/script/dom/storageevent.rs @@ -17,6 +17,7 @@ use dom::storage::Storage; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct StorageEvent { event: Event, key: DOMRefCell<Option<DOMString>>, diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 567bf7f9bee..d783e876b98 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -30,6 +30,7 @@ use std::ptr; use std::rc::Rc; #[dom_struct] +#[derive(HeapSizeOf)] pub struct TestBinding { reflector_: Reflector, global: GlobalField, diff --git a/components/script/dom/testbindingproxy.rs b/components/script/dom/testbindingproxy.rs index 26d9e6e6611..2d2434e5e38 100644 --- a/components/script/dom/testbindingproxy.rs +++ b/components/script/dom/testbindingproxy.rs @@ -10,6 +10,7 @@ use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct TestBindingProxy { reflector_: Reflector } diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs index acc0f304bf2..e2fed3be09c 100644 --- a/components/script/dom/text.rs +++ b/components/script/dom/text.rs @@ -21,6 +21,7 @@ use util::str::DOMString; /// An HTML text node. #[dom_struct] +#[derive(HeapSizeOf)] pub struct Text { characterdata: CharacterData, } diff --git a/components/script/dom/textdecoder.rs b/components/script/dom/textdecoder.rs index 4b8756afba7..e83d85072b3 100644 --- a/components/script/dom/textdecoder.rs +++ b/components/script/dom/textdecoder.rs @@ -24,8 +24,10 @@ use std::ptr; use std::slice; #[dom_struct] +#[derive(HeapSizeOf)] pub struct TextDecoder { reflector_: Reflector, + #[ignore_heap_size_of = "Defined in rust-encoding"] encoding: EncodingRef, fatal: bool, } diff --git a/components/script/dom/textencoder.rs b/components/script/dom/textencoder.rs index 7fc7370ebdc..29a715a8ed1 100644 --- a/components/script/dom/textencoder.rs +++ b/components/script/dom/textencoder.rs @@ -25,9 +25,11 @@ use js::jsapi::{JSContext, JSObject}; use js::jsapi::{JS_NewUint8Array, JS_GetUint8ArrayData}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct TextEncoder { reflector_: Reflector, encoding: DOMString, + #[ignore_heap_size_of = "Defined in rust-encoding"] encoder: EncodingRef, } diff --git a/components/script/dom/uievent.rs b/components/script/dom/uievent.rs index e3411f35cb8..351a6d39443 100644 --- a/components/script/dom/uievent.rs +++ b/components/script/dom/uievent.rs @@ -21,6 +21,7 @@ use std::default::Default; // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#interface-UIEvent #[dom_struct] +#[derive(HeapSizeOf)] pub struct UIEvent { event: Event, view: MutNullableHeap<JS<Window>>, diff --git a/components/script/dom/url.rs b/components/script/dom/url.rs index 8b94b88b26b..9bbd0f1b5fc 100644 --- a/components/script/dom/url.rs +++ b/components/script/dom/url.rs @@ -17,6 +17,7 @@ use std::borrow::ToOwned; // https://url.spec.whatwg.org/#url #[dom_struct] +#[derive(HeapSizeOf)] pub struct URL { reflector_: Reflector, diff --git a/components/script/dom/urlhelper.rs b/components/script/dom/urlhelper.rs index 4b2f2010fbf..cff468574b2 100644 --- a/components/script/dom/urlhelper.rs +++ b/components/script/dom/urlhelper.rs @@ -9,6 +9,7 @@ use url::{Url, SchemeData}; use std::borrow::ToOwned; use std::fmt::Write; +#[derive(HeapSizeOf)] pub struct UrlHelper; impl UrlHelper { diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index f51440f51df..e4bc0a8b30d 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -18,6 +18,7 @@ use util::str::DOMString; // https://url.spec.whatwg.org/#interface-urlsearchparams #[dom_struct] +#[derive(HeapSizeOf)] pub struct URLSearchParams { reflector_: Reflector, // https://url.spec.whatwg.org/#concept-urlsearchparams-list diff --git a/components/script/dom/validitystate.rs b/components/script/dom/validitystate.rs index 71750f4315f..f14ebddff6f 100644 --- a/components/script/dom/validitystate.rs +++ b/components/script/dom/validitystate.rs @@ -10,6 +10,7 @@ use dom::window::Window; // https://html.spec.whatwg.org/#validitystate #[dom_struct] +#[derive(HeapSizeOf)] pub struct ValidityState { reflector_: Reflector, state: u8, diff --git a/components/script/dom/webglactiveinfo.rs b/components/script/dom/webglactiveinfo.rs index 0e20e230829..671c50c5d36 100644 --- a/components/script/dom/webglactiveinfo.rs +++ b/components/script/dom/webglactiveinfo.rs @@ -11,6 +11,7 @@ use dom::bindings::utils::{Reflector,reflect_dom_object}; use util::str::DOMString; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLActiveInfo { reflector_: Reflector, size: i32, diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index 432caf6276c..5ad078a38e5 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -14,10 +14,12 @@ use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLBuffer { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs index 2a67bb4dbcb..790cb46c3c4 100644 --- a/components/script/dom/webglframebuffer.rs +++ b/components/script/dom/webglframebuffer.rs @@ -14,10 +14,12 @@ use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLFramebuffer { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webglobject.rs b/components/script/dom/webglobject.rs index 82093b64aa7..46ac7d81d80 100644 --- a/components/script/dom/webglobject.rs +++ b/components/script/dom/webglobject.rs @@ -9,6 +9,7 @@ use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::bindings::js::Root; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLObject { reflector_: Reflector, } diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index a61fc22c905..0c93aba3b5b 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -18,12 +18,14 @@ use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLProgram { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, fragment_shader: MutNullableHeap<JS<WebGLShader>>, vertex_shader: MutNullableHeap<JS<WebGLShader>>, + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index cfe3fb21261..ed68e6277be 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -14,10 +14,12 @@ use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLRenderbuffer { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 750edfb8329..0b6fa7b3869 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -50,10 +50,12 @@ macro_rules! handle_potential_webgl_error { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLRenderingContext { reflector_: Reflector, global: GlobalField, renderer_id: usize, + #[ignore_heap_size_of = "Defined in ipc-channel"] ipc_renderer: IpcSender<CanvasMsg>, canvas: JS<HTMLCanvasElement>, last_error: Cell<Option<WebGLError>>, diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index 40c26d40c90..3fe107d9f67 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -17,6 +17,7 @@ use std::cell::Cell; use std::cell::RefCell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLShader { webgl_object: WebGLObject, id: u32, @@ -24,6 +25,7 @@ pub struct WebGLShader { source: RefCell<Option<String>>, is_deleted: Cell<bool>, // TODO(ecoal95): Evaluate moving this to `WebGLObject` + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webglshaderprecisionformat.rs b/components/script/dom/webglshaderprecisionformat.rs index b5d89d735ee..17c3ce97a8c 100644 --- a/components/script/dom/webglshaderprecisionformat.rs +++ b/components/script/dom/webglshaderprecisionformat.rs @@ -10,6 +10,7 @@ use dom::bindings::js::Root; use dom::bindings::utils::{Reflector,reflect_dom_object}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLShaderPrecisionFormat { reflector_: Reflector, range_min: i32, diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index 06664a01f3d..579c196e90a 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -14,10 +14,12 @@ use ipc_channel::ipc::{self, IpcSender}; use std::cell::Cell; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLTexture { webgl_object: WebGLObject, id: u32, is_deleted: Cell<bool>, + #[ignore_heap_size_of = "Defined in ipc-channel"] renderer: IpcSender<CanvasMsg>, } diff --git a/components/script/dom/webgluniformlocation.rs b/components/script/dom/webgluniformlocation.rs index 56a97555ce6..d7f7c836706 100644 --- a/components/script/dom/webgluniformlocation.rs +++ b/components/script/dom/webgluniformlocation.rs @@ -9,6 +9,7 @@ use dom::bindings::js::Root; use dom::bindings::utils::{Reflector,reflect_dom_object}; #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebGLUniformLocation { reflector_: Reflector, id: i32, diff --git a/components/script/dom/webidls/CSSStyleDeclaration.webidl b/components/script/dom/webidls/CSSStyleDeclaration.webidl index 85506b8173c..3444a460441 100644 --- a/components/script/dom/webidls/CSSStyleDeclaration.webidl +++ b/components/script/dom/webidls/CSSStyleDeclaration.webidl @@ -32,176 +32,176 @@ interface CSSStyleDeclaration { }; partial interface CSSStyleDeclaration { - [TreatNullAs=EmptyString] attribute DOMString background; - [TreatNullAs=EmptyString] attribute DOMString backgroundColor; - [TreatNullAs=EmptyString] attribute DOMString backgroundPosition; - [TreatNullAs=EmptyString] attribute DOMString backgroundRepeat; - [TreatNullAs=EmptyString] attribute DOMString backgroundImage; - [TreatNullAs=EmptyString] attribute DOMString backgroundAttachment; - [TreatNullAs=EmptyString] attribute DOMString backgroundSize; - [TreatNullAs=EmptyString] attribute DOMString backgroundOrigin; - [TreatNullAs=EmptyString] attribute DOMString backgroundClip; - - [TreatNullAs=EmptyString] attribute DOMString border; - [TreatNullAs=EmptyString] attribute DOMString borderColor; - [TreatNullAs=EmptyString] attribute DOMString borderRadius; - [TreatNullAs=EmptyString] attribute DOMString borderSpacing; - [TreatNullAs=EmptyString] attribute DOMString borderStyle; - [TreatNullAs=EmptyString] attribute DOMString borderWidth; - [TreatNullAs=EmptyString] attribute DOMString borderBottom; - [TreatNullAs=EmptyString] attribute DOMString borderBottomColor; - [TreatNullAs=EmptyString] attribute DOMString borderBottomLeftRadius; - [TreatNullAs=EmptyString] attribute DOMString borderBottomRightRadius; - [TreatNullAs=EmptyString] attribute DOMString borderBottomStyle; - [TreatNullAs=EmptyString] attribute DOMString borderBottomWidth; - [TreatNullAs=EmptyString] attribute DOMString borderLeft; - [TreatNullAs=EmptyString] attribute DOMString borderLeftColor; - [TreatNullAs=EmptyString] attribute DOMString borderLeftStyle; - [TreatNullAs=EmptyString] attribute DOMString borderLeftWidth; - [TreatNullAs=EmptyString] attribute DOMString borderRight; - [TreatNullAs=EmptyString] attribute DOMString borderRightColor; - [TreatNullAs=EmptyString] attribute DOMString borderRightStyle; - [TreatNullAs=EmptyString] attribute DOMString borderRightWidth; - [TreatNullAs=EmptyString] attribute DOMString borderTop; - [TreatNullAs=EmptyString] attribute DOMString borderTopColor; - [TreatNullAs=EmptyString] attribute DOMString borderTopLeftRadius; - [TreatNullAs=EmptyString] attribute DOMString borderTopRightRadius; - [TreatNullAs=EmptyString] attribute DOMString borderTopStyle; - [TreatNullAs=EmptyString] attribute DOMString borderTopWidth; - - [TreatNullAs=EmptyString] attribute DOMString content; - - [TreatNullAs=EmptyString] attribute DOMString color; - - [TreatNullAs=EmptyString] attribute DOMString display; - - [TreatNullAs=EmptyString] attribute DOMString opacity; - - [TreatNullAs=EmptyString] attribute DOMString visibility; - - [TreatNullAs=EmptyString] attribute DOMString cursor; - - [TreatNullAs=EmptyString] attribute DOMString boxSizing; - [TreatNullAs=EmptyString] attribute DOMString boxShadow; - [TreatNullAs=EmptyString] attribute DOMString textShadow; - - [TreatNullAs=EmptyString] attribute DOMString _float; - - [TreatNullAs=EmptyString] attribute DOMString clear; - - [TreatNullAs=EmptyString] attribute DOMString clip; - - [TreatNullAs=EmptyString] attribute DOMString transform; - [TreatNullAs=EmptyString] attribute DOMString transformOrigin; - [TreatNullAs=EmptyString] attribute DOMString perspective; - [TreatNullAs=EmptyString] attribute DOMString perspectiveOrigin; - [TreatNullAs=EmptyString] attribute DOMString transformStyle; - [TreatNullAs=EmptyString] attribute DOMString backfaceVisibility; - - [TreatNullAs=EmptyString] attribute DOMString direction; - [TreatNullAs=EmptyString] attribute DOMString unicodeBidi; - - [TreatNullAs=EmptyString] attribute DOMString filter; - - [TreatNullAs=EmptyString] attribute DOMString lineHeight; - - [TreatNullAs=EmptyString] attribute DOMString mixBlendMode; - - [TreatNullAs=EmptyString] attribute DOMString verticalAlign; - - [TreatNullAs=EmptyString] attribute DOMString listStyle; - [TreatNullAs=EmptyString] attribute DOMString listStylePosition; - [TreatNullAs=EmptyString] attribute DOMString listStyleType; - [TreatNullAs=EmptyString] attribute DOMString listStyleImage; - - [TreatNullAs=EmptyString] attribute DOMString quotes; - - [TreatNullAs=EmptyString] attribute DOMString counterIncrement; - [TreatNullAs=EmptyString] attribute DOMString counterReset; - - [TreatNullAs=EmptyString] attribute DOMString overflow; - [TreatNullAs=EmptyString] attribute DOMString overflowX; - [TreatNullAs=EmptyString] attribute DOMString overflowY; - [TreatNullAs=EmptyString] attribute DOMString overflowWrap; - - [TreatNullAs=EmptyString] attribute DOMString tableLayout; - [TreatNullAs=EmptyString] attribute DOMString borderCollapse; - [TreatNullAs=EmptyString] attribute DOMString emptyCells; - [TreatNullAs=EmptyString] attribute DOMString captionSide; - - [TreatNullAs=EmptyString] attribute DOMString whiteSpace; - - [TreatNullAs=EmptyString] attribute DOMString writingMode; - - [TreatNullAs=EmptyString] attribute DOMString letterSpacing; - [TreatNullAs=EmptyString] attribute DOMString wordBreak; - [TreatNullAs=EmptyString] attribute DOMString wordSpacing; - [TreatNullAs=EmptyString] attribute DOMString wordWrap; - [TreatNullAs=EmptyString] attribute DOMString textOverflow; - - [TreatNullAs=EmptyString] attribute DOMString textAlign; - [TreatNullAs=EmptyString] attribute DOMString textDecoration; - [TreatNullAs=EmptyString] attribute DOMString textIndent; - [TreatNullAs=EmptyString] attribute DOMString textJustify; - [TreatNullAs=EmptyString] attribute DOMString textOrientation; - [TreatNullAs=EmptyString] attribute DOMString textRendering; - [TreatNullAs=EmptyString] attribute DOMString textTransform; - - [TreatNullAs=EmptyString] attribute DOMString font; - [TreatNullAs=EmptyString] attribute DOMString fontFamily; - [TreatNullAs=EmptyString] attribute DOMString fontSize; - [TreatNullAs=EmptyString] attribute DOMString fontStretch; - [TreatNullAs=EmptyString] attribute DOMString fontStyle; - [TreatNullAs=EmptyString] attribute DOMString fontVariant; - [TreatNullAs=EmptyString] attribute DOMString fontWeight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString background; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundPosition; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundRepeat; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundImage; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundAttachment; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundSize; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundOrigin; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backgroundClip; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString border; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderRadius; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderSpacing; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottom; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottomColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottomLeftRadius; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottomRightRadius; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottomStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderBottomWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderLeft; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderLeftColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderLeftStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderLeftWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderRight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderRightColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderRightStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderRightWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTop; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTopColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTopLeftRadius; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTopRightRadius; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTopStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderTopWidth; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString content; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString color; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString display; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString opacity; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString visibility; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString cursor; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString boxSizing; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString boxShadow; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textShadow; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString _float; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString clear; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString clip; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transform; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transformOrigin; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString perspective; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString perspectiveOrigin; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transformStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString backfaceVisibility; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString direction; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString unicodeBidi; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString filter; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString lineHeight; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString mixBlendMode; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString verticalAlign; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString listStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString listStylePosition; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString listStyleType; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString listStyleImage; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString quotes; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString counterIncrement; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString counterReset; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString overflow; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString overflowX; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString overflowY; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString overflowWrap; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString tableLayout; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString borderCollapse; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString emptyCells; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString captionSide; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString whiteSpace; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString writingMode; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString letterSpacing; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString wordBreak; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString wordSpacing; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString wordWrap; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textOverflow; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textAlign; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textDecoration; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textIndent; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textJustify; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textOrientation; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textRendering; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString textTransform; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString font; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontFamily; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontSize; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontStretch; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontVariant; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString fontWeight; - [TreatNullAs=EmptyString] attribute DOMString margin; - [TreatNullAs=EmptyString] attribute DOMString marginBottom; - [TreatNullAs=EmptyString] attribute DOMString marginLeft; - [TreatNullAs=EmptyString] attribute DOMString marginRight; - [TreatNullAs=EmptyString] attribute DOMString marginTop; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString margin; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString marginBottom; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString marginLeft; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString marginRight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString marginTop; - [TreatNullAs=EmptyString] attribute DOMString padding; - [TreatNullAs=EmptyString] attribute DOMString paddingBottom; - [TreatNullAs=EmptyString] attribute DOMString paddingLeft; - [TreatNullAs=EmptyString] attribute DOMString paddingRight; - [TreatNullAs=EmptyString] attribute DOMString paddingTop; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString padding; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString paddingBottom; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString paddingLeft; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString paddingRight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString paddingTop; - [TreatNullAs=EmptyString] attribute DOMString outline; - [TreatNullAs=EmptyString] attribute DOMString outlineColor; - [TreatNullAs=EmptyString] attribute DOMString outlineStyle; - [TreatNullAs=EmptyString] attribute DOMString outlineWidth; - [TreatNullAs=EmptyString] attribute DOMString outlineOffset; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString outline; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString outlineColor; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString outlineStyle; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString outlineWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString outlineOffset; - [TreatNullAs=EmptyString] attribute DOMString position; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString position; - [TreatNullAs=EmptyString] attribute DOMString pointerEvents; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString pointerEvents; - [TreatNullAs=EmptyString] attribute DOMString top; - [TreatNullAs=EmptyString] attribute DOMString right; - [TreatNullAs=EmptyString] attribute DOMString left; - [TreatNullAs=EmptyString] attribute DOMString bottom; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString top; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString right; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString left; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString bottom; - [TreatNullAs=EmptyString] attribute DOMString height; - [TreatNullAs=EmptyString] attribute DOMString minHeight; - [TreatNullAs=EmptyString] attribute DOMString maxHeight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString height; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString minHeight; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString maxHeight; - [TreatNullAs=EmptyString] attribute DOMString width; - [TreatNullAs=EmptyString] attribute DOMString minWidth; - [TreatNullAs=EmptyString] attribute DOMString maxWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString width; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString minWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString maxWidth; - [TreatNullAs=EmptyString] attribute DOMString zIndex; - - [TreatNullAs=EmptyString] attribute DOMString imageRendering; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString zIndex; + + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString imageRendering; - [TreatNullAs=EmptyString] attribute DOMString columnCount; - [TreatNullAs=EmptyString] attribute DOMString columnWidth; - [TreatNullAs=EmptyString] attribute DOMString columns; - [TreatNullAs=EmptyString] attribute DOMString columnGap; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString columnCount; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString columnWidth; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString columns; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString columnGap; - [TreatNullAs=EmptyString] attribute DOMString transition; - [TreatNullAs=EmptyString] attribute DOMString transitionDuration; - [TreatNullAs=EmptyString] attribute DOMString transitionTimingFunction; - [TreatNullAs=EmptyString] attribute DOMString transitionProperty; - [TreatNullAs=EmptyString] attribute DOMString transitionDelay; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transition; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transitionDuration; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transitionTimingFunction; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transitionProperty; + [SetterThrows, TreatNullAs=EmptyString] attribute DOMString transitionDelay; }; diff --git a/components/script/dom/webidls/CanvasGradient.webidl b/components/script/dom/webidls/CanvasGradient.webidl index abe41d853dc..8db2d9a0289 100644 --- a/components/script/dom/webidls/CanvasGradient.webidl +++ b/components/script/dom/webidls/CanvasGradient.webidl @@ -7,6 +7,7 @@ // [Exposed=(Window,Worker)] interface CanvasGradient { // opaque object + [Throws] void addColorStop(double offset, DOMString color); }; diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index 786d87aef28..b7e61248f85 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -116,7 +116,7 @@ partial /*sealed*/ interface Document { // user interaction readonly attribute Window/*Proxy?*/ defaultView; // readonly attribute Element? activeElement; - // boolean hasFocus(); + boolean hasFocus(); // attribute DOMString designMode; // boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = ""); // boolean queryCommandEnabled(DOMString commandId); diff --git a/components/script/dom/webidls/Node.webidl b/components/script/dom/webidls/Node.webidl index 3aa3d17e4d1..bb118820237 100644 --- a/components/script/dom/webidls/Node.webidl +++ b/components/script/dom/webidls/Node.webidl @@ -52,7 +52,7 @@ interface Node : EventTarget { attribute DOMString? textContent; void normalize(); - Node cloneNode(optional boolean deep = true); + Node cloneNode(optional boolean deep = false); boolean isEqualNode(Node? node); const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01; diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 379f3e1e51c..68ac9bb8b30 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -39,10 +39,10 @@ dictionary TestDictionaryDefaults { unsigned long unsignedLongValue = 7; long long longLongValue = 7; unsigned long long unsignedLongLongValue = 7; - // unrestricted float unrestrictedFloatValue = 7.0; - // float floatValue = 7.0; - // unrestricted double UnrestrictedDoubleValue = 7.0; - // double doubleValue = 7.0; + unrestricted float unrestrictedFloatValue = 7.0; + float floatValue = 7.0; + unrestricted double UnrestrictedDoubleValue = 7.0; + double doubleValue = 7.0; DOMString stringValue = "foo"; USVString usvstringValue = "foo"; TestEnum enumValue = "bar"; @@ -57,10 +57,10 @@ dictionary TestDictionaryDefaults { unsigned long? nullableUnsignedLongValue = 7; long long? nullableLongLongValue = 7; unsigned long long? nullableUnsignedLongLongValue = 7; - // unrestricted float? nullableUnrestrictedFloatValue = 7.0; - // float? nullableFloatValue = 7.0; - // unrestricted double? nullableUnrestrictedDoubleValue = 7.0; - // double? nullableDoubleValue = 7.0; + unrestricted float? nullableUnrestrictedFloatValue = 7.0; + float? nullableFloatValue = 7.0; + unrestricted double? nullableUnrestrictedDoubleValue = 7.0; + double? nullableDoubleValue = 7.0; DOMString? nullableStringValue = "foo"; USVString? nullableUsvstringValue = "foo"; // TestEnum? nullableEnumValue = "bar"; diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 7b8fb8c85c3..61e8b09474d 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -22,8 +22,7 @@ use dom::closeevent::CloseEvent; use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers}; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; -use script_task::Runnable; -use script_task::ScriptMsg; +use script_task::{Runnable, CommonScriptMsg}; use net_traits::hosts::replace_hosts; use util::str::DOMString; @@ -51,7 +50,7 @@ use std::cell::{Cell, RefCell}; use std::ptr; use std::sync::{Arc, Mutex}; -#[derive(JSTraceable, PartialEq, Copy, Clone, Debug)] +#[derive(JSTraceable, PartialEq, Copy, Clone, Debug, HeapSizeOf)] enum WebSocketRequestState { Connecting = 0, Open = 1, @@ -61,17 +60,20 @@ enum WebSocketRequestState { no_jsmanaged_fields!(Sender<WebSocketStream>); +#[derive(HeapSizeOf)] enum MessageData { Text(String), Binary(Vec<u8>), } #[dom_struct] +#[derive(HeapSizeOf)] pub struct WebSocket { eventtarget: EventTarget, url: Url, global: GlobalField, ready_state: Cell<WebSocketRequestState>, + #[ignore_heap_size_of = "Defined in std"] sender: RefCell<Option<Arc<Mutex<Sender<WebSocketStream>>>>>, failed: Cell<bool>, //Flag to tell if websocket was closed due to failure full: Cell<bool>, //Flag to tell if websocket queue is full @@ -181,7 +183,7 @@ impl WebSocket { let task = box CloseTask { addr: address, }; - sender.send(ScriptMsg::RunnableMsg(task)).unwrap(); + sender.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); return; } }; @@ -191,7 +193,7 @@ impl WebSocket { addr: address.clone(), sender: ws_sender.clone(), }; - sender.send(ScriptMsg::RunnableMsg(open_task)).unwrap(); + sender.send(CommonScriptMsg::RunnableMsg(open_task)).unwrap(); for message in receiver.incoming_messages() { let message = match message { @@ -207,7 +209,7 @@ impl WebSocket { let task = box CloseTask { addr: address, }; - sender.send(ScriptMsg::RunnableMsg(task)).unwrap(); + sender.send(CommonScriptMsg::RunnableMsg(task)).unwrap(); break; }, Err(_) => break, @@ -216,7 +218,7 @@ impl WebSocket { address: address.clone(), message: message, }; - sender.send(ScriptMsg::RunnableMsg(message_task)).unwrap(); + sender.send(CommonScriptMsg::RunnableMsg(message_task)).unwrap(); } }); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 7bfdf4e46d4..db047d7a793 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -34,9 +34,9 @@ use dom::storage::Storage; use layout_interface::{ReflowGoal, ReflowQueryType, LayoutRPC, LayoutChan, Reflow, Msg}; use layout_interface::{ContentBoxResponse, ContentBoxesResponse, ResolvedStyleResponse, ScriptReflow}; use page::Page; -use script_task::{TimerSource, ScriptChan, ScriptPort, NonWorkerScriptChan}; -use script_task::ScriptMsg; -use script_traits::ScriptControlChan; +use script_task::{TimerSource, ScriptChan, ScriptPort, MainThreadScriptMsg}; +use script_task::{SendableMainThreadScriptChan, MainThreadScriptChan}; +use script_traits::ConstellationControlMsg; use timers::{IsInterval, TimerId, TimerManager, TimerCallback}; use webdriver_handlers::jsval_to_webdriver; @@ -77,7 +77,7 @@ use std::mem as std_mem; use std::rc::Rc; use std::sync::Arc; use std::sync::mpsc::TryRecvError::{Empty, Disconnected}; -use std::sync::mpsc::{channel, Receiver}; +use std::sync::mpsc::{channel, Receiver, Sender}; use time; /// Current state of the window object @@ -88,7 +88,7 @@ enum WindowState { } /// Extra information concerning the reason for reflowing. -#[derive(Debug)] +#[derive(Debug, HeapSizeOf)] pub enum ReflowReason { CachedPageNeededReflow, RefreshTick, @@ -110,9 +110,9 @@ pub enum ReflowReason { pub struct Window { eventtarget: EventTarget, #[ignore_heap_size_of = "trait objects are hard"] - script_chan: Box<ScriptChan+Send>, + script_chan: MainThreadScriptChan, #[ignore_heap_size_of = "channels are hard"] - control_chan: ScriptControlChan, + control_chan: Sender<ConstellationControlMsg>, console: MutNullableHeap<JS<Console>>, crypto: MutNullableHeap<JS<Crypto>>, navigator: MutNullableHeap<JS<Navigator>>, @@ -236,6 +236,11 @@ impl Window { self.script_chan.clone() } + pub fn main_thread_script_chan(&self) -> &Sender<MainThreadScriptMsg> { + let MainThreadScriptChan(ref sender) = self.script_chan; + sender + } + pub fn image_cache_chan(&self) -> ImageCacheChan { self.image_cache_chan.clone() } @@ -261,11 +266,7 @@ impl Window { pub fn new_script_pair(&self) -> (Box<ScriptChan+Send>, Box<ScriptPort+Send>) { let (tx, rx) = channel(); - (box NonWorkerScriptChan(tx), box rx) - } - - pub fn control_chan<'a>(&'a self) -> &'a ScriptControlChan { - &self.control_chan + (box SendableMainThreadScriptChan(tx), box rx) } pub fn image_cache_task<'a>(&'a self) -> &'a ImageCacheTask { @@ -374,7 +375,7 @@ impl<'a> WindowMethods for &'a Window { // https://html.spec.whatwg.org/multipage/#dom-window-close fn Close(self) { - self.script_chan.send(ScriptMsg::ExitWindow(self.id.clone())).unwrap(); + self.main_thread_script_chan().send(MainThreadScriptMsg::ExitWindow(self.id.clone())).unwrap(); } // https://html.spec.whatwg.org/multipage/#dom-document-0 @@ -891,14 +892,8 @@ impl<'a> WindowHelpers for &'a Window { /// Commence a new URL load which will either replace this window or scroll to a fragment. fn load_url(self, url: Url) { - match url.fragment { - Some(fragment) => { - self.script_chan.send(ScriptMsg::TriggerFragment(self.id, fragment)).unwrap(); - }, - None => { - self.script_chan.send(ScriptMsg::Navigate(self.id, LoadData::new(url))).unwrap(); - } - } + self.main_thread_script_chan().send( + MainThreadScriptMsg::Navigate(self.id, LoadData::new(url))).unwrap(); } fn handle_fire_timer(self, timer_id: TimerId) { @@ -1075,9 +1070,9 @@ impl<'a> WindowHelpers for &'a Window { impl Window { pub fn new(runtime: Rc<Runtime>, page: Rc<Page>, - script_chan: Box<ScriptChan+Send>, + script_chan: MainThreadScriptChan, image_cache_chan: ImageCacheChan, - control_chan: ScriptControlChan, + control_chan: Sender<ConstellationControlMsg>, compositor: ScriptListener, image_cache_task: ImageCacheTask, resource_task: Arc<ResourceTask>, diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 628b1178c32..7ecbcaa864c 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -15,23 +15,22 @@ use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::bindings::js::Root; use dom::window::WindowHelpers; -use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; +use dom::dedicatedworkerglobalscope::{DedicatedWorkerGlobalScope, WorkerScriptMsg}; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers}; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; use dom::workerglobalscope::WorkerGlobalScopeInit; -use script_task::{ScriptChan, ScriptMsg, Runnable}; use devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg}; - -use util::str::DOMString; +use script_task::{ScriptChan, Runnable}; use ipc_channel::ipc; use js::jsapi::{JSContext, HandleValue, RootedValue}; use js::jsapi::{JSAutoRequest, JSAutoCompartment}; use js::jsval::UndefinedValue; use url::UrlParser; +use util::str::DOMString; use std::borrow::ToOwned; use std::sync::mpsc::{channel, Sender}; @@ -40,16 +39,20 @@ pub type TrustedWorkerAddress = Trusted<Worker>; // https://html.spec.whatwg.org/multipage/#worker #[dom_struct] +#[derive(HeapSizeOf)] pub struct Worker { eventtarget: EventTarget, global: GlobalField, + #[ignore_heap_size_of = "Defined in std"] /// Sender to the Receiver associated with the DedicatedWorkerGlobalScope /// this Worker created. - sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, + sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, } impl Worker { - fn new_inherited(global: GlobalRef, sender: Sender<(TrustedWorkerAddress, ScriptMsg)>) -> Worker { + fn new_inherited(global: GlobalRef, + sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>) + -> Worker { Worker { eventtarget: EventTarget::new_inherited(EventTargetTypeId::Worker), global: GlobalField::from_rooted(&global), @@ -57,7 +60,9 @@ impl Worker { } } - pub fn new(global: GlobalRef, sender: Sender<(TrustedWorkerAddress, ScriptMsg)>) -> Root<Worker> { + pub fn new(global: GlobalRef, + sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>) + -> Root<Worker> { reflect_dom_object(box Worker::new_inherited(global, sender), global, WorkerBinding::Wrap) @@ -155,7 +160,7 @@ impl<'a> WorkerMethods for &'a Worker { fn PostMessage(self, cx: *mut JSContext, message: HandleValue) -> ErrorResult { let data = try!(StructuredCloneData::write(cx, message)); let address = Trusted::new(cx, self, self.global.root().r().script_chan().clone()); - self.sender.send((address, ScriptMsg::DOMMessage(data))).unwrap(); + self.sender.send((address, WorkerScriptMsg::DOMMessage(data))).unwrap(); Ok(()) } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 9a56676eb03..80eee7bd3ad 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -17,7 +17,7 @@ use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::workerlocation::WorkerLocation; use dom::workernavigator::WorkerNavigator; use dom::window::{base64_atob, base64_btoa}; -use script_task::{ScriptChan, TimerSource, ScriptPort, ScriptMsg}; +use script_task::{CommonScriptMsg, ScriptChan, TimerSource, ScriptPort}; use timers::{IsInterval, TimerId, TimerManager, TimerCallback}; use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolScriptControlMsg}; @@ -53,25 +53,32 @@ pub struct WorkerGlobalScopeInit { // https://html.spec.whatwg.org/multipage/#the-workerglobalscope-common-interface #[dom_struct] +#[derive(HeapSizeOf)] pub struct WorkerGlobalScope { eventtarget: EventTarget, worker_id: WorkerId, worker_url: Url, + #[ignore_heap_size_of = "Defined in std"] runtime: Rc<Runtime>, next_worker_id: Cell<WorkerId>, + #[ignore_heap_size_of = "Defined in std"] resource_task: ResourceTask, location: MutNullableHeap<JS<WorkerLocation>>, navigator: MutNullableHeap<JS<WorkerNavigator>>, console: MutNullableHeap<JS<Console>>, crypto: MutNullableHeap<JS<Crypto>>, timers: TimerManager, + #[ignore_heap_size_of = "Defined in std"] mem_profiler_chan: mem::ProfilerChan, + #[ignore_heap_size_of = "Defined in ipc-channel"] devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>, + #[ignore_heap_size_of = "Defined in ipc-channel"] /// Optional `IpcSender` for sending the `DevtoolScriptControlMsg` /// to the server from within the worker devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>, + #[ignore_heap_size_of = "Defined in std"] /// This `Receiver` will be ignored later if the corresponding /// `IpcSender` doesn't exist devtools_receiver: Receiver<DevtoolScriptControlMsg>, @@ -80,6 +87,7 @@ pub struct WorkerGlobalScope { /// from the worker devtools_wants_updates: Cell<bool>, + #[ignore_heap_size_of = "Defined in std"] constellation_chan: ConstellationChan, } @@ -283,7 +291,7 @@ pub trait WorkerGlobalScopeHelpers { fn script_chan(self) -> Box<ScriptChan+Send>; fn pipeline(self) -> PipelineId; fn new_script_pair(self) -> (Box<ScriptChan+Send>, Box<ScriptPort+Send>); - fn process_event(self, msg: ScriptMsg); + fn process_event(self, msg: CommonScriptMsg); fn get_cx(self) -> *mut JSContext; fn set_devtools_wants_updates(self, value: bool); } @@ -330,7 +338,7 @@ impl<'a> WorkerGlobalScopeHelpers for &'a WorkerGlobalScope { } } - fn process_event(self, msg: ScriptMsg) { + fn process_event(self, msg: CommonScriptMsg) { let dedicated = DedicatedWorkerGlobalScopeCast::to_ref(self); match dedicated { diff --git a/components/script/dom/workerlocation.rs b/components/script/dom/workerlocation.rs index b125b778822..fa52ce1dcf4 100644 --- a/components/script/dom/workerlocation.rs +++ b/components/script/dom/workerlocation.rs @@ -16,6 +16,7 @@ use util::str::DOMString; // https://html.spec.whatwg.org/multipage/#worker-locations #[dom_struct] +#[derive(HeapSizeOf)] pub struct WorkerLocation { reflector_: Reflector, url: Url, diff --git a/components/script/dom/workernavigator.rs b/components/script/dom/workernavigator.rs index cf7a106034b..f7330f7db69 100644 --- a/components/script/dom/workernavigator.rs +++ b/components/script/dom/workernavigator.rs @@ -13,6 +13,7 @@ use util::str::DOMString; // https://html.spec.whatwg.org/multipage/#workernavigator #[dom_struct] +#[derive(HeapSizeOf)] pub struct WorkerNavigator { reflector_: Reflector, } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 980683114a2..efb42f3c1a0 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -28,7 +28,7 @@ use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTargetTypeId; use dom::xmlhttprequestupload::XMLHttpRequestUpload; use network_listener::{NetworkListener, PreInvoke}; -use script_task::{ScriptChan, ScriptMsg, Runnable, ScriptPort}; +use script_task::{ScriptChan, Runnable, ScriptPort, CommonScriptMsg}; use encoding::all::UTF_8; use encoding::label::encoding_from_whatwg_label; @@ -49,6 +49,7 @@ use net_traits::{ResourceTask, ResourceCORSData, LoadData, LoadConsumer}; use net_traits::{AsyncResponseListener, AsyncResponseTarget, Metadata}; use cors::{allow_cross_origin_request, CORSRequest, RequestMode, AsyncCORSResponseListener}; use cors::CORSResponse; +use util::mem::HeapSizeOf; use util::str::DOMString; use util::task::spawn_named; @@ -69,7 +70,7 @@ use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLS pub type SendParam = StringOrURLSearchParams; -#[derive(JSTraceable, PartialEq, Copy, Clone)] +#[derive(JSTraceable, PartialEq, Copy, Clone, HeapSizeOf)] enum XMLHttpRequestState { Unsent = 0, Opened = 1, @@ -78,7 +79,7 @@ enum XMLHttpRequestState { Done = 4, } -#[derive(JSTraceable, PartialEq, Clone, Copy)] +#[derive(JSTraceable, PartialEq, Clone, Copy, HeapSizeOf)] pub struct GenerationId(u32); /// Closure of required data for each async network event that comprises the @@ -115,6 +116,7 @@ impl XHRProgress { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct XMLHttpRequest { eventtarget: XMLHttpRequestEventTarget, ready_state: Cell<XMLHttpRequestState>, @@ -127,11 +129,13 @@ pub struct XMLHttpRequest { response: DOMRefCell<ByteString>, response_type: Cell<XMLHttpRequestResponseType>, response_xml: MutNullableHeap<JS<Document>>, + #[ignore_heap_size_of = "Defined in hyper"] response_headers: DOMRefCell<Headers>, // Associated concepts request_method: DOMRefCell<Method>, request_url: DOMRefCell<Option<Url>>, + #[ignore_heap_size_of = "Defined in hyper"] request_headers: DOMRefCell<Headers>, request_body_len: Cell<usize>, sync: Cell<bool>, @@ -140,8 +144,10 @@ pub struct XMLHttpRequest { send_flag: Cell<bool>, global: GlobalField, + #[ignore_heap_size_of = "Defined in std"] timeout_cancel: DOMRefCell<Option<Sender<()>>>, fetch_time: Cell<i64>, + #[ignore_heap_size_of = "Cannot calculate Heap size"] timeout_target: DOMRefCell<Option<Box<ScriptChan+Send>>>, generation_id: Cell<GenerationId>, response_status: Cell<Result<(), ()>>, @@ -491,7 +497,7 @@ impl<'a> XMLHttpRequestMethods for &'a XMLHttpRequest { // Step 7 self.upload_complete.set(match extracted { None => true, - Some (ref v) if v.len() == 0 => true, + Some (ref v) if v.is_empty() => true, _ => false }); @@ -1007,7 +1013,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for &'a XMLHttpRequest { sleep_ms(duration_ms); match cancel_rx.try_recv() { Err(TryRecvError::Empty) => { - timeout_target.send(ScriptMsg::RunnableMsg(box XHRTimeout { + timeout_target.send(CommonScriptMsg::RunnableMsg(box XHRTimeout { xhr: xhr, gen_id: gen_id, })).unwrap(); @@ -1032,7 +1038,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for &'a XMLHttpRequest { let mut encoding = UTF_8 as EncodingRef; match self.response_headers.borrow().get() { Some(&ContentType(mime::Mime(_, _, ref params))) => { - for &(ref name, ref value) in params.iter() { + for &(ref name, ref value) in params { if name == &mime::Attr::Charset { encoding = encoding_from_whatwg_label(&value.to_string()).unwrap_or(encoding); } @@ -1054,7 +1060,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for &'a XMLHttpRequest { use hyper::error::Result; // a dummy header so we can use headers.remove::<SetCookie2>() - #[derive(Clone, Debug)] + #[derive(Clone, Debug, HeapSizeOf)] struct SetCookie2; impl Header for SetCookie2 { fn header_name() -> &'static str { diff --git a/components/script/dom/xmlhttprequesteventtarget.rs b/components/script/dom/xmlhttprequesteventtarget.rs index 6b50898ab27..af4b8b8bc50 100644 --- a/components/script/dom/xmlhttprequesteventtarget.rs +++ b/components/script/dom/xmlhttprequesteventtarget.rs @@ -15,6 +15,7 @@ pub enum XMLHttpRequestEventTargetTypeId { } #[dom_struct] +#[derive(HeapSizeOf)] pub struct XMLHttpRequestEventTarget { eventtarget: EventTarget, } diff --git a/components/script/dom/xmlhttprequestupload.rs b/components/script/dom/xmlhttprequestupload.rs index 0c864fdd3c9..02e1b38deae 100644 --- a/components/script/dom/xmlhttprequestupload.rs +++ b/components/script/dom/xmlhttprequestupload.rs @@ -12,6 +12,7 @@ use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTarget; use dom::xmlhttprequesteventtarget::XMLHttpRequestEventTargetTypeId; #[dom_struct] +#[derive(HeapSizeOf)] pub struct XMLHttpRequestUpload { eventtarget: XMLHttpRequestEventTarget } |