diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/js.rs | 2 | ||||
-rw-r--r-- | components/script/dom/bindings/trace.rs | 6 | ||||
-rw-r--r-- | components/script/dom/document.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlcanvaselement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/htmlobjectelement.rs | 5 | ||||
-rw-r--r-- | components/script/dom/htmlstyleelement.rs | 2 | ||||
-rw-r--r-- | components/script/dom/node.rs | 114 | ||||
-rw-r--r-- | components/script/dom/window.rs | 10 |
10 files changed, 93 insertions, 59 deletions
diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index f8ddb80e44b..12ff0aa8823 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -33,7 +33,7 @@ use dom::node::Node; use heapsize::HeapSizeOf; use js::jsapi::{Heap, JSObject, JSTracer}; use js::jsval::JSVal; -use layout_interface::TrustedNodeAddress; +use script_layout_interface::TrustedNodeAddress; use script_thread::STACK_ROOTS; use std::cell::UnsafeCell; use std::default::Default; diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 34ec7d19e14..cd4a0f5d3ca 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -55,7 +55,6 @@ use js::glue::{CallObjectTracer, CallUnbarrieredObjectTracer, CallValueTracer}; use js::jsapi::{GCTraceKindToAscii, Heap, TraceKind, JSObject, JSTracer}; use js::jsval::JSVal; use js::rust::Runtime; -use layout_interface::LayoutRPC; use libc; use msg::constellation_msg::{FrameType, PipelineId, SubpageId, WindowSizeData, WindowSizeType, ReferrerPolicy}; use net_traits::filemanager_thread::SelectedFileId; @@ -67,6 +66,9 @@ use net_traits::{Metadata, NetworkError, ResourceThreads}; use offscreen_gl_context::GLLimits; use profile_traits::mem::ProfilerChan as MemProfilerChan; use profile_traits::time::ProfilerChan as TimeProfilerChan; +use script_layout_interface::OpaqueStyleAndLayoutData; +use script_layout_interface::reporter::CSSErrorReporter; +use script_layout_interface::rpc::LayoutRPC; use script_runtime::ScriptChan; use script_traits::{TimerEventId, TimerSource, TouchpadPressurePhase, UntrustedNodeAddress}; use serde::{Deserialize, Serialize}; @@ -328,6 +330,8 @@ no_jsmanaged_fields!(ReferrerPolicy); no_jsmanaged_fields!(ResourceThreads); no_jsmanaged_fields!(SystemTime); no_jsmanaged_fields!(SelectedFileId); +no_jsmanaged_fields!(OpaqueStyleAndLayoutData); +no_jsmanaged_fields!(CSSErrorReporter); impl JSTraceable for Box<ScriptChan + Send> { #[inline] diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 4dfb484a301..a69537d3c1c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -92,7 +92,6 @@ use html5ever::tree_builder::{LimitedQuirks, NoQuirks, Quirks, QuirksMode}; use ipc_channel::ipc::{self, IpcSender}; use js::jsapi::JS_GetRuntime; use js::jsapi::{JSContext, JSObject, JSRuntime}; -use layout_interface::{Msg, ReflowQueryType}; use msg::constellation_msg::{ALT, CONTROL, SHIFT, SUPER}; use msg::constellation_msg::{Key, KeyModifiers, KeyState}; use msg::constellation_msg::{PipelineId, ReferrerPolicy, SubpageId}; @@ -103,6 +102,7 @@ use net_traits::{AsyncResponseTarget, PendingAsyncLoad, IpcSend}; use num_traits::ToPrimitive; use origin::Origin; use parse::{ParserRoot, ParserRef, MutNullableParserField}; +use script_layout_interface::message::{Msg, ReflowQueryType}; use script_thread::{MainThreadScriptMsg, Runnable}; use script_traits::UntrustedNodeAddress; use script_traits::{AnimationState, MouseButton, MouseEventType, MozBrowserEvent}; diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 95073d49cd3..add54917e6d 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -30,6 +30,7 @@ use ipc_channel::ipc::{self, IpcSender}; use js::jsapi::{HandleValue, JSContext}; use offscreen_gl_context::GLContextAttributes; use rustc_serialize::base64::{STANDARD, ToBase64}; +use script_layout_interface::HTMLCanvasData; use std::iter::repeat; use string_cache::Atom; use style::attr::AttrValue; @@ -92,12 +93,6 @@ impl HTMLCanvasElement { } } -pub struct HTMLCanvasData { - pub ipc_renderer: Option<IpcSender<CanvasMsg>>, - pub width: u32, - pub height: u32, -} - pub trait LayoutHTMLCanvasElementHelpers { fn data(&self) -> HTMLCanvasData; } diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 86146b8e915..22e67d162d9 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -38,9 +38,9 @@ use dom::window::{ReflowReason, Window}; use ipc_channel::ipc; use js::jsapi::{JSAutoCompartment, RootedValue, JSContext, MutableHandleValue}; use js::jsval::{UndefinedValue, NullValue}; -use layout_interface::ReflowQueryType; use msg::constellation_msg::{FrameType, LoadData, NavigationDirection, PipelineId, SubpageId}; use net_traits::response::HttpsState; +use script_layout_interface::message::ReflowQueryType; use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed}; use script_traits::{IFrameLoadInfo, MozBrowserEvent, ScriptMsg as ConstellationMsg}; use std::cell::Cell; diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index 79b6ed32f0b..ab2c2a99887 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -25,9 +25,9 @@ use hyper::header::ContentType; use hyper::mime::{Mime, TopLevel, SubLevel}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; -use layout_interface::Msg; use net_traits::{AsyncResponseListener, AsyncResponseTarget, Metadata, NetworkError}; use network_listener::{NetworkListener, PreInvoke}; +use script_layout_interface::message::Msg; use script_traits::{MozBrowserEvent, ScriptMsg as ConstellationMsg}; use std::ascii::AsciiExt; use std::borrow::ToOwned; diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 268ff17e9cf..13798632e17 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -68,11 +68,6 @@ impl<'a> ProcessDataURL for &'a HTMLObjectElement { } } -pub fn is_image_data(uri: &str) -> bool { - static TYPES: &'static [&'static str] = &["data:image/png", "data:image/gif", "data:image/jpeg"]; - TYPES.iter().any(|&type_| uri.starts_with(type_)) -} - impl HTMLObjectElementMethods for HTMLObjectElement { // https://html.spec.whatwg.org/multipage/#dom-cva-validity fn Validity(&self) -> Root<ValidityState> { diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index c972cb77bb5..47409402855 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -14,7 +14,7 @@ use dom::element::Element; use dom::htmlelement::HTMLElement; use dom::node::{ChildrenMutation, Node, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; -use layout_interface::Msg; +use script_layout_interface::message::Msg; use std::sync::Arc; use string_cache::Atom; use style::media_queries::parse_media_query_list; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index a3289cca56e..53a3f355b9d 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -5,7 +5,6 @@ //! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements. use app_units::Au; -use core::nonzero::NonZero; use devtools_traits::NodeInfo; use document_loader::DocumentLoader; use dom::attr::Attr; @@ -22,8 +21,8 @@ use dom::bindings::codegen::UnionTypes::NodeOrString; use dom::bindings::conversions::{self, DerivedFrom}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; -use dom::bindings::inheritance::{Castable, CharacterDataTypeId}; -use dom::bindings::inheritance::{EventTargetTypeId, NodeTypeId}; +use dom::bindings::inheritance::{Castable, CharacterDataTypeId, ElementTypeId}; +use dom::bindings::inheritance::{EventTargetTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::js::Root; use dom::bindings::js::RootedReference; use dom::bindings::js::{JS, LayoutJS, MutNullableHeap}; @@ -38,7 +37,7 @@ use dom::documenttype::DocumentType; use dom::element::{Element, ElementCreator}; use dom::eventtarget::EventTarget; use dom::htmlbodyelement::HTMLBodyElement; -use dom::htmlcanvaselement::{LayoutHTMLCanvasElementHelpers, HTMLCanvasData}; +use dom::htmlcanvaselement::LayoutHTMLCanvasElementHelpers; use dom::htmlcollection::HTMLCollection; use dom::htmlelement::HTMLElement; use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMethods}; @@ -57,11 +56,13 @@ use euclid::size::Size2D; use heapsize::{HeapSizeOf, heap_size_of}; use html5ever::tree_builder::QuirksMode; use js::jsapi::{JSContext, JSObject, JSRuntime}; -use layout_interface::Msg; use libc::{self, c_void, uintptr_t}; use msg::constellation_msg::PipelineId; use parse::html::parse_html_fragment; use ref_slice::ref_slice; +use script_layout_interface::message::Msg; +use script_layout_interface::{HTMLCanvasData, OpaqueStyleAndLayoutData}; +use script_layout_interface::{LayoutNodeType, LayoutElementType, TrustedNodeAddress}; use script_traits::UntrustedNodeAddress; use selectors::matching::matches; use selectors::parser::Selector; @@ -74,6 +75,7 @@ use std::iter::{self, FilterMap, Peekable}; use std::mem; use std::ops::Range; use string_cache::{Atom, Namespace, QualName}; +use style::dom::OpaqueNode; use style::selector_impl::ServoSelectorImpl; use url::Url; use util::thread_state; @@ -171,7 +173,7 @@ impl NodeFlags { impl Drop for Node { #[allow(unsafe_code)] fn drop(&mut self) { - self.style_and_layout_data.get().map(|d| d.dispose(self)); + self.style_and_layout_data.get().map(|d| self.dispose(d)); } } @@ -184,29 +186,15 @@ enum SuppressObserver { Unsuppressed } -#[derive(Copy, Clone, HeapSizeOf)] -pub struct OpaqueStyleAndLayoutData { - #[ignore_heap_size_of = "TODO(#6910) Box value that should be counted but \ - the type lives in layout"] - pub ptr: NonZero<*mut ()> -} - -#[allow(unsafe_code)] -unsafe impl Send for OpaqueStyleAndLayoutData {} - -no_jsmanaged_fields!(OpaqueStyleAndLayoutData); - -impl OpaqueStyleAndLayoutData { +impl Node { /// Sends the style and layout data, if any, back to the layout thread to be destroyed. - pub fn dispose(self, node: &Node) { + pub fn dispose(&self, data: OpaqueStyleAndLayoutData) { debug_assert!(thread_state::get().is_script()); - let win = window_from_node(node); - node.style_and_layout_data.set(None); - win.layout_chan().send(Msg::ReapStyleAndLayoutData(self)).unwrap(); + let win = window_from_node(self); + self.style_and_layout_data.set(None); + win.layout_chan().send(Msg::ReapStyleAndLayoutData(data)).unwrap(); } -} -impl Node { /// Adds a new child to the end of this node's list of children. /// /// Fails unless `new_child` is disconnected from the tree. @@ -292,7 +280,7 @@ impl Node { for node in child.traverse_preorder() { node.set_flag(IS_IN_DOC, false); vtable_for(&&*node).unbind_from_tree(&context); - node.style_and_layout_data.get().map(|d| d.dispose(&node)); + node.style_and_layout_data.get().map(|d| node.dispose(d)); } self.owner_doc().content_and_heritage_changed(self, NodeDamage::OtherNodeDamage); @@ -340,7 +328,7 @@ impl<'a> Iterator for QuerySelectorIterator { impl Node { pub fn teardown(&self) { - self.style_and_layout_data.get().map(|d| d.dispose(self)); + self.style_and_layout_data.get().map(|d| self.dispose(d)); for kid in self.children() { kid.teardown(); } @@ -974,6 +962,7 @@ pub trait LayoutNodeHelpers { fn image_url(&self) -> Option<Url>; fn canvas_data(&self) -> Option<HTMLCanvasData>; fn iframe_pipeline_id(&self) -> PipelineId; + fn opaque(&self) -> OpaqueNode; } impl LayoutNodeHelpers for LayoutJS<Node> { @@ -1114,6 +1103,13 @@ impl LayoutNodeHelpers for LayoutJS<Node> { .expect("not an iframe element!"); iframe_element.pipeline_id().unwrap() } + + #[allow(unsafe_code)] + fn opaque(&self) -> OpaqueNode { + unsafe { + OpaqueNode(self.get_jsobject() as usize) + } + } } @@ -2413,17 +2409,6 @@ impl NodeMethods for Node { } } - - -/// The address of a node known to be valid. These are sent from script to layout, -/// and are also used in the HTML parser interface. - -#[derive(Clone, PartialEq, Eq, Copy)] -pub struct TrustedNodeAddress(pub *const c_void); - -#[allow(unsafe_code)] -unsafe impl Send for TrustedNodeAddress {} - pub fn document_from_node<T: DerivedFrom<Node> + Reflectable>(derived: &T) -> Root<Document> { derived.upcast().owner_doc() } @@ -2648,3 +2633,56 @@ impl UniqueId { } } } + +impl Into<LayoutNodeType> for NodeTypeId { + #[inline(always)] + fn into(self) -> LayoutNodeType { + match self { + NodeTypeId::CharacterData(CharacterDataTypeId::Comment) => + LayoutNodeType::Comment, + NodeTypeId::Document(..) => + LayoutNodeType::Document, + NodeTypeId::DocumentFragment => + LayoutNodeType::DocumentFragment, + NodeTypeId::DocumentType => + LayoutNodeType::DocumentType, + NodeTypeId::Element(e) => + LayoutNodeType::Element(e.into()), + NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => + LayoutNodeType::ProcessingInstruction, + NodeTypeId::CharacterData(CharacterDataTypeId::Text) => + LayoutNodeType::Text, + } + } +} + +impl Into<LayoutElementType> for ElementTypeId { + #[inline(always)] + fn into(self) -> LayoutElementType { + match self { + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLCanvasElement) => + LayoutElementType::HTMLCanvasElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLIFrameElement) => + LayoutElementType::HTMLIFrameElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLImageElement) => + LayoutElementType::HTMLImageElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement) => + LayoutElementType::HTMLInputElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement) => + LayoutElementType::HTMLObjectElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableCellElement(_)) => + LayoutElementType::HTMLTableCellElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableColElement) => + LayoutElementType::HTMLTableColElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableElement) => + LayoutElementType::HTMLTableElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableRowElement) => + LayoutElementType::HTMLTableRowElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTableSectionElement) => + LayoutElementType::HTMLTableSectionElement, + ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement) => + LayoutElementType::HTMLTextAreaElement, + _ => LayoutElementType::Element, + } + } +} diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 03fbe2b2a2b..58fe8b6ad40 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -31,7 +31,7 @@ use dom::element::Element; use dom::eventtarget::EventTarget; use dom::location::Location; use dom::navigator::Navigator; -use dom::node::{Node, TrustedNodeAddress, from_untrusted_node_address, window_from_node}; +use dom::node::{Node, from_untrusted_node_address, window_from_node}; use dom::performance::Performance; use dom::screen::Screen; use dom::storage::Storage; @@ -42,8 +42,6 @@ use js::jsapi::{Evaluate2, HandleObject, HandleValue, JSAutoCompartment, JSConte use js::jsapi::{JS_GetRuntime, JS_GC, MutableHandleValue, SetWindowProxy}; use js::rust::CompileOptionsWrapper; use js::rust::Runtime; -use layout_interface::{ContentBoxResponse, ContentBoxesResponse, ResolvedStyleResponse, ScriptReflow}; -use layout_interface::{LayoutRPC, Msg, Reflow, ReflowQueryType, MarginStyleResponse}; use libc; use msg::constellation_msg::{FrameType, LoadData, PanicMsg, PipelineId, SubpageId}; use msg::constellation_msg::{WindowSizeData, WindowSizeType}; @@ -57,8 +55,12 @@ use open; use profile_traits::mem; use profile_traits::time::{ProfilerCategory, TimerMetadata, TimerMetadataFrameType}; use profile_traits::time::{ProfilerChan, TimerMetadataReflowType, profile}; -use reporter::CSSErrorReporter; use rustc_serialize::base64::{FromBase64, STANDARD, ToBase64}; +use script_layout_interface::TrustedNodeAddress; +use script_layout_interface::message::{Msg, Reflow, ReflowQueryType, ScriptReflow}; +use script_layout_interface::reporter::CSSErrorReporter; +use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC}; +use script_layout_interface::rpc::{MarginStyleResponse, ResolvedStyleResponse}; use script_runtime::{ScriptChan, ScriptPort}; use script_thread::SendableMainThreadScriptChan; use script_thread::{MainThreadScriptChan, MainThreadScriptMsg, RunnableWrapper}; |