mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Auto merge of #6031 - glennw:reftest-race-conditions, r=larsberg,jdm
The basic idea is it's safe to output an image for reftest by testing: - That the compositor doesn't have any animations active. - That the compositor is not waiting on any outstanding paint messages to arrive. - That the script tasks are "idle" and therefore won't cause reflow. - This currently means page loaded, onload fired, reftest-wait not active, first reflow triggered. - It could easily be expanded to handle pending timers etc. - That the "epoch" that the layout tasks have last laid out after script went idle, is reflected by the compositor in all visible layers for that pipeline. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6031) <!-- Reviewable:end -->
This commit is contained in:
commit
5e61ebaa05
17 changed files with 363 additions and 390 deletions
|
@ -39,7 +39,7 @@ use gfx::paint_task::Msg as PaintMsg;
|
|||
use gfx::paint_task::{PaintChan, PaintLayer};
|
||||
use layout_traits::{LayoutControlMsg, LayoutTaskFactory};
|
||||
use log;
|
||||
use msg::compositor_msg::ScrollPolicy;
|
||||
use msg::compositor_msg::{Epoch, ScrollPolicy};
|
||||
use msg::constellation_msg::Msg as ConstellationMsg;
|
||||
use msg::constellation_msg::{ConstellationChan, Failure, PipelineExitType, PipelineId};
|
||||
use profile_traits::mem::{self, Report, ReportsChan};
|
||||
|
@ -124,6 +124,9 @@ pub struct LayoutTaskData {
|
|||
/// A channel on which new animations that have been triggered by style recalculation can be
|
||||
/// sent.
|
||||
pub new_animations_sender: Sender<Animation>,
|
||||
|
||||
/// A counter for epoch messages
|
||||
epoch: Epoch,
|
||||
}
|
||||
|
||||
/// Information needed by the layout task.
|
||||
|
@ -329,6 +332,7 @@ impl LayoutTask {
|
|||
running_animations: Vec::new(),
|
||||
new_animations_receiver: new_animations_receiver,
|
||||
new_animations_sender: new_animations_sender,
|
||||
epoch: Epoch(0),
|
||||
})),
|
||||
}
|
||||
}
|
||||
|
@ -405,6 +409,10 @@ impl LayoutTask {
|
|||
LayoutControlMsg::TickAnimations => {
|
||||
self.handle_request_helper(Msg::TickAnimations, possibly_locked_rw_data)
|
||||
}
|
||||
LayoutControlMsg::GetCurrentEpoch(sender) => {
|
||||
self.handle_request_helper(Msg::GetCurrentEpoch(sender),
|
||||
possibly_locked_rw_data)
|
||||
}
|
||||
LayoutControlMsg::ExitNow(exit_type) => {
|
||||
self.handle_request_helper(Msg::ExitNow(exit_type),
|
||||
possibly_locked_rw_data)
|
||||
|
@ -509,8 +517,11 @@ impl LayoutTask {
|
|||
Msg::CollectReports(reports_chan) => {
|
||||
self.collect_reports(reports_chan, possibly_locked_rw_data);
|
||||
},
|
||||
Msg::GetCurrentEpoch(sender) => {
|
||||
let rw_data = self.lock_rw_data(possibly_locked_rw_data);
|
||||
sender.send(rw_data.epoch).unwrap();
|
||||
},
|
||||
Msg::PrepareToExit(response_chan) => {
|
||||
debug!("layout: PrepareToExitMsg received");
|
||||
self.prepare_to_exit(response_chan, possibly_locked_rw_data);
|
||||
return false
|
||||
},
|
||||
|
@ -825,7 +836,8 @@ impl LayoutTask {
|
|||
|
||||
debug!("Layout done!");
|
||||
|
||||
self.paint_chan.send(PaintMsg::PaintInit(stacking_context));
|
||||
rw_data.epoch.next();
|
||||
self.paint_chan.send(PaintMsg::PaintInit(rw_data.epoch, stacking_context));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue