Auto merge of #7294 - servo:tick-animations-with-no-layout-root, r=glennw+Ms2ger

layout: Don't panic if `requestAnimationFrame()` is called before first layout.

Closes #7115.

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/7294)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-08-20 05:17:47 -06:00
commit 8f05447a7b
3 changed files with 40 additions and 9 deletions

View file

@ -1276,14 +1276,23 @@ impl LayoutTask {
&self.url,
reflow_info.goal);
{
// Perform an abbreviated style recalc that operates without access to the DOM.
let mut root_flow = (*rw_data.root_flow.as_ref().unwrap()).clone();
let animations = &*rw_data.running_animations;
profile(time::ProfilerCategory::LayoutStyleRecalc,
self.profiler_metadata(),
self.time_profiler_chan.clone(),
|| animation::recalc_style_for_animations(root_flow.deref_mut(), animations));
match rw_data.root_flow.as_ref() {
None => {
// We haven't performed a single layout yet! Do nothing.
return
}
Some(ref root_flow) => {
// Perform an abbreviated style recalc that operates without access to the DOM.
let mut root_flow = (*root_flow).clone();
let animations = &*rw_data.running_animations;
profile(time::ProfilerCategory::LayoutStyleRecalc,
self.profiler_metadata(),
self.time_profiler_chan.clone(),
|| {
animation::recalc_style_for_animations(root_flow.deref_mut(),
animations)
});
}
}
self.perform_post_style_recalc_layout_passes(&reflow_info,

View file

@ -767,6 +767,12 @@
"url": "/_mozilla/mozilla/window_performance.html"
}
],
"mozilla/window_requestAnimationFrame.html": [
{
"path": "mozilla/window_requestAnimationFrame.html",
"url": "/_mozilla/mozilla/window_requestAnimationFrame.html"
}
],
"mozilla/window_setInterval.html": [
{
"path": "mozilla/window_setInterval.html",
@ -1040,4 +1046,4 @@
"rev": null,
"url_base": "/_mozilla/",
"version": 2
}
}

View file

@ -0,0 +1,16 @@
<html>
<head>
<title>Test throwing an error inside requestAnimationFrame callback</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
async_test(function() {
window.requestAnimationFrame(this.step_func_done());
// FIXME(#7296)
setTimeout(this.step_func_done(), 500);
});
</script>
</body>
</html>