aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/attr.rs4
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py24
-rw-r--r--components/script/dom/bindings/codegen/parser/WebIDL.py5
-rw-r--r--components/script/dom/bindings/error.rs3
-rw-r--r--components/script/dom/bindings/global.rs8
-rw-r--r--components/script/dom/bindings/js.rs3
-rw-r--r--components/script/dom/bindings/refcounted.rs4
-rw-r--r--components/script/dom/bindings/str.rs6
-rw-r--r--components/script/dom/bindings/trace.rs8
-rw-r--r--components/script/dom/bindings/utils.rs4
-rw-r--r--components/script/dom/blob.rs3
-rw-r--r--components/script/dom/canvasgradient.rs23
-rw-r--r--components/script/dom/canvaspattern.rs1
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs6
-rw-r--r--components/script/dom/closeevent.rs1
-rw-r--r--components/script/dom/comment.rs1
-rw-r--r--components/script/dom/console.rs3
-rw-r--r--components/script/dom/crypto.rs1
-rw-r--r--components/script/dom/css.rs1
-rw-r--r--components/script/dom/cssstyledeclaration.rs7
-rw-r--r--components/script/dom/customevent.rs2
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs116
-rw-r--r--components/script/dom/document.rs54
-rw-r--r--components/script/dom/documentfragment.rs1
-rw-r--r--components/script/dom/documenttype.rs1
-rw-r--r--components/script/dom/domexception.rs3
-rw-r--r--components/script/dom/domimplementation.rs1
-rw-r--r--components/script/dom/domparser.rs1
-rw-r--r--components/script/dom/dompoint.rs1
-rw-r--r--components/script/dom/dompointreadonly.rs1
-rw-r--r--components/script/dom/domrect.rs1
-rw-r--r--components/script/dom/domrectlist.rs1
-rw-r--r--components/script/dom/domstringmap.rs1
-rw-r--r--components/script/dom/domtokenlist.rs5
-rw-r--r--components/script/dom/element.rs7
-rw-r--r--components/script/dom/errorevent.rs2
-rw-r--r--components/script/dom/event.rs8
-rw-r--r--components/script/dom/eventdispatcher.rs4
-rw-r--r--components/script/dom/file.rs1
-rw-r--r--components/script/dom/filelist.rs1
-rw-r--r--components/script/dom/filereader.rs19
-rw-r--r--components/script/dom/formdata.rs2
-rw-r--r--components/script/dom/htmlanchorelement.rs1
-rw-r--r--components/script/dom/htmlappletelement.rs1
-rw-r--r--components/script/dom/htmlareaelement.rs1
-rw-r--r--components/script/dom/htmlaudioelement.rs1
-rw-r--r--components/script/dom/htmlbaseelement.rs1
-rw-r--r--components/script/dom/htmlbodyelement.rs1
-rw-r--r--components/script/dom/htmlbrelement.rs1
-rw-r--r--components/script/dom/htmlbuttonelement.rs2
-rw-r--r--components/script/dom/htmlcanvaselement.rs3
-rw-r--r--components/script/dom/htmlcollection.rs12
-rw-r--r--components/script/dom/htmldataelement.rs1
-rw-r--r--components/script/dom/htmldatalistelement.rs3
-rw-r--r--components/script/dom/htmldialogelement.rs1
-rw-r--r--components/script/dom/htmldirectoryelement.rs1
-rw-r--r--components/script/dom/htmldivelement.rs1
-rw-r--r--components/script/dom/htmldlistelement.rs1
-rw-r--r--components/script/dom/htmlelement.rs1
-rw-r--r--components/script/dom/htmlembedelement.rs1
-rw-r--r--components/script/dom/htmlfieldsetelement.rs3
-rw-r--r--components/script/dom/htmlfontelement.rs1
-rw-r--r--components/script/dom/htmlformelement.rs19
-rw-r--r--components/script/dom/htmlframeelement.rs1
-rw-r--r--components/script/dom/htmlframesetelement.rs1
-rw-r--r--components/script/dom/htmlheadelement.rs1
-rw-r--r--components/script/dom/htmlheadingelement.rs3
-rw-r--r--components/script/dom/htmlhrelement.rs1
-rw-r--r--components/script/dom/htmlhtmlelement.rs1
-rw-r--r--components/script/dom/htmliframeelement.rs5
-rw-r--r--components/script/dom/htmlimageelement.rs10
-rw-r--r--components/script/dom/htmlinputelement.rs4
-rw-r--r--components/script/dom/htmllabelelement.rs1
-rw-r--r--components/script/dom/htmllegendelement.rs1
-rw-r--r--components/script/dom/htmllielement.rs1
-rw-r--r--components/script/dom/htmllinkelement.rs1
-rw-r--r--components/script/dom/htmlmapelement.rs1
-rw-r--r--components/script/dom/htmlmediaelement.rs1
-rw-r--r--components/script/dom/htmlmetaelement.rs1
-rw-r--r--components/script/dom/htmlmeterelement.rs1
-rw-r--r--components/script/dom/htmlmodelement.rs1
-rw-r--r--components/script/dom/htmlobjectelement.rs1
-rw-r--r--components/script/dom/htmlolistelement.rs1
-rw-r--r--components/script/dom/htmloptgroupelement.rs1
-rw-r--r--components/script/dom/htmloptionelement.rs1
-rw-r--r--components/script/dom/htmloutputelement.rs1
-rw-r--r--components/script/dom/htmlparagraphelement.rs1
-rw-r--r--components/script/dom/htmlparamelement.rs1
-rw-r--r--components/script/dom/htmlpreelement.rs1
-rw-r--r--components/script/dom/htmlprogresselement.rs1
-rw-r--r--components/script/dom/htmlquoteelement.rs1
-rw-r--r--components/script/dom/htmlscriptelement.rs11
-rw-r--r--components/script/dom/htmlselectelement.rs1
-rw-r--r--components/script/dom/htmlsourceelement.rs1
-rw-r--r--components/script/dom/htmlspanelement.rs1
-rw-r--r--components/script/dom/htmlstyleelement.rs1
-rw-r--r--components/script/dom/htmltablecaptionelement.rs1
-rw-r--r--components/script/dom/htmltablecellelement.rs1
-rw-r--r--components/script/dom/htmltablecolelement.rs1
-rw-r--r--components/script/dom/htmltabledatacellelement.rs1
-rw-r--r--components/script/dom/htmltableelement.rs1
-rw-r--r--components/script/dom/htmltableheadercellelement.rs1
-rw-r--r--components/script/dom/htmltablerowelement.rs1
-rw-r--r--components/script/dom/htmltablesectionelement.rs1
-rw-r--r--components/script/dom/htmltemplateelement.rs1
-rw-r--r--components/script/dom/htmltextareaelement.rs6
-rw-r--r--components/script/dom/htmltimeelement.rs1
-rw-r--r--components/script/dom/htmltitleelement.rs1
-rw-r--r--components/script/dom/htmltrackelement.rs1
-rw-r--r--components/script/dom/htmlulistelement.rs1
-rw-r--r--components/script/dom/htmlunknownelement.rs1
-rw-r--r--components/script/dom/htmlvideoelement.rs1
-rw-r--r--components/script/dom/imagedata.rs1
-rw-r--r--components/script/dom/keyboardevent.rs2
-rw-r--r--components/script/dom/location.rs1
-rw-r--r--components/script/dom/messageevent.rs1
-rw-r--r--components/script/dom/mouseevent.rs1
-rw-r--r--components/script/dom/namednodemap.rs1
-rw-r--r--components/script/dom/navigator.rs1
-rw-r--r--components/script/dom/node.rs69
-rw-r--r--components/script/dom/nodeiterator.rs3
-rw-r--r--components/script/dom/nodelist.rs220
-rw-r--r--components/script/dom/performance.rs1
-rw-r--r--components/script/dom/performancetiming.rs1
-rw-r--r--components/script/dom/processinginstruction.rs1
-rw-r--r--components/script/dom/progressevent.rs1
-rw-r--r--components/script/dom/range.rs3
-rw-r--r--components/script/dom/screen.rs1
-rw-r--r--components/script/dom/servohtmlparser.rs4
-rw-r--r--components/script/dom/storage.rs10
-rw-r--r--components/script/dom/storageevent.rs1
-rw-r--r--components/script/dom/testbinding.rs1
-rw-r--r--components/script/dom/testbindingproxy.rs1
-rw-r--r--components/script/dom/text.rs1
-rw-r--r--components/script/dom/textdecoder.rs2
-rw-r--r--components/script/dom/textencoder.rs2
-rw-r--r--components/script/dom/uievent.rs1
-rw-r--r--components/script/dom/url.rs1
-rw-r--r--components/script/dom/urlhelper.rs1
-rw-r--r--components/script/dom/urlsearchparams.rs1
-rw-r--r--components/script/dom/validitystate.rs1
-rw-r--r--components/script/dom/webglactiveinfo.rs1
-rw-r--r--components/script/dom/webglbuffer.rs2
-rw-r--r--components/script/dom/webglframebuffer.rs2
-rw-r--r--components/script/dom/webglobject.rs1
-rw-r--r--components/script/dom/webglprogram.rs2
-rw-r--r--components/script/dom/webglrenderbuffer.rs2
-rw-r--r--components/script/dom/webglrenderingcontext.rs2
-rw-r--r--components/script/dom/webglshader.rs2
-rw-r--r--components/script/dom/webglshaderprecisionformat.rs1
-rw-r--r--components/script/dom/webgltexture.rs2
-rw-r--r--components/script/dom/webgluniformlocation.rs1
-rw-r--r--components/script/dom/webidls/CSSStyleDeclaration.webidl322
-rw-r--r--components/script/dom/webidls/CanvasGradient.webidl1
-rw-r--r--components/script/dom/webidls/Document.webidl2
-rw-r--r--components/script/dom/webidls/Node.webidl2
-rw-r--r--components/script/dom/webidls/TestBinding.webidl16
-rw-r--r--components/script/dom/websocket.rs16
-rw-r--r--components/script/dom/window.rs41
-rw-r--r--components/script/dom/worker.rs21
-rw-r--r--components/script/dom/workerglobalscope.rs14
-rw-r--r--components/script/dom/workerlocation.rs1
-rw-r--r--components/script/dom/workernavigator.rs1
-rw-r--r--components/script/dom/xmlhttprequest.rs20
-rw-r--r--components/script/dom/xmlhttprequesteventtarget.rs1
-rw-r--r--components/script/dom/xmlhttprequestupload.rs1
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
}