mirror of
https://github.com/servo/servo.git
synced 2025-08-08 06:55:31 +01:00
Auto merge of #11754 - Ms2ger:wrapper-traits-prep2, r=nox
Move ServoLayoutNode and related structs to script. <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11754) <!-- Reviewable:end -->
This commit is contained in:
commit
ee8c5c5a67
51 changed files with 2215 additions and 1840 deletions
|
@ -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;
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
/// Sends the style and layout data, if any, back to the layout thread to be destroyed.
|
||||
pub fn dispose(self, node: &Node) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
impl Node {
|
||||
/// Sends the style and layout data, if any, back to the layout thread to be destroyed.
|
||||
pub fn dispose(&self, data: OpaqueStyleAndLayoutData) {
|
||||
debug_assert!(thread_state::get().is_script());
|
||||
let win = window_from_node(self);
|
||||
self.style_and_layout_data.set(None);
|
||||
win.layout_chan().send(Msg::ReapStyleAndLayoutData(data)).unwrap();
|
||||
}
|
||||
|
||||
/// 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue