aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_thread/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_thread/lib.rs')
-rw-r--r--components/layout_thread/lib.rs42
1 files changed, 29 insertions, 13 deletions
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index 566d6c7ca33..32708911484 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -114,8 +114,9 @@ use style::error_reporting::StdoutErrorReporter;
use style::logical_geometry::LogicalPoint;
use style::media_queries::{Device, MediaType};
use style::parser::ParserContextExtraData;
+use style::servo::AUTHOR_SHARED_LOCK;
use style::servo::restyle_damage::{REFLOW, REFLOW_OUT_OF_FLOW, REPAINT, REPOSITION, STORE_OVERFLOW};
-use style::shared_lock::{SharedRwLock, SharedRwLockReadGuard};
+use style::shared_lock::{SharedRwLock, SharedRwLockReadGuard, ReadGuards};
use style::stylesheets::{Origin, Stylesheet, UserAgentStylesheets};
use style::stylist::Stylist;
use style::thread_state;
@@ -215,7 +216,7 @@ pub struct LayoutThread {
WebRenderImageInfo,
BuildHasherDefault<FnvHasher>>>>,
- // Webrender interface.
+ /// Webrender interface.
webrender_api: webrender_traits::RenderApi,
/// The timer object to control the timing of the animations. This should
@@ -498,16 +499,18 @@ impl LayoutThread {
}
// Create a layout context for use in building display lists, hit testing, &c.
- fn build_layout_context(&self,
- rw_data: &LayoutThreadData,
- request_images: bool)
- -> LayoutContext {
+ fn build_layout_context<'a>(&self,
+ guards: ReadGuards<'a>,
+ rw_data: &LayoutThreadData,
+ request_images: bool)
+ -> LayoutContext<'a> {
let thread_local_style_context_creation_data =
ThreadLocalStyleContextCreationInfo::new(self.new_animations_sender.clone());
LayoutContext {
style_context: SharedStyleContext {
stylist: rw_data.stylist.clone(),
+ guards: guards,
running_animations: self.running_animations.clone(),
expired_animations: self.expired_animations.clone(),
error_reporter: Box::new(self.error_reporter.clone()),
@@ -941,7 +944,6 @@ impl LayoutThread {
possibly_locked_rw_data: &mut RwData<'a, 'b>) {
let document = unsafe { ServoLayoutNode::new(&data.document) };
let document = document.as_document().unwrap();
- let style_guard = document.style_shared_lock().read();
self.quirks_mode = Some(document.quirks_mode());
// FIXME(pcwalton): Combine `ReflowGoal` and `ReflowQueryType`. Then remove this assert.
@@ -1017,9 +1019,11 @@ impl LayoutThread {
Au::from_f32_px(initial_viewport.height));
// Calculate the actual viewport as per DEVICE-ADAPT § 6
+
+ let author_guard = document.style_shared_lock().read();
let device = Device::new(MediaType::Screen, initial_viewport);
Arc::get_mut(&mut rw_data.stylist).unwrap()
- .set_device(device, &style_guard, &data.document_stylesheets);
+ .set_device(device, &author_guard, &data.document_stylesheets);
self.viewport_size =
rw_data.stylist.viewport_constraints().map_or(current_screen_size, |constraints| {
@@ -1063,10 +1067,16 @@ impl LayoutThread {
}
// If the entire flow tree is invalid, then it will be reflowed anyhow.
+ let ua_stylesheets = &*UA_STYLESHEETS;
+ let ua_or_user_guard = ua_stylesheets.shared_lock.read();
+ let guards = ReadGuards {
+ author: &author_guard,
+ ua_or_user: &ua_or_user_guard,
+ };
let needs_dirtying = Arc::get_mut(&mut rw_data.stylist).unwrap().update(
&data.document_stylesheets,
- &style_guard,
- Some(&*UA_STYLESHEETS),
+ &guards,
+ Some(ua_stylesheets),
data.stylesheets_changed);
let needs_reflow = viewport_size_changed && !needs_dirtying;
if needs_dirtying {
@@ -1113,7 +1123,7 @@ impl LayoutThread {
}
// Create a layout context for use throughout the following passes.
- let mut layout_context = self.build_layout_context(&*rw_data, true);
+ let mut layout_context = self.build_layout_context(guards.clone(), &*rw_data, true);
// NB: Type inference falls apart here for some reason, so we need to be very verbose. :-(
let traversal_driver = if self.parallel_flag && self.parallel_traversal.is_some() {
@@ -1172,7 +1182,7 @@ impl LayoutThread {
}
if opts::get().dump_rule_tree {
- layout_context.style_context.stylist.rule_tree.dump_stdout();
+ layout_context.style_context.stylist.rule_tree.dump_stdout(&guards);
}
// GC the rule tree if some heuristics are met.
@@ -1341,7 +1351,13 @@ impl LayoutThread {
page_clip_rect: max_rect(),
};
- let mut layout_context = self.build_layout_context(&*rw_data, false);
+ let author_guard = AUTHOR_SHARED_LOCK.read();
+ let ua_or_user_guard = UA_STYLESHEETS.shared_lock.read();
+ let guards = ReadGuards {
+ author: &author_guard,
+ ua_or_user: &ua_or_user_guard,
+ };
+ let mut layout_context = self.build_layout_context(guards, &*rw_data, false);
if let Some(mut root_flow) = self.root_flow.clone() {
// Perform an abbreviated style recalc that operates without access to the DOM.