mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Auto merge of #26120 - servo:layout-2020-non-opaque-style-data, r=SimonSapin
Remove postorder traversal from layout 2020 during styling
This commit is contained in:
commit
d8781c1054
23 changed files with 208 additions and 269 deletions
|
@ -6,25 +6,14 @@ use crate::construct::ConstructionResult;
|
||||||
use atomic_refcell::AtomicRefCell;
|
use atomic_refcell::AtomicRefCell;
|
||||||
use script_layout_interface::StyleData;
|
use script_layout_interface::StyleData;
|
||||||
|
|
||||||
#[repr(C)]
|
pub struct StyleAndLayoutData<'dom> {
|
||||||
pub struct StyleAndLayoutData {
|
|
||||||
/// The style data associated with a node.
|
/// The style data associated with a node.
|
||||||
pub style_data: StyleData,
|
pub style_data: &'dom StyleData,
|
||||||
/// The layout data associated with a node.
|
/// The layout data associated with a node.
|
||||||
pub layout_data: AtomicRefCell<LayoutData>,
|
pub layout_data: &'dom AtomicRefCell<LayoutData>,
|
||||||
}
|
|
||||||
|
|
||||||
impl StyleAndLayoutData {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {
|
|
||||||
style_data: StyleData::new(),
|
|
||||||
layout_data: AtomicRefCell::new(LayoutData::new()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Data that layout associates with a node.
|
/// Data that layout associates with a node.
|
||||||
#[repr(C)]
|
|
||||||
pub struct LayoutData {
|
pub struct LayoutData {
|
||||||
/// The current results of flow construction for this node. This is either a
|
/// The current results of flow construction for this node. This is either a
|
||||||
/// flow or a `ConstructionItem`. See comments in `construct.rs` for more
|
/// flow or a `ConstructionItem`. See comments in `construct.rs` for more
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
use crate::construct::ConstructionResult;
|
use crate::construct::ConstructionResult;
|
||||||
use crate::context::LayoutContext;
|
use crate::context::LayoutContext;
|
||||||
use crate::data::StyleAndLayoutData;
|
|
||||||
use crate::display_list::items::{DisplayList, OpaqueNode, ScrollOffsetMap};
|
use crate::display_list::items::{DisplayList, OpaqueNode, ScrollOffsetMap};
|
||||||
use crate::display_list::IndexableText;
|
use crate::display_list::IndexableText;
|
||||||
use crate::flow::{Flow, GetBaseFlow};
|
use crate::flow::{Flow, GetBaseFlow};
|
||||||
|
@ -23,7 +22,7 @@ use msg::constellation_msg::PipelineId;
|
||||||
use script_layout_interface::rpc::TextIndexResponse;
|
use script_layout_interface::rpc::TextIndexResponse;
|
||||||
use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC};
|
use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC};
|
||||||
use script_layout_interface::rpc::{NodeGeometryResponse, NodeScrollIdResponse};
|
use script_layout_interface::rpc::{NodeGeometryResponse, NodeScrollIdResponse};
|
||||||
use script_layout_interface::rpc::{OffsetParentResponse, ResolvedStyleResponse, StyleResponse};
|
use script_layout_interface::rpc::{OffsetParentResponse, ResolvedStyleResponse};
|
||||||
use script_layout_interface::wrapper_traits::{
|
use script_layout_interface::wrapper_traits::{
|
||||||
LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
||||||
};
|
};
|
||||||
|
@ -77,9 +76,6 @@ pub struct LayoutThreadData {
|
||||||
/// A queued response for the offset parent/rect of a node.
|
/// A queued response for the offset parent/rect of a node.
|
||||||
pub offset_parent_response: OffsetParentResponse,
|
pub offset_parent_response: OffsetParentResponse,
|
||||||
|
|
||||||
/// A queued response for the style of a node.
|
|
||||||
pub style_response: StyleResponse,
|
|
||||||
|
|
||||||
/// Scroll offsets of scrolling regions.
|
/// Scroll offsets of scrolling regions.
|
||||||
pub scroll_offsets: ScrollOffsetMap,
|
pub scroll_offsets: ScrollOffsetMap,
|
||||||
|
|
||||||
|
@ -180,12 +176,6 @@ impl LayoutRPC for LayoutRPCImpl {
|
||||||
rw_data.offset_parent_response.clone()
|
rw_data.offset_parent_response.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn style(&self) -> StyleResponse {
|
|
||||||
let &LayoutRPCImpl(ref rw_data) = self;
|
|
||||||
let rw_data = rw_data.lock().unwrap();
|
|
||||||
rw_data.style_response.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn text_index(&self) -> TextIndexResponse {
|
fn text_index(&self) -> TextIndexResponse {
|
||||||
let &LayoutRPCImpl(ref rw_data) = self;
|
let &LayoutRPCImpl(ref rw_data) = self;
|
||||||
let rw_data = rw_data.lock().unwrap();
|
let rw_data = rw_data.lock().unwrap();
|
||||||
|
@ -966,13 +956,6 @@ pub fn process_offset_parent_query(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_style_query<'dom>(requested_node: impl LayoutNode<'dom>) -> StyleResponse {
|
|
||||||
let element = requested_node.as_element().unwrap();
|
|
||||||
let data = element.borrow_data();
|
|
||||||
|
|
||||||
StyleResponse(data.map(|d| d.styles.primary().clone()))
|
|
||||||
}
|
|
||||||
|
|
||||||
enum InnerTextItem {
|
enum InnerTextItem {
|
||||||
Text(String),
|
Text(String),
|
||||||
RequiredLineBreakCount(u32),
|
RequiredLineBreakCount(u32),
|
||||||
|
@ -1036,21 +1019,12 @@ fn inner_text_collection_steps<'dom>(
|
||||||
_ => child,
|
_ => child,
|
||||||
};
|
};
|
||||||
|
|
||||||
let element_data = {
|
let element_data = match node.get_style_and_opaque_layout_data() {
|
||||||
&node.get_style_and_layout_data().as_ref().map(|opaque| {
|
Some(data) => &data.style_data.element_data,
|
||||||
&opaque
|
None => continue,
|
||||||
.downcast_ref::<StyleAndLayoutData>()
|
|
||||||
.unwrap()
|
|
||||||
.style_data
|
|
||||||
.element_data
|
|
||||||
})
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if element_data.is_none() {
|
let style = match element_data.borrow().styles.get_primary() {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let style = match element_data.unwrap().borrow().styles.get_primary() {
|
|
||||||
None => continue,
|
None => continue,
|
||||||
Some(style) => style.clone(),
|
Some(style) => style.clone(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,7 +9,7 @@ use crate::context::LayoutContext;
|
||||||
use crate::display_list::DisplayListBuildState;
|
use crate::display_list::DisplayListBuildState;
|
||||||
use crate::flow::{Flow, FlowFlags, GetBaseFlow, ImmutableFlowUtils};
|
use crate::flow::{Flow, FlowFlags, GetBaseFlow, ImmutableFlowUtils};
|
||||||
use crate::wrapper::ThreadSafeLayoutNodeHelpers;
|
use crate::wrapper::ThreadSafeLayoutNodeHelpers;
|
||||||
use crate::wrapper::{GetRawData, LayoutNodeLayoutData};
|
use crate::wrapper::{GetStyleAndLayoutData, LayoutNodeLayoutData};
|
||||||
use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutNode};
|
use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutNode};
|
||||||
use servo_config::opts;
|
use servo_config::opts;
|
||||||
use style::context::{SharedStyleContext, StyleContext};
|
use style::context::{SharedStyleContext, StyleContext};
|
||||||
|
@ -73,7 +73,7 @@ where
|
||||||
// flow construction:
|
// flow construction:
|
||||||
// (1) They child doesn't yet have layout data (preorder traversal initializes it).
|
// (1) They child doesn't yet have layout data (preorder traversal initializes it).
|
||||||
// (2) The parent element has restyle damage (so the text flow also needs fixup).
|
// (2) The parent element has restyle damage (so the text flow also needs fixup).
|
||||||
node.get_raw_data().is_none() || !parent_data.damage.is_empty()
|
node.get_style_and_layout_data().is_none() || !parent_data.damage.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shared_context(&self) -> &SharedStyleContext {
|
fn shared_context(&self) -> &SharedStyleContext {
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
use crate::data::{LayoutData, LayoutDataFlags, StyleAndLayoutData};
|
use crate::data::{LayoutData, LayoutDataFlags, StyleAndLayoutData};
|
||||||
use atomic_refcell::{AtomicRef, AtomicRefMut};
|
use atomic_refcell::{AtomicRef, AtomicRefMut};
|
||||||
use script_layout_interface::wrapper_traits::GetLayoutData;
|
use script_layout_interface::wrapper_traits::GetStyleAndOpaqueLayoutData;
|
||||||
use script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode};
|
use script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode};
|
||||||
use style::dom::{NodeInfo, TNode};
|
use style::dom::{NodeInfo, TNode};
|
||||||
use style::selector_parser::RestyleDamage;
|
use style::selector_parser::RestyleDamage;
|
||||||
|
@ -47,14 +47,16 @@ pub trait LayoutNodeLayoutData<'dom> {
|
||||||
|
|
||||||
impl<'dom, T> LayoutNodeLayoutData<'dom> for T
|
impl<'dom, T> LayoutNodeLayoutData<'dom> for T
|
||||||
where
|
where
|
||||||
T: GetLayoutData<'dom>,
|
T: GetStyleAndOpaqueLayoutData<'dom>,
|
||||||
{
|
{
|
||||||
fn borrow_layout_data(self) -> Option<AtomicRef<'dom, LayoutData>> {
|
fn borrow_layout_data(self) -> Option<AtomicRef<'dom, LayoutData>> {
|
||||||
self.get_raw_data().map(|d| d.layout_data.borrow())
|
self.get_style_and_layout_data()
|
||||||
|
.map(|d| d.layout_data.borrow())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mutate_layout_data(self) -> Option<AtomicRefMut<'dom, LayoutData>> {
|
fn mutate_layout_data(self) -> Option<AtomicRefMut<'dom, LayoutData>> {
|
||||||
self.get_raw_data().map(|d| d.layout_data.borrow_mut())
|
self.get_style_and_layout_data()
|
||||||
|
.map(|d| d.layout_data.borrow_mut())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn flow_debug_id(self) -> usize {
|
fn flow_debug_id(self) -> usize {
|
||||||
|
@ -63,17 +65,20 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait GetRawData<'dom> {
|
pub trait GetStyleAndLayoutData<'dom> {
|
||||||
fn get_raw_data(self) -> Option<&'dom StyleAndLayoutData>;
|
fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom, T> GetRawData<'dom> for T
|
impl<'dom, T> GetStyleAndLayoutData<'dom> for T
|
||||||
where
|
where
|
||||||
T: GetLayoutData<'dom>,
|
T: GetStyleAndOpaqueLayoutData<'dom>,
|
||||||
{
|
{
|
||||||
fn get_raw_data(self) -> Option<&'dom StyleAndLayoutData> {
|
fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>> {
|
||||||
self.get_style_and_layout_data()
|
self.get_style_and_opaque_layout_data()
|
||||||
.map(|opaque| opaque.downcast_ref().unwrap())
|
.map(|data| StyleAndLayoutData {
|
||||||
|
style_data: &data.style_data,
|
||||||
|
layout_data: data.generic_data.downcast_ref().unwrap(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +148,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
let damage = {
|
let damage = {
|
||||||
let data = node.get_raw_data().unwrap();
|
let data = node.get_style_and_layout_data().unwrap();
|
||||||
|
|
||||||
if !data
|
if !data
|
||||||
.layout_data
|
.layout_data
|
||||||
|
|
|
@ -6,17 +6,7 @@ use crate::element_data::LayoutDataForElement;
|
||||||
use atomic_refcell::AtomicRefCell;
|
use atomic_refcell::AtomicRefCell;
|
||||||
use script_layout_interface::StyleData;
|
use script_layout_interface::StyleData;
|
||||||
|
|
||||||
#[repr(C)]
|
pub struct StyleAndLayoutData<'dom> {
|
||||||
pub struct StyleAndLayoutData {
|
pub style_data: &'dom StyleData,
|
||||||
pub style_data: StyleData,
|
pub(super) layout_data: &'dom AtomicRefCell<LayoutDataForElement>,
|
||||||
pub(super) layout_data: AtomicRefCell<LayoutDataForElement>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl StyleAndLayoutData {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {
|
|
||||||
style_data: StyleData::new(),
|
|
||||||
layout_data: Default::default(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use crate::element_data::{LayoutBox, LayoutDataForElement};
|
||||||
use crate::geom::PhysicalSize;
|
use crate::geom::PhysicalSize;
|
||||||
use crate::replaced::{CanvasInfo, CanvasSource, ReplacedContent};
|
use crate::replaced::{CanvasInfo, CanvasSource, ReplacedContent};
|
||||||
use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOutside};
|
use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOutside};
|
||||||
use crate::wrapper::GetRawData;
|
use crate::wrapper::GetStyleAndLayoutData;
|
||||||
use atomic_refcell::AtomicRefMut;
|
use atomic_refcell::AtomicRefMut;
|
||||||
use html5ever::LocalName;
|
use html5ever::LocalName;
|
||||||
use net_traits::image::base::Image as NetImage;
|
use net_traits::image::base::Image as NetImage;
|
||||||
|
@ -448,7 +448,7 @@ where
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
fn layout_data_mut(self) -> AtomicRefMut<'dom, LayoutDataForElement> {
|
fn layout_data_mut(self) -> AtomicRefMut<'dom, LayoutDataForElement> {
|
||||||
self.get_raw_data()
|
self.get_style_and_layout_data()
|
||||||
.map(|d| d.layout_data.borrow_mut())
|
.map(|d| d.layout_data.borrow_mut())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ pub mod context;
|
||||||
pub mod data;
|
pub mod data;
|
||||||
pub mod display_list;
|
pub mod display_list;
|
||||||
mod dom_traversal;
|
mod dom_traversal;
|
||||||
mod element_data;
|
pub mod element_data;
|
||||||
mod flow;
|
mod flow;
|
||||||
mod formatting_contexts;
|
mod formatting_contexts;
|
||||||
mod fragments;
|
mod fragments;
|
||||||
|
|
|
@ -15,7 +15,7 @@ use msg::constellation_msg::PipelineId;
|
||||||
use script_layout_interface::rpc::TextIndexResponse;
|
use script_layout_interface::rpc::TextIndexResponse;
|
||||||
use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC};
|
use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC};
|
||||||
use script_layout_interface::rpc::{NodeGeometryResponse, NodeScrollIdResponse};
|
use script_layout_interface::rpc::{NodeGeometryResponse, NodeScrollIdResponse};
|
||||||
use script_layout_interface::rpc::{OffsetParentResponse, ResolvedStyleResponse, StyleResponse};
|
use script_layout_interface::rpc::{OffsetParentResponse, ResolvedStyleResponse};
|
||||||
use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutNode};
|
use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutNode};
|
||||||
use script_traits::LayoutMsg as ConstellationMsg;
|
use script_traits::LayoutMsg as ConstellationMsg;
|
||||||
use script_traits::UntrustedNodeAddress;
|
use script_traits::UntrustedNodeAddress;
|
||||||
|
@ -59,9 +59,6 @@ pub struct LayoutThreadData {
|
||||||
/// A queued response for the offset parent/rect of a node.
|
/// A queued response for the offset parent/rect of a node.
|
||||||
pub offset_parent_response: OffsetParentResponse,
|
pub offset_parent_response: OffsetParentResponse,
|
||||||
|
|
||||||
/// A queued response for the style of a node.
|
|
||||||
pub style_response: StyleResponse,
|
|
||||||
|
|
||||||
/// Scroll offsets of scrolling regions.
|
/// Scroll offsets of scrolling regions.
|
||||||
pub scroll_offsets: HashMap<ExternalScrollId, Vector2D<f32, LayoutPixel>>,
|
pub scroll_offsets: HashMap<ExternalScrollId, Vector2D<f32, LayoutPixel>>,
|
||||||
|
|
||||||
|
@ -139,12 +136,6 @@ impl LayoutRPC for LayoutRPCImpl {
|
||||||
rw_data.offset_parent_response.clone()
|
rw_data.offset_parent_response.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn style(&self) -> StyleResponse {
|
|
||||||
let &LayoutRPCImpl(ref rw_data) = self;
|
|
||||||
let rw_data = rw_data.lock().unwrap();
|
|
||||||
rw_data.style_response.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn text_index(&self) -> TextIndexResponse {
|
fn text_index(&self) -> TextIndexResponse {
|
||||||
let &LayoutRPCImpl(ref rw_data) = self;
|
let &LayoutRPCImpl(ref rw_data) = self;
|
||||||
let rw_data = rw_data.lock().unwrap();
|
let rw_data = rw_data.lock().unwrap();
|
||||||
|
@ -220,10 +211,6 @@ pub fn process_offset_parent_query(_requested_node: OpaqueNode) -> OffsetParentR
|
||||||
OffsetParentResponse::empty()
|
OffsetParentResponse::empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_style_query<'dom>(_requested_node: impl LayoutNode<'dom>) -> StyleResponse {
|
|
||||||
StyleResponse(None)
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#the-innertext-idl-attribute
|
// https://html.spec.whatwg.org/multipage/#the-innertext-idl-attribute
|
||||||
pub fn process_element_inner_text_query<'dom>(_node: impl LayoutNode<'dom>) -> String {
|
pub fn process_element_inner_text_query<'dom>(_node: impl LayoutNode<'dom>) -> String {
|
||||||
"".to_owned()
|
"".to_owned()
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use crate::context::LayoutContext;
|
use crate::context::LayoutContext;
|
||||||
use crate::wrapper::GetRawData;
|
use crate::wrapper::GetStyleAndLayoutData;
|
||||||
use script_layout_interface::wrapper_traits::LayoutNode;
|
use script_layout_interface::wrapper_traits::LayoutNode;
|
||||||
use style::context::{SharedStyleContext, StyleContext};
|
use style::context::{SharedStyleContext, StyleContext};
|
||||||
use style::data::ElementData;
|
use style::data::ElementData;
|
||||||
|
@ -45,25 +45,28 @@ where
|
||||||
) where
|
) where
|
||||||
F: FnMut(E::ConcreteNode),
|
F: FnMut(E::ConcreteNode),
|
||||||
{
|
{
|
||||||
unsafe { node.initialize_data() };
|
unsafe {
|
||||||
|
node.initialize_data();
|
||||||
if !node.is_text_node() {
|
if !node.is_text_node() {
|
||||||
let el = node.as_element().unwrap();
|
let el = node.as_element().unwrap();
|
||||||
let mut data = el.mutate_data().unwrap();
|
let mut data = el.mutate_data().unwrap();
|
||||||
recalc_style_at(self, traversal_data, context, el, &mut data, note_child);
|
recalc_style_at(self, traversal_data, context, el, &mut data, note_child);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn process_postorder(&self, _style_context: &mut StyleContext<E>, node: E::ConcreteNode) {
|
|
||||||
if let Some(el) = node.as_element() {
|
|
||||||
unsafe {
|
|
||||||
el.unset_dirty_descendants();
|
el.unset_dirty_descendants();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn needs_postorder_traversal() -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_postorder(&self, _style_context: &mut StyleContext<E>, _node: E::ConcreteNode) {
|
||||||
|
panic!("this should never be called")
|
||||||
|
}
|
||||||
|
|
||||||
fn text_node_needs_traversal(node: E::ConcreteNode, parent_data: &ElementData) -> bool {
|
fn text_node_needs_traversal(node: E::ConcreteNode, parent_data: &ElementData) -> bool {
|
||||||
node.get_raw_data().is_none() || !parent_data.damage.is_empty()
|
node.get_style_and_layout_data().is_none() || !parent_data.damage.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shared_context(&self) -> &SharedStyleContext {
|
fn shared_context(&self) -> &SharedStyleContext {
|
||||||
|
|
|
@ -5,18 +5,21 @@
|
||||||
#![allow(unsafe_code)]
|
#![allow(unsafe_code)]
|
||||||
|
|
||||||
use crate::data::StyleAndLayoutData;
|
use crate::data::StyleAndLayoutData;
|
||||||
use script_layout_interface::wrapper_traits::GetLayoutData;
|
use script_layout_interface::wrapper_traits::GetStyleAndOpaqueLayoutData;
|
||||||
|
|
||||||
pub trait GetRawData<'dom> {
|
pub trait GetStyleAndLayoutData<'dom> {
|
||||||
fn get_raw_data(self) -> Option<&'dom StyleAndLayoutData>;
|
fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom, T> GetRawData<'dom> for T
|
impl<'dom, T> GetStyleAndLayoutData<'dom> for T
|
||||||
where
|
where
|
||||||
T: GetLayoutData<'dom>,
|
T: GetStyleAndOpaqueLayoutData<'dom>,
|
||||||
{
|
{
|
||||||
fn get_raw_data(self) -> Option<&'dom StyleAndLayoutData> {
|
fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>> {
|
||||||
self.get_style_and_layout_data()
|
self.get_style_and_opaque_layout_data()
|
||||||
.map(|opaque| opaque.downcast_ref().unwrap())
|
.map(|data| StyleAndLayoutData {
|
||||||
|
style_data: &data.style_data,
|
||||||
|
layout_data: data.generic_data.downcast_ref().unwrap(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,11 @@
|
||||||
|
|
||||||
#![allow(unsafe_code)]
|
#![allow(unsafe_code)]
|
||||||
|
|
||||||
use atomic_refcell::{AtomicRef, AtomicRefMut};
|
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||||
use gfx_traits::ByteIndex;
|
use gfx_traits::ByteIndex;
|
||||||
use html5ever::{LocalName, Namespace};
|
use html5ever::{LocalName, Namespace};
|
||||||
use layout::data::StyleAndLayoutData;
|
use layout::data::LayoutData;
|
||||||
use layout::wrapper::GetRawData;
|
use layout::wrapper::GetStyleAndLayoutData;
|
||||||
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
||||||
use net_traits::image::base::{Image, ImageMetadata};
|
use net_traits::image::base::{Image, ImageMetadata};
|
||||||
use range::Range;
|
use range::Range;
|
||||||
|
@ -50,13 +50,13 @@ use script::layout_exports::{
|
||||||
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
|
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
|
||||||
};
|
};
|
||||||
use script_layout_interface::wrapper_traits::{
|
use script_layout_interface::wrapper_traits::{
|
||||||
DangerousThreadSafeLayoutNode, GetLayoutData, LayoutNode,
|
DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode,
|
||||||
};
|
};
|
||||||
use script_layout_interface::wrapper_traits::{
|
use script_layout_interface::wrapper_traits::{
|
||||||
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
||||||
};
|
};
|
||||||
use script_layout_interface::{
|
use script_layout_interface::{
|
||||||
HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData,
|
HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData,
|
||||||
};
|
};
|
||||||
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
|
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
|
||||||
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
|
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
|
||||||
|
@ -268,18 +268,21 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn initialize_data(&self) {
|
unsafe fn initialize_data(&self) {
|
||||||
if self.get_raw_data().is_none() {
|
if self.get_style_and_layout_data().is_none() {
|
||||||
let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new());
|
let opaque = StyleAndOpaqueLayoutData::new(
|
||||||
self.init_style_and_layout_data(opaque);
|
StyleData::new(),
|
||||||
|
AtomicRefCell::new(LayoutData::new()),
|
||||||
|
);
|
||||||
|
self.init_style_and_opaque_layout_data(opaque);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData) {
|
unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>) {
|
||||||
self.get_jsmanaged().init_style_and_layout_data(data);
|
self.get_jsmanaged().init_style_and_opaque_layout_data(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn take_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData {
|
unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData> {
|
||||||
self.get_jsmanaged().take_style_and_layout_data()
|
self.get_jsmanaged().take_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_connected(&self) -> bool {
|
fn is_connected(&self) -> bool {
|
||||||
|
@ -287,27 +290,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoLayoutNode<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.get_jsmanaged().get_style_and_layout_data()
|
self.get_jsmanaged().get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoLayoutElement<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.as_node().get_style_and_layout_data()
|
self.as_node().get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.node.get_style_and_layout_data()
|
self.node.get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.element.as_node().get_style_and_layout_data()
|
self.element.as_node().get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,8 +539,8 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn clear_data(&self) {
|
unsafe fn clear_data(&self) {
|
||||||
if self.get_raw_data().is_some() {
|
if self.get_style_and_layout_data().is_some() {
|
||||||
drop(self.as_node().take_style_and_layout_data());
|
drop(self.as_node().take_style_and_opaque_layout_data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,12 +698,8 @@ impl<'le> ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_data(&self) -> Option<&StyleData> {
|
fn get_style_data(&self) -> Option<&StyleData> {
|
||||||
self.get_style_and_layout_data().map(|opaque| {
|
self.get_style_and_opaque_layout_data()
|
||||||
&opaque
|
.map(|data| &data.style_data)
|
||||||
.downcast_ref::<StyleAndLayoutData>()
|
|
||||||
.unwrap()
|
|
||||||
.style_data
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn unset_snapshot_flags(&self) {
|
pub unsafe fn unset_snapshot_flags(&self) {
|
||||||
|
@ -1045,8 +1044,8 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_and_layout_data(self) -> Option<&'ln OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> {
|
||||||
self.node.get_style_and_layout_data()
|
self.node.get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {
|
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {
|
||||||
|
|
|
@ -55,9 +55,7 @@ use layout::query::{
|
||||||
process_content_box_request, process_content_boxes_request, LayoutRPCImpl, LayoutThreadData,
|
process_content_box_request, process_content_boxes_request, LayoutRPCImpl, LayoutThreadData,
|
||||||
};
|
};
|
||||||
use layout::query::{process_node_scroll_area_request, process_node_scroll_id_request};
|
use layout::query::{process_node_scroll_area_request, process_node_scroll_id_request};
|
||||||
use layout::query::{
|
use layout::query::{process_offset_parent_query, process_resolved_style_request};
|
||||||
process_offset_parent_query, process_resolved_style_request, process_style_query,
|
|
||||||
};
|
|
||||||
use layout::sequential;
|
use layout::sequential;
|
||||||
use layout::traversal::{
|
use layout::traversal::{
|
||||||
ComputeStackingRelativePositions, PreorderFlowTraversal, RecalcStyleAndConstructFlows,
|
ComputeStackingRelativePositions, PreorderFlowTraversal, RecalcStyleAndConstructFlows,
|
||||||
|
@ -80,7 +78,7 @@ use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType};
|
||||||
use script_layout_interface::message::{LayoutThreadInit, Msg, NodesFromPointQueryType, Reflow};
|
use script_layout_interface::message::{LayoutThreadInit, Msg, NodesFromPointQueryType, Reflow};
|
||||||
use script_layout_interface::message::{QueryMsg, ReflowComplete, ReflowGoal, ScriptReflow};
|
use script_layout_interface::message::{QueryMsg, ReflowComplete, ReflowGoal, ScriptReflow};
|
||||||
use script_layout_interface::rpc::TextIndexResponse;
|
use script_layout_interface::rpc::TextIndexResponse;
|
||||||
use script_layout_interface::rpc::{LayoutRPC, OffsetParentResponse, StyleResponse};
|
use script_layout_interface::rpc::{LayoutRPC, OffsetParentResponse};
|
||||||
use script_layout_interface::wrapper_traits::LayoutNode;
|
use script_layout_interface::wrapper_traits::LayoutNode;
|
||||||
use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg};
|
use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg};
|
||||||
use script_traits::{DrawAPaintImageResult, IFrameSizeMsg, PaintWorkletError, WindowSizeType};
|
use script_traits::{DrawAPaintImageResult, IFrameSizeMsg, PaintWorkletError, WindowSizeType};
|
||||||
|
@ -595,7 +593,6 @@ impl LayoutThread {
|
||||||
scroll_area_response: Rect::zero(),
|
scroll_area_response: Rect::zero(),
|
||||||
resolved_style_response: String::new(),
|
resolved_style_response: String::new(),
|
||||||
offset_parent_response: OffsetParentResponse::empty(),
|
offset_parent_response: OffsetParentResponse::empty(),
|
||||||
style_response: StyleResponse(None),
|
|
||||||
scroll_offsets: HashMap::new(),
|
scroll_offsets: HashMap::new(),
|
||||||
text_index_response: TextIndexResponse(None),
|
text_index_response: TextIndexResponse(None),
|
||||||
nodes_from_point_response: vec![],
|
nodes_from_point_response: vec![],
|
||||||
|
@ -1308,9 +1305,7 @@ impl LayoutThread {
|
||||||
&QueryMsg::OffsetParentQuery(_) => {
|
&QueryMsg::OffsetParentQuery(_) => {
|
||||||
rw_data.offset_parent_response = OffsetParentResponse::empty();
|
rw_data.offset_parent_response = OffsetParentResponse::empty();
|
||||||
},
|
},
|
||||||
&QueryMsg::StyleQuery(_) => {
|
&QueryMsg::StyleQuery => {},
|
||||||
rw_data.style_response = StyleResponse(None);
|
|
||||||
},
|
|
||||||
&QueryMsg::TextIndexQuery(..) => {
|
&QueryMsg::TextIndexQuery(..) => {
|
||||||
rw_data.text_index_response = TextIndexResponse(None);
|
rw_data.text_index_response = TextIndexResponse(None);
|
||||||
},
|
},
|
||||||
|
@ -1634,10 +1629,7 @@ impl LayoutThread {
|
||||||
&QueryMsg::OffsetParentQuery(node) => {
|
&QueryMsg::OffsetParentQuery(node) => {
|
||||||
rw_data.offset_parent_response = process_offset_parent_query(node, root_flow);
|
rw_data.offset_parent_response = process_offset_parent_query(node, root_flow);
|
||||||
},
|
},
|
||||||
&QueryMsg::StyleQuery(node) => {
|
&QueryMsg::StyleQuery => {},
|
||||||
let node = unsafe { ServoLayoutNode::new(&node) };
|
|
||||||
rw_data.style_response = process_style_query(node);
|
|
||||||
},
|
|
||||||
&QueryMsg::NodesFromPointQuery(client_point, ref reflow_goal) => {
|
&QueryMsg::NodesFromPointQuery(client_point, ref reflow_goal) => {
|
||||||
let mut flags = match reflow_goal {
|
let mut flags = match reflow_goal {
|
||||||
&NodesFromPointQueryType::Topmost => webrender_api::HitTestFlags::empty(),
|
&NodesFromPointQueryType::Topmost => webrender_api::HitTestFlags::empty(),
|
||||||
|
|
|
@ -30,11 +30,11 @@
|
||||||
|
|
||||||
#![allow(unsafe_code)]
|
#![allow(unsafe_code)]
|
||||||
|
|
||||||
use atomic_refcell::{AtomicRef, AtomicRefMut};
|
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||||
use gfx_traits::ByteIndex;
|
use gfx_traits::ByteIndex;
|
||||||
use html5ever::{LocalName, Namespace};
|
use html5ever::{LocalName, Namespace};
|
||||||
use layout::data::StyleAndLayoutData;
|
use layout::element_data::LayoutDataForElement;
|
||||||
use layout::wrapper::GetRawData;
|
use layout::wrapper::GetStyleAndLayoutData;
|
||||||
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
||||||
use net_traits::image::base::{Image, ImageMetadata};
|
use net_traits::image::base::{Image, ImageMetadata};
|
||||||
use range::Range;
|
use range::Range;
|
||||||
|
@ -50,13 +50,13 @@ use script::layout_exports::{
|
||||||
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
|
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
|
||||||
};
|
};
|
||||||
use script_layout_interface::wrapper_traits::{
|
use script_layout_interface::wrapper_traits::{
|
||||||
DangerousThreadSafeLayoutNode, GetLayoutData, LayoutNode,
|
DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode,
|
||||||
};
|
};
|
||||||
use script_layout_interface::wrapper_traits::{
|
use script_layout_interface::wrapper_traits::{
|
||||||
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
||||||
};
|
};
|
||||||
use script_layout_interface::{
|
use script_layout_interface::{
|
||||||
HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData,
|
HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData,
|
||||||
};
|
};
|
||||||
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
|
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
|
||||||
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
|
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
|
||||||
|
@ -275,18 +275,21 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn initialize_data(&self) {
|
unsafe fn initialize_data(&self) {
|
||||||
if self.get_raw_data().is_none() {
|
if self.get_style_and_layout_data().is_none() {
|
||||||
let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new());
|
let opaque = StyleAndOpaqueLayoutData::new(
|
||||||
self.init_style_and_layout_data(opaque);
|
StyleData::new(),
|
||||||
|
AtomicRefCell::new(LayoutDataForElement::default()),
|
||||||
|
);
|
||||||
|
self.init_style_and_opaque_layout_data(opaque);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData) {
|
unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>) {
|
||||||
self.get_jsmanaged().init_style_and_layout_data(data);
|
self.get_jsmanaged().init_style_and_opaque_layout_data(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn take_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData {
|
unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData> {
|
||||||
self.get_jsmanaged().take_style_and_layout_data()
|
self.get_jsmanaged().take_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_connected(&self) -> bool {
|
fn is_connected(&self) -> bool {
|
||||||
|
@ -294,27 +297,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoLayoutNode<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
unsafe { self.get_jsmanaged().get_style_and_layout_data() }
|
unsafe { self.get_jsmanaged().get_style_and_opaque_layout_data() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoLayoutElement<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.as_node().get_style_and_layout_data()
|
self.as_node().get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.node.get_style_and_layout_data()
|
self.node.get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
|
impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
self.element.as_node().get_style_and_layout_data()
|
self.element.as_node().get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,8 +547,8 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn clear_data(&self) {
|
unsafe fn clear_data(&self) {
|
||||||
if self.get_raw_data().is_some() {
|
if self.get_style_and_layout_data().is_some() {
|
||||||
drop(self.as_node().take_style_and_layout_data());
|
drop(self.as_node().take_style_and_opaque_layout_data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,12 +706,8 @@ impl<'le> ServoLayoutElement<'le> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_data(&self) -> Option<&StyleData> {
|
fn get_style_data(&self) -> Option<&StyleData> {
|
||||||
self.get_style_and_layout_data().map(|opaque| {
|
self.get_style_and_opaque_layout_data()
|
||||||
&opaque
|
.map(|data| &data.style_data)
|
||||||
.downcast_ref::<StyleAndLayoutData>()
|
|
||||||
.unwrap()
|
|
||||||
.style_data
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn unset_snapshot_flags(&self) {
|
pub unsafe fn unset_snapshot_flags(&self) {
|
||||||
|
@ -1053,8 +1052,8 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_and_layout_data(self) -> Option<&'ln OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> {
|
||||||
self.node.get_style_and_layout_data()
|
self.node.get_style_and_opaque_layout_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {
|
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {
|
||||||
|
|
|
@ -42,8 +42,7 @@ use layout::query::{
|
||||||
use layout::query::{process_element_inner_text_query, process_node_geometry_request};
|
use layout::query::{process_element_inner_text_query, process_node_geometry_request};
|
||||||
use layout::query::{process_node_scroll_area_request, process_node_scroll_id_request};
|
use layout::query::{process_node_scroll_area_request, process_node_scroll_id_request};
|
||||||
use layout::query::{
|
use layout::query::{
|
||||||
process_offset_parent_query, process_resolved_style_request, process_style_query,
|
process_offset_parent_query, process_resolved_style_request, process_text_index_request,
|
||||||
process_text_index_request,
|
|
||||||
};
|
};
|
||||||
use layout::traversal::RecalcStyle;
|
use layout::traversal::RecalcStyle;
|
||||||
use layout::{BoxTreeRoot, FragmentTreeRoot};
|
use layout::{BoxTreeRoot, FragmentTreeRoot};
|
||||||
|
@ -64,7 +63,7 @@ use profile_traits::time::{TimerMetadataFrameType, TimerMetadataReflowType};
|
||||||
use script_layout_interface::message::{LayoutThreadInit, Msg, NodesFromPointQueryType};
|
use script_layout_interface::message::{LayoutThreadInit, Msg, NodesFromPointQueryType};
|
||||||
use script_layout_interface::message::{QueryMsg, ReflowComplete, ReflowGoal, ScriptReflow};
|
use script_layout_interface::message::{QueryMsg, ReflowComplete, ReflowGoal, ScriptReflow};
|
||||||
use script_layout_interface::rpc::TextIndexResponse;
|
use script_layout_interface::rpc::TextIndexResponse;
|
||||||
use script_layout_interface::rpc::{LayoutRPC, OffsetParentResponse, StyleResponse};
|
use script_layout_interface::rpc::{LayoutRPC, OffsetParentResponse};
|
||||||
use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg};
|
use script_traits::{ConstellationControlMsg, LayoutControlMsg, LayoutMsg as ConstellationMsg};
|
||||||
use script_traits::{DrawAPaintImageResult, PaintWorkletError};
|
use script_traits::{DrawAPaintImageResult, PaintWorkletError};
|
||||||
use script_traits::{Painter, WebrenderIpcSender};
|
use script_traits::{Painter, WebrenderIpcSender};
|
||||||
|
@ -551,7 +550,6 @@ impl LayoutThread {
|
||||||
scroll_area_response: Rect::zero(),
|
scroll_area_response: Rect::zero(),
|
||||||
resolved_style_response: String::new(),
|
resolved_style_response: String::new(),
|
||||||
offset_parent_response: OffsetParentResponse::empty(),
|
offset_parent_response: OffsetParentResponse::empty(),
|
||||||
style_response: StyleResponse(None),
|
|
||||||
scroll_offsets: HashMap::new(),
|
scroll_offsets: HashMap::new(),
|
||||||
text_index_response: TextIndexResponse(None),
|
text_index_response: TextIndexResponse(None),
|
||||||
nodes_from_point_response: vec![],
|
nodes_from_point_response: vec![],
|
||||||
|
@ -978,9 +976,7 @@ impl LayoutThread {
|
||||||
&QueryMsg::OffsetParentQuery(_) => {
|
&QueryMsg::OffsetParentQuery(_) => {
|
||||||
rw_data.offset_parent_response = OffsetParentResponse::empty();
|
rw_data.offset_parent_response = OffsetParentResponse::empty();
|
||||||
},
|
},
|
||||||
&QueryMsg::StyleQuery(_) => {
|
&QueryMsg::StyleQuery => {},
|
||||||
rw_data.style_response = StyleResponse(None);
|
|
||||||
},
|
|
||||||
&QueryMsg::TextIndexQuery(..) => {
|
&QueryMsg::TextIndexQuery(..) => {
|
||||||
rw_data.text_index_response = TextIndexResponse(None);
|
rw_data.text_index_response = TextIndexResponse(None);
|
||||||
},
|
},
|
||||||
|
@ -1261,10 +1257,7 @@ impl LayoutThread {
|
||||||
&QueryMsg::OffsetParentQuery(node) => {
|
&QueryMsg::OffsetParentQuery(node) => {
|
||||||
rw_data.offset_parent_response = process_offset_parent_query(node);
|
rw_data.offset_parent_response = process_offset_parent_query(node);
|
||||||
},
|
},
|
||||||
&QueryMsg::StyleQuery(node) => {
|
&QueryMsg::StyleQuery => {},
|
||||||
let node = unsafe { ServoLayoutNode::new(&node) };
|
|
||||||
rw_data.style_response = process_style_query(node);
|
|
||||||
},
|
|
||||||
&QueryMsg::NodesFromPointQuery(client_point, ref reflow_goal) => {
|
&QueryMsg::NodesFromPointQuery(client_point, ref reflow_goal) => {
|
||||||
let mut flags = match reflow_goal {
|
let mut flags = match reflow_goal {
|
||||||
&NodesFromPointQueryType::Topmost => webrender_api::HitTestFlags::empty(),
|
&NodesFromPointQueryType::Topmost => webrender_api::HitTestFlags::empty(),
|
||||||
|
|
|
@ -15,7 +15,6 @@ use crate::dom::document::AnimationFrameCallback;
|
||||||
use crate::dom::element::Element;
|
use crate::dom::element::Element;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::node::{window_from_node, Node, ShadowIncluding};
|
use crate::dom::node::{window_from_node, Node, ShadowIncluding};
|
||||||
use crate::dom::window::Window;
|
|
||||||
use crate::realms::enter_realm;
|
use crate::realms::enter_realm;
|
||||||
use crate::script_thread::Documents;
|
use crate::script_thread::Documents;
|
||||||
use devtools_traits::{AutoMargins, ComputedNodeLayout, TimelineMarkerType};
|
use devtools_traits::{AutoMargins, ComputedNodeLayout, TimelineMarkerType};
|
||||||
|
@ -150,7 +149,7 @@ pub fn handle_get_layout(
|
||||||
position: String::from(computed_style.Position()),
|
position: String::from(computed_style.Position()),
|
||||||
zIndex: String::from(computed_style.ZIndex()),
|
zIndex: String::from(computed_style.ZIndex()),
|
||||||
boxSizing: String::from(computed_style.BoxSizing()),
|
boxSizing: String::from(computed_style.BoxSizing()),
|
||||||
autoMargins: determine_auto_margins(&window, &*node),
|
autoMargins: determine_auto_margins(&node),
|
||||||
marginTop: String::from(computed_style.MarginTop()),
|
marginTop: String::from(computed_style.MarginTop()),
|
||||||
marginRight: String::from(computed_style.MarginRight()),
|
marginRight: String::from(computed_style.MarginRight()),
|
||||||
marginBottom: String::from(computed_style.MarginBottom()),
|
marginBottom: String::from(computed_style.MarginBottom()),
|
||||||
|
@ -169,8 +168,8 @@ pub fn handle_get_layout(
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn determine_auto_margins(window: &Window, node: &Node) -> AutoMargins {
|
fn determine_auto_margins(node: &Node) -> AutoMargins {
|
||||||
let style = window.style_query(node.to_trusted_node_address()).unwrap();
|
let style = node.style().unwrap();
|
||||||
let margin = style.get_margin();
|
let margin = style.get_margin();
|
||||||
AutoMargins {
|
AutoMargins {
|
||||||
top: margin.margin_top.is_auto(),
|
top: margin.margin_top.is_auto(),
|
||||||
|
|
|
@ -97,7 +97,7 @@ use profile_traits::mem::ProfilerChan as MemProfilerChan;
|
||||||
use profile_traits::time::ProfilerChan as TimeProfilerChan;
|
use profile_traits::time::ProfilerChan as TimeProfilerChan;
|
||||||
use script_layout_interface::message::PendingRestyle;
|
use script_layout_interface::message::PendingRestyle;
|
||||||
use script_layout_interface::rpc::LayoutRPC;
|
use script_layout_interface::rpc::LayoutRPC;
|
||||||
use script_layout_interface::OpaqueStyleAndLayoutData;
|
use script_layout_interface::StyleAndOpaqueLayoutData;
|
||||||
use script_traits::serializable::BlobImpl;
|
use script_traits::serializable::BlobImpl;
|
||||||
use script_traits::transferable::MessagePortImpl;
|
use script_traits::transferable::MessagePortImpl;
|
||||||
use script_traits::{DocumentActivity, DrawAPaintImageResult};
|
use script_traits::{DocumentActivity, DrawAPaintImageResult};
|
||||||
|
@ -508,7 +508,7 @@ unsafe_no_jsmanaged_fields!(StatusCode);
|
||||||
unsafe_no_jsmanaged_fields!(SystemTime);
|
unsafe_no_jsmanaged_fields!(SystemTime);
|
||||||
unsafe_no_jsmanaged_fields!(Instant);
|
unsafe_no_jsmanaged_fields!(Instant);
|
||||||
unsafe_no_jsmanaged_fields!(RelativePos);
|
unsafe_no_jsmanaged_fields!(RelativePos);
|
||||||
unsafe_no_jsmanaged_fields!(OpaqueStyleAndLayoutData);
|
unsafe_no_jsmanaged_fields!(StyleAndOpaqueLayoutData);
|
||||||
unsafe_no_jsmanaged_fields!(PathBuf);
|
unsafe_no_jsmanaged_fields!(PathBuf);
|
||||||
unsafe_no_jsmanaged_fields!(DrawAPaintImageResult);
|
unsafe_no_jsmanaged_fields!(DrawAPaintImageResult);
|
||||||
unsafe_no_jsmanaged_fields!(DocumentId);
|
unsafe_no_jsmanaged_fields!(DocumentId);
|
||||||
|
|
|
@ -396,7 +396,7 @@ impl Element {
|
||||||
/// style will be `None` for elements in a `display: none` subtree. otherwise, the element has a
|
/// style will be `None` for elements in a `display: none` subtree. otherwise, the element has a
|
||||||
/// layout box iff it doesn't have `display: none`.
|
/// layout box iff it doesn't have `display: none`.
|
||||||
pub fn style(&self) -> Option<Arc<ComputedValues>> {
|
pub fn style(&self) -> Option<Arc<ComputedValues>> {
|
||||||
window_from_node(self).style_query(self.upcast::<Node>().to_trusted_node_address())
|
self.upcast::<Node>().style()
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://drafts.csswg.org/cssom-view/#css-layout-box
|
// https://drafts.csswg.org/cssom-view/#css-layout-box
|
||||||
|
|
|
@ -75,8 +75,9 @@ use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
|
||||||
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
||||||
use net_traits::image::base::{Image, ImageMetadata};
|
use net_traits::image::base::{Image, ImageMetadata};
|
||||||
use ref_slice::ref_slice;
|
use ref_slice::ref_slice;
|
||||||
|
use script_layout_interface::message::QueryMsg;
|
||||||
use script_layout_interface::{HTMLCanvasData, HTMLMediaData, LayoutElementType, LayoutNodeType};
|
use script_layout_interface::{HTMLCanvasData, HTMLMediaData, LayoutElementType, LayoutNodeType};
|
||||||
use script_layout_interface::{OpaqueStyleAndLayoutData, SVGSVGData, TrustedNodeAddress};
|
use script_layout_interface::{SVGSVGData, StyleAndOpaqueLayoutData, TrustedNodeAddress};
|
||||||
use script_traits::DocumentActivity;
|
use script_traits::DocumentActivity;
|
||||||
use script_traits::UntrustedNodeAddress;
|
use script_traits::UntrustedNodeAddress;
|
||||||
use selectors::matching::{matches_selector_list, MatchingContext, MatchingMode};
|
use selectors::matching::{matches_selector_list, MatchingContext, MatchingMode};
|
||||||
|
@ -95,6 +96,7 @@ use std::ops::Range;
|
||||||
use std::sync::Arc as StdArc;
|
use std::sync::Arc as StdArc;
|
||||||
use style::context::QuirksMode;
|
use style::context::QuirksMode;
|
||||||
use style::dom::OpaqueNode;
|
use style::dom::OpaqueNode;
|
||||||
|
use style::properties::ComputedValues;
|
||||||
use style::selector_parser::{SelectorImpl, SelectorParser};
|
use style::selector_parser::{SelectorImpl, SelectorParser};
|
||||||
use style::stylesheets::Stylesheet;
|
use style::stylesheets::Stylesheet;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
@ -152,8 +154,8 @@ pub struct Node {
|
||||||
///
|
///
|
||||||
/// Must be sent back to the layout thread to be destroyed when this
|
/// Must be sent back to the layout thread to be destroyed when this
|
||||||
/// node is finalized.
|
/// node is finalized.
|
||||||
#[ignore_malloc_size_of = "shrug"]
|
#[ignore_malloc_size_of = "Unsafe cell"]
|
||||||
style_and_layout_data: UnsafeCell<Option<OpaqueStyleAndLayoutData>>,
|
style_and_layout_data: UnsafeCell<Option<Box<StyleAndOpaqueLayoutData>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
|
@ -1229,6 +1231,23 @@ impl Node {
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
pub fn style(&self) -> Option<Arc<ComputedValues>> {
|
||||||
|
if !window_from_node(self).layout_reflow(QueryMsg::StyleQuery) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
(*self.style_and_layout_data.get()).as_ref().map(|data| {
|
||||||
|
data.style_data
|
||||||
|
.element_data
|
||||||
|
.borrow()
|
||||||
|
.styles
|
||||||
|
.primary()
|
||||||
|
.clone()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterate through `nodes` until we find a `Node` that is not in `not_in`
|
/// Iterate through `nodes` until we find a `Node` that is not in `not_in`
|
||||||
|
@ -1282,9 +1301,9 @@ pub trait LayoutNodeHelpers<'dom> {
|
||||||
|
|
||||||
fn children_count(self) -> u32;
|
fn children_count(self) -> u32;
|
||||||
|
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>;
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>;
|
||||||
unsafe fn init_style_and_layout_data(self, data: OpaqueStyleAndLayoutData);
|
unsafe fn init_style_and_opaque_layout_data(self, data: Box<StyleAndOpaqueLayoutData>);
|
||||||
unsafe fn take_style_and_layout_data(self) -> OpaqueStyleAndLayoutData;
|
unsafe fn take_style_and_opaque_layout_data(self) -> Box<StyleAndOpaqueLayoutData>;
|
||||||
|
|
||||||
fn text_content(self) -> Cow<'dom, str>;
|
fn text_content(self) -> Cow<'dom, str>;
|
||||||
fn selection(self) -> Option<Range<usize>>;
|
fn selection(self) -> Option<Range<usize>>;
|
||||||
|
@ -1410,13 +1429,13 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> {
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
|
||||||
unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_ref() }
|
unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_deref() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn init_style_and_layout_data(self, val: OpaqueStyleAndLayoutData) {
|
unsafe fn init_style_and_opaque_layout_data(self, val: Box<StyleAndOpaqueLayoutData>) {
|
||||||
let data = &mut *self.unsafe_get().style_and_layout_data.get();
|
let data = &mut *self.unsafe_get().style_and_layout_data.get();
|
||||||
debug_assert!(data.is_none());
|
debug_assert!(data.is_none());
|
||||||
*data = Some(val);
|
*data = Some(val);
|
||||||
|
@ -1424,7 +1443,7 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe fn take_style_and_layout_data(self) -> OpaqueStyleAndLayoutData {
|
unsafe fn take_style_and_opaque_layout_data(self) -> Box<StyleAndOpaqueLayoutData> {
|
||||||
(*self.unsafe_get().style_and_layout_data.get())
|
(*self.unsafe_get().style_and_layout_data.get())
|
||||||
.take()
|
.take()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
|
|
@ -131,7 +131,7 @@ use style::dom::OpaqueNode;
|
||||||
use style::error_reporting::{ContextualParseError, ParseErrorReporter};
|
use style::error_reporting::{ContextualParseError, ParseErrorReporter};
|
||||||
use style::media_queries;
|
use style::media_queries;
|
||||||
use style::parser::ParserContext as CssParserContext;
|
use style::parser::ParserContext as CssParserContext;
|
||||||
use style::properties::{ComputedValues, PropertyId};
|
use style::properties::PropertyId;
|
||||||
use style::selector_parser::PseudoElement;
|
use style::selector_parser::PseudoElement;
|
||||||
use style::str::HTML_SPACE_CHARACTERS;
|
use style::str::HTML_SPACE_CHARACTERS;
|
||||||
use style::stylesheets::CssRuleType;
|
use style::stylesheets::CssRuleType;
|
||||||
|
@ -1904,13 +1904,6 @@ impl Window {
|
||||||
(element, response.rect)
|
(element, response.rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn style_query(&self, node: TrustedNodeAddress) -> Option<servo_arc::Arc<ComputedValues>> {
|
|
||||||
if !self.layout_reflow(QueryMsg::StyleQuery(node)) {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
self.layout_rpc.style().0
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn text_index_query(
|
pub fn text_index_query(
|
||||||
&self,
|
&self,
|
||||||
node: &Node,
|
node: &Node,
|
||||||
|
@ -2461,7 +2454,7 @@ fn debug_reflow_events(id: PipelineId, reflow_goal: &ReflowGoal, reason: &Reflow
|
||||||
&QueryMsg::NodeScrollIdQuery(_n) => "\tNodeScrollIdQuery",
|
&QueryMsg::NodeScrollIdQuery(_n) => "\tNodeScrollIdQuery",
|
||||||
&QueryMsg::ResolvedStyleQuery(_, _, _) => "\tResolvedStyleQuery",
|
&QueryMsg::ResolvedStyleQuery(_, _, _) => "\tResolvedStyleQuery",
|
||||||
&QueryMsg::OffsetParentQuery(_n) => "\tOffsetParentQuery",
|
&QueryMsg::OffsetParentQuery(_n) => "\tOffsetParentQuery",
|
||||||
&QueryMsg::StyleQuery(_n) => "\tStyleQuery",
|
&QueryMsg::StyleQuery => "\tStyleQuery",
|
||||||
&QueryMsg::TextIndexQuery(..) => "\tTextIndexQuery",
|
&QueryMsg::TextIndexQuery(..) => "\tTextIndexQuery",
|
||||||
&QueryMsg::ElementInnerTextQuery(_) => "\tElementInnerTextQuery",
|
&QueryMsg::ElementInnerTextQuery(_) => "\tElementInnerTextQuery",
|
||||||
&QueryMsg::InnerWindowDimensionsQuery(_) => "\tInnerWindowDimensionsQuery",
|
&QueryMsg::InnerWindowDimensionsQuery(_) => "\tInnerWindowDimensionsQuery",
|
||||||
|
|
|
@ -29,12 +29,13 @@ use std::any::Any;
|
||||||
use std::sync::atomic::AtomicIsize;
|
use std::sync::atomic::AtomicIsize;
|
||||||
use style::data::ElementData;
|
use style::data::ElementData;
|
||||||
|
|
||||||
#[repr(C)]
|
#[derive(MallocSizeOf)]
|
||||||
pub struct StyleData {
|
pub struct StyleData {
|
||||||
/// Data that the style system associates with a node. When the
|
/// Data that the style system associates with a node. When the
|
||||||
/// style system is being used standalone, this is all that hangs
|
/// style system is being used standalone, this is all that hangs
|
||||||
/// off the node. This must be first to permit the various
|
/// off the node. This must be first to permit the various
|
||||||
/// transmutations between ElementData and PersistentLayoutData.
|
/// transmutations between ElementData and PersistentLayoutData.
|
||||||
|
#[ignore_malloc_size_of = "This probably should not be ignored"]
|
||||||
pub element_data: AtomicRefCell<ElementData>,
|
pub element_data: AtomicRefCell<ElementData>,
|
||||||
|
|
||||||
/// Information needed during parallel traversals.
|
/// Information needed during parallel traversals.
|
||||||
|
@ -50,37 +51,33 @@ impl StyleData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type StyleAndOpaqueLayoutData = StyleAndGenericData<dyn Any + Send + Sync>;
|
||||||
|
|
||||||
#[derive(MallocSizeOf)]
|
#[derive(MallocSizeOf)]
|
||||||
pub struct OpaqueStyleAndLayoutData {
|
pub struct StyleAndGenericData<T>
|
||||||
// NB: We really store a `StyleAndLayoutData` here, so be careful!
|
where
|
||||||
|
T: ?Sized,
|
||||||
|
{
|
||||||
|
/// The style data.
|
||||||
|
pub style_data: StyleData,
|
||||||
|
/// The opaque layout data.
|
||||||
#[ignore_malloc_size_of = "Trait objects are hard"]
|
#[ignore_malloc_size_of = "Trait objects are hard"]
|
||||||
ptr: Box<dyn Any + Send + Sync>,
|
pub generic_data: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OpaqueStyleAndLayoutData {
|
impl StyleAndOpaqueLayoutData {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new<T>(value: T) -> Self
|
pub fn new<T>(style_data: StyleData, layout_data: T) -> Box<Self>
|
||||||
where
|
where
|
||||||
T: Any + Send + Sync,
|
T: Any + Send + Sync,
|
||||||
{
|
{
|
||||||
Self {
|
Box::new(StyleAndGenericData {
|
||||||
ptr: Box::new(value) as Box<dyn Any + Send + Sync>,
|
style_data,
|
||||||
}
|
generic_data: layout_data,
|
||||||
}
|
})
|
||||||
|
|
||||||
/// Extremely cursed.
|
|
||||||
#[inline]
|
|
||||||
pub fn downcast_ref<T>(&self) -> Option<&T>
|
|
||||||
where
|
|
||||||
T: Any + Send + Sync,
|
|
||||||
{
|
|
||||||
self.ptr.downcast_ref()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
|
||||||
unsafe impl Send for OpaqueStyleAndLayoutData {}
|
|
||||||
|
|
||||||
/// Information that we need stored in each DOM node.
|
/// Information that we need stored in each DOM node.
|
||||||
#[derive(MallocSizeOf)]
|
#[derive(MallocSizeOf)]
|
||||||
pub struct DomParallelInfo {
|
pub struct DomParallelInfo {
|
||||||
|
|
|
@ -122,7 +122,7 @@ pub enum QueryMsg {
|
||||||
// garbage values such as `0xdeadbeef as *const _`, this is unsound.
|
// garbage values such as `0xdeadbeef as *const _`, this is unsound.
|
||||||
NodeScrollIdQuery(TrustedNodeAddress),
|
NodeScrollIdQuery(TrustedNodeAddress),
|
||||||
ResolvedStyleQuery(TrustedNodeAddress, Option<PseudoElement>, PropertyId),
|
ResolvedStyleQuery(TrustedNodeAddress, Option<PseudoElement>, PropertyId),
|
||||||
StyleQuery(TrustedNodeAddress),
|
StyleQuery,
|
||||||
ElementInnerTextQuery(TrustedNodeAddress),
|
ElementInnerTextQuery(TrustedNodeAddress),
|
||||||
InnerWindowDimensionsQuery(BrowsingContextId),
|
InnerWindowDimensionsQuery(BrowsingContextId),
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ impl ReflowGoal {
|
||||||
QueryMsg::NodeScrollIdQuery(_) |
|
QueryMsg::NodeScrollIdQuery(_) |
|
||||||
QueryMsg::ResolvedStyleQuery(..) |
|
QueryMsg::ResolvedStyleQuery(..) |
|
||||||
QueryMsg::OffsetParentQuery(_) |
|
QueryMsg::OffsetParentQuery(_) |
|
||||||
QueryMsg::StyleQuery(_) => false,
|
QueryMsg::StyleQuery => false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ impl ReflowGoal {
|
||||||
QueryMsg::ResolvedStyleQuery(..) |
|
QueryMsg::ResolvedStyleQuery(..) |
|
||||||
QueryMsg::OffsetParentQuery(_) |
|
QueryMsg::OffsetParentQuery(_) |
|
||||||
QueryMsg::InnerWindowDimensionsQuery(_) |
|
QueryMsg::InnerWindowDimensionsQuery(_) |
|
||||||
QueryMsg::StyleQuery(_) => false,
|
QueryMsg::StyleQuery => false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,6 @@ use app_units::Au;
|
||||||
use euclid::default::Rect;
|
use euclid::default::Rect;
|
||||||
use euclid::Size2D;
|
use euclid::Size2D;
|
||||||
use script_traits::UntrustedNodeAddress;
|
use script_traits::UntrustedNodeAddress;
|
||||||
use servo_arc::Arc;
|
|
||||||
use style::properties::ComputedValues;
|
|
||||||
use style_traits::CSSPixel;
|
use style_traits::CSSPixel;
|
||||||
use webrender_api::ExternalScrollId;
|
use webrender_api::ExternalScrollId;
|
||||||
|
|
||||||
|
@ -33,9 +31,6 @@ pub trait LayoutRPC {
|
||||||
/// Query layout for the resolved value of a given CSS property
|
/// Query layout for the resolved value of a given CSS property
|
||||||
fn resolved_style(&self) -> ResolvedStyleResponse;
|
fn resolved_style(&self) -> ResolvedStyleResponse;
|
||||||
fn offset_parent(&self) -> OffsetParentResponse;
|
fn offset_parent(&self) -> OffsetParentResponse;
|
||||||
/// Requests the styles for an element. Contains a `None` value if the element is in a `display:
|
|
||||||
/// none` subtree.
|
|
||||||
fn style(&self) -> StyleResponse;
|
|
||||||
fn text_index(&self) -> TextIndexResponse;
|
fn text_index(&self) -> TextIndexResponse;
|
||||||
/// Requests the list of nodes from the given point.
|
/// Requests the list of nodes from the given point.
|
||||||
fn nodes_from_point_response(&self) -> Vec<UntrustedNodeAddress>;
|
fn nodes_from_point_response(&self) -> Vec<UntrustedNodeAddress>;
|
||||||
|
@ -72,8 +67,5 @@ impl OffsetParentResponse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct StyleResponse(pub Option<Arc<ComputedValues>>);
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct TextIndexResponse(pub Option<usize>);
|
pub struct TextIndexResponse(pub Option<usize>);
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
use crate::HTMLCanvasData;
|
use crate::HTMLCanvasData;
|
||||||
use crate::HTMLMediaData;
|
use crate::HTMLMediaData;
|
||||||
use crate::LayoutNodeType;
|
use crate::LayoutNodeType;
|
||||||
use crate::OpaqueStyleAndLayoutData;
|
|
||||||
use crate::SVGSVGData;
|
use crate::SVGSVGData;
|
||||||
|
use crate::StyleAndOpaqueLayoutData;
|
||||||
use atomic_refcell::AtomicRef;
|
use atomic_refcell::AtomicRef;
|
||||||
use gfx_traits::{combine_id_with_fragment_type, ByteIndex, FragmentType};
|
use gfx_traits::{combine_id_with_fragment_type, ByteIndex, FragmentType};
|
||||||
use html5ever::{LocalName, Namespace};
|
use html5ever::{LocalName, Namespace};
|
||||||
|
@ -79,13 +79,13 @@ impl PseudoElementType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait to abstract access to layout data across various data structures.
|
/// Trait to abstract access to layout data across various data structures.
|
||||||
pub trait GetLayoutData<'dom> {
|
pub trait GetStyleAndOpaqueLayoutData<'dom> {
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>;
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A wrapper so that layout can access only the methods that it should have access to. Layout must
|
/// A wrapper so that layout can access only the methods that it should have access to. Layout must
|
||||||
/// only ever see these and must never see instances of `LayoutDom`.
|
/// only ever see these and must never see instances of `LayoutDom`.
|
||||||
pub trait LayoutNode<'dom>: Debug + GetLayoutData<'dom> + TNode {
|
pub trait LayoutNode<'dom>: Debug + GetStyleAndOpaqueLayoutData<'dom> + TNode {
|
||||||
type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<'dom>;
|
type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<'dom>;
|
||||||
fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode;
|
fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode;
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ pub trait LayoutNode<'dom>: Debug + GetLayoutData<'dom> + TNode {
|
||||||
fn type_id(&self) -> LayoutNodeType;
|
fn type_id(&self) -> LayoutNodeType;
|
||||||
|
|
||||||
unsafe fn initialize_data(&self);
|
unsafe fn initialize_data(&self);
|
||||||
unsafe fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData);
|
unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>);
|
||||||
unsafe fn take_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData;
|
unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData>;
|
||||||
|
|
||||||
fn rev_children(self) -> LayoutIterator<ReverseChildrenIterator<Self>> {
|
fn rev_children(self) -> LayoutIterator<ReverseChildrenIterator<Self>> {
|
||||||
LayoutIterator(ReverseChildrenIterator {
|
LayoutIterator(ReverseChildrenIterator {
|
||||||
|
@ -160,7 +160,7 @@ where
|
||||||
/// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout
|
/// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout
|
||||||
/// node does not allow any parents or siblings of nodes to be accessed, to avoid races.
|
/// node does not allow any parents or siblings of nodes to be accessed, to avoid races.
|
||||||
pub trait ThreadSafeLayoutNode<'dom>:
|
pub trait ThreadSafeLayoutNode<'dom>:
|
||||||
Clone + Copy + Debug + GetLayoutData<'dom> + NodeInfo + PartialEq + Sized
|
Clone + Copy + Debug + GetStyleAndOpaqueLayoutData<'dom> + NodeInfo + PartialEq + Sized
|
||||||
{
|
{
|
||||||
type ConcreteNode: LayoutNode<'dom, ConcreteThreadSafeLayoutNode = Self>;
|
type ConcreteNode: LayoutNode<'dom, ConcreteThreadSafeLayoutNode = Self>;
|
||||||
type ConcreteElement: TElement;
|
type ConcreteElement: TElement;
|
||||||
|
@ -224,7 +224,7 @@ pub trait ThreadSafeLayoutNode<'dom>:
|
||||||
.map_or(PseudoElementType::Normal, |el| el.get_pseudo_element_type())
|
.map_or(PseudoElementType::Normal, |el| el.get_pseudo_element_type())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>;
|
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>;
|
||||||
|
|
||||||
fn style(&self, context: &SharedStyleContext) -> Arc<ComputedValues> {
|
fn style(&self, context: &SharedStyleContext) -> Arc<ComputedValues> {
|
||||||
if let Some(el) = self.as_element() {
|
if let Some(el) = self.as_element() {
|
||||||
|
@ -314,7 +314,12 @@ pub trait DangerousThreadSafeLayoutNode<'dom>: ThreadSafeLayoutNode<'dom> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ThreadSafeLayoutElement<'dom>:
|
pub trait ThreadSafeLayoutElement<'dom>:
|
||||||
Clone + Copy + Sized + Debug + ::selectors::Element<Impl = SelectorImpl> + GetLayoutData<'dom>
|
Clone
|
||||||
|
+ Copy
|
||||||
|
+ Sized
|
||||||
|
+ Debug
|
||||||
|
+ ::selectors::Element<Impl = SelectorImpl>
|
||||||
|
+ GetStyleAndOpaqueLayoutData<'dom>
|
||||||
{
|
{
|
||||||
type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<
|
type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<
|
||||||
'dom,
|
'dom,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue