mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #22684 - servo:next-layout, r=emilio,SimonSapin
Some janitoring over the layout crate This PR moves a bunch of code around and makes some methods from one-use traits into inherent methods. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22684) <!-- Reviewable:end -->
This commit is contained in:
commit
c242abd999
24 changed files with 386 additions and 805 deletions
|
@ -85,7 +85,6 @@ use net_traits::{Metadata, NetworkError, ReferrerPolicy, ResourceFetchTiming, Re
|
|||
use offscreen_gl_context::GLLimits;
|
||||
use profile_traits::mem::ProfilerChan as MemProfilerChan;
|
||||
use profile_traits::time::ProfilerChan as TimeProfilerChan;
|
||||
use script_layout_interface::reporter::CSSErrorReporter;
|
||||
use script_layout_interface::rpc::LayoutRPC;
|
||||
use script_layout_interface::OpaqueStyleAndLayoutData;
|
||||
use script_traits::DrawAPaintImageResult;
|
||||
|
@ -116,6 +115,7 @@ use std::sync::{Arc, Mutex};
|
|||
use std::time::{Instant, SystemTime};
|
||||
use style::attr::{AttrIdentifier, AttrValue, LengthOrPercentageOrAuto};
|
||||
use style::context::QuirksMode;
|
||||
use style::dom::OpaqueNode;
|
||||
use style::element_state::*;
|
||||
use style::media_queries::MediaList;
|
||||
use style::properties::PropertyDeclarationBlock;
|
||||
|
@ -419,7 +419,7 @@ unsafe_no_jsmanaged_fields!(BufferQueue, QuirksMode, StrTendril);
|
|||
unsafe_no_jsmanaged_fields!(Runtime);
|
||||
unsafe_no_jsmanaged_fields!(HeaderMap, Method);
|
||||
unsafe_no_jsmanaged_fields!(WindowProxyHandler);
|
||||
unsafe_no_jsmanaged_fields!(UntrustedNodeAddress);
|
||||
unsafe_no_jsmanaged_fields!(UntrustedNodeAddress, OpaqueNode);
|
||||
unsafe_no_jsmanaged_fields!(LengthOrPercentageOrAuto);
|
||||
unsafe_no_jsmanaged_fields!(RGBA);
|
||||
unsafe_no_jsmanaged_fields!(StorageType);
|
||||
|
@ -455,7 +455,6 @@ unsafe_no_jsmanaged_fields!(Instant);
|
|||
unsafe_no_jsmanaged_fields!(RelativePos);
|
||||
unsafe_no_jsmanaged_fields!(OpaqueStyleAndLayoutData);
|
||||
unsafe_no_jsmanaged_fields!(PathBuf);
|
||||
unsafe_no_jsmanaged_fields!(CSSErrorReporter);
|
||||
unsafe_no_jsmanaged_fields!(DrawAPaintImageResult);
|
||||
unsafe_no_jsmanaged_fields!(DocumentId);
|
||||
unsafe_no_jsmanaged_fields!(ImageKey);
|
||||
|
|
|
@ -69,7 +69,7 @@ use base64;
|
|||
use bluetooth_traits::BluetoothRequest;
|
||||
use canvas_traits::webgl::WebGLChan;
|
||||
use crossbeam_channel::{unbounded, Sender, TryRecvError};
|
||||
use cssparser::{Parser, ParserInput};
|
||||
use cssparser::{Parser, ParserInput, SourceLocation};
|
||||
use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType};
|
||||
use dom_struct::dom_struct;
|
||||
use embedder_traits::EmbedderMsg;
|
||||
|
@ -94,7 +94,6 @@ use profile_traits::ipc as ProfiledIpc;
|
|||
use profile_traits::mem::ProfilerChan as MemProfilerChan;
|
||||
use profile_traits::time::ProfilerChan as TimeProfilerChan;
|
||||
use script_layout_interface::message::{Msg, QueryMsg, Reflow, ReflowGoal, ScriptReflow};
|
||||
use script_layout_interface::reporter::CSSErrorReporter;
|
||||
use script_layout_interface::rpc::{ContentBoxResponse, ContentBoxesResponse, LayoutRPC};
|
||||
use script_layout_interface::rpc::{
|
||||
NodeScrollIdResponse, ResolvedStyleResponse, TextIndexResponse,
|
||||
|
@ -103,7 +102,7 @@ use script_layout_interface::{PendingImageState, TrustedNodeAddress};
|
|||
use script_traits::webdriver_msg::{WebDriverJSError, WebDriverJSResult};
|
||||
use script_traits::{ConstellationControlMsg, DocumentState, LoadData};
|
||||
use script_traits::{ScriptMsg, ScriptToConstellationChan, ScrollState, TimerEvent, TimerEventId};
|
||||
use script_traits::{TimerSchedulerMsg, UntrustedNodeAddress, WindowSizeData, WindowSizeType};
|
||||
use script_traits::{TimerSchedulerMsg, WindowSizeData, WindowSizeType};
|
||||
use selectors::attr::CaseSensitivity;
|
||||
use servo_config::opts;
|
||||
use servo_geometry::{f32_rect_to_au_rect, MaxRect};
|
||||
|
@ -120,7 +119,8 @@ use std::mem;
|
|||
use std::rc::Rc;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use style::error_reporting::ParseErrorReporter;
|
||||
use style::dom::OpaqueNode;
|
||||
use style::error_reporting::{ContextualParseError, ParseErrorReporter};
|
||||
use style::media_queries;
|
||||
use style::parser::ParserContext as CssParserContext;
|
||||
use style::properties::{ComputedValues, PropertyId};
|
||||
|
@ -248,7 +248,7 @@ pub struct Window {
|
|||
error_reporter: CSSErrorReporter,
|
||||
|
||||
/// A list of scroll offsets for each scrollable element.
|
||||
scroll_offsets: DomRefCell<HashMap<UntrustedNodeAddress, Vector2D<f32>>>,
|
||||
scroll_offsets: DomRefCell<HashMap<OpaqueNode, Vector2D<f32>>>,
|
||||
|
||||
/// All the MediaQueryLists we need to update
|
||||
media_query_lists: DOMTracker<MediaQueryList>,
|
||||
|
@ -390,7 +390,7 @@ impl Window {
|
|||
/// Sets a new list of scroll offsets.
|
||||
///
|
||||
/// This is called when layout gives us new ones and WebRender is in use.
|
||||
pub fn set_scroll_offsets(&self, offsets: HashMap<UntrustedNodeAddress, Vector2D<f32>>) {
|
||||
pub fn set_scroll_offsets(&self, offsets: HashMap<OpaqueNode, Vector2D<f32>>) {
|
||||
*self.scroll_offsets.borrow_mut() = offsets
|
||||
}
|
||||
|
||||
|
@ -1602,11 +1602,7 @@ impl Window {
|
|||
}
|
||||
|
||||
pub fn scroll_offset_query(&self, node: &Node) -> Vector2D<f32> {
|
||||
if let Some(scroll_offset) = self
|
||||
.scroll_offsets
|
||||
.borrow()
|
||||
.get(&node.to_untrusted_node_address())
|
||||
{
|
||||
if let Some(scroll_offset) = self.scroll_offsets.borrow().get(&node.to_opaque()) {
|
||||
return *scroll_offset;
|
||||
}
|
||||
Vector2D::new(0.0, 0.0)
|
||||
|
@ -1621,10 +1617,9 @@ impl Window {
|
|||
// The scroll offsets are immediatly updated since later calls
|
||||
// to topScroll and others may access the properties before
|
||||
// webrender has a chance to update the offsets.
|
||||
self.scroll_offsets.borrow_mut().insert(
|
||||
node.to_untrusted_node_address(),
|
||||
Vector2D::new(x_ as f32, y_ as f32),
|
||||
);
|
||||
self.scroll_offsets
|
||||
.borrow_mut()
|
||||
.insert(node.to_opaque(), Vector2D::new(x_ as f32, y_ as f32));
|
||||
|
||||
let NodeScrollIdResponse(scroll_id) = self.layout_rpc.node_scroll_id();
|
||||
|
||||
|
@ -2242,3 +2237,41 @@ impl Window {
|
|||
));
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, MallocSizeOf)]
|
||||
pub struct CSSErrorReporter {
|
||||
pub pipelineid: PipelineId,
|
||||
// Arc+Mutex combo is necessary to make this struct Sync,
|
||||
// which is necessary to fulfill the bounds required by the
|
||||
// uses of the ParseErrorReporter trait.
|
||||
#[ignore_malloc_size_of = "Arc is defined in libstd"]
|
||||
pub script_chan: Arc<Mutex<IpcSender<ConstellationControlMsg>>>,
|
||||
}
|
||||
unsafe_no_jsmanaged_fields!(CSSErrorReporter);
|
||||
|
||||
impl ParseErrorReporter for CSSErrorReporter {
|
||||
fn report_error(&self, url: &ServoUrl, location: SourceLocation, error: ContextualParseError) {
|
||||
if log_enabled!(log::Level::Info) {
|
||||
info!(
|
||||
"Url:\t{}\n{}:{} {}",
|
||||
url.as_str(),
|
||||
location.line,
|
||||
location.column,
|
||||
error
|
||||
)
|
||||
}
|
||||
|
||||
//TODO: report a real filename
|
||||
let _ = self
|
||||
.script_chan
|
||||
.lock()
|
||||
.unwrap()
|
||||
.send(ConstellationControlMsg::ReportCSSError(
|
||||
self.pipelineid,
|
||||
url.to_string(),
|
||||
location.line,
|
||||
location.column,
|
||||
error.to_string(),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -118,7 +118,7 @@ use net_traits::{
|
|||
};
|
||||
use profile_traits::mem::{self as profile_mem, OpaqueSender, ReportsChan};
|
||||
use profile_traits::time::{self as profile_time, profile, ProfilerCategory};
|
||||
use script_layout_interface::message::{self, Msg, NewLayoutThreadInfo, ReflowGoal};
|
||||
use script_layout_interface::message::{self, LayoutThreadInit, Msg, ReflowGoal};
|
||||
use script_traits::webdriver_msg::WebDriverScriptCommand;
|
||||
use script_traits::CompositorEvent::{
|
||||
CompositionEvent, KeyboardEvent, MouseButtonEvent, MouseMoveEvent, ResizeEvent, TouchEvent,
|
||||
|
@ -146,6 +146,7 @@ use std::result::Result;
|
|||
use std::sync::Arc;
|
||||
use std::thread;
|
||||
use std::time::{Duration, SystemTime};
|
||||
use style::dom::OpaqueNode;
|
||||
use style::thread_state::{self, ThreadState};
|
||||
use time::{at_utc, get_time, precise_time_ns, Timespec};
|
||||
use url::percent_encoding::percent_decode;
|
||||
|
@ -1914,7 +1915,7 @@ impl ScriptThread {
|
|||
if node_address == UntrustedNodeAddress(ptr::null()) {
|
||||
window.update_viewport_for_scroll(-scroll_offset.x, -scroll_offset.y);
|
||||
} else {
|
||||
scroll_offsets.insert(node_address, -*scroll_offset);
|
||||
scroll_offsets.insert(OpaqueNode(node_address.0 as usize), -*scroll_offset);
|
||||
}
|
||||
}
|
||||
window.set_scroll_offsets(scroll_offsets)
|
||||
|
@ -1936,7 +1937,7 @@ impl ScriptThread {
|
|||
let layout_pair = unbounded();
|
||||
let layout_chan = layout_pair.0.clone();
|
||||
|
||||
let msg = message::Msg::CreateLayoutThread(NewLayoutThreadInfo {
|
||||
let msg = message::Msg::CreateLayoutThread(LayoutThreadInit {
|
||||
id: new_pipeline_id,
|
||||
url: load_data.url.clone(),
|
||||
is_parent: false,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue