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

Closes #7115.
This commit is contained in:
Patrick Walton 2015-08-14 15:10:16 -07:00 committed by Ms2ger
parent 14b921ee29
commit a516042edb
3 changed files with 40 additions and 9 deletions

View file

@ -1276,14 +1276,23 @@ impl LayoutTask {
&self.url, &self.url,
reflow_info.goal); reflow_info.goal);
{ 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. // 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 mut root_flow = (*root_flow).clone();
let animations = &*rw_data.running_animations; let animations = &*rw_data.running_animations;
profile(time::ProfilerCategory::LayoutStyleRecalc, profile(time::ProfilerCategory::LayoutStyleRecalc,
self.profiler_metadata(), self.profiler_metadata(),
self.time_profiler_chan.clone(), self.time_profiler_chan.clone(),
|| animation::recalc_style_for_animations(root_flow.deref_mut(), animations)); || {
animation::recalc_style_for_animations(root_flow.deref_mut(),
animations)
});
}
} }
self.perform_post_style_recalc_layout_passes(&reflow_info, self.perform_post_style_recalc_layout_passes(&reflow_info,

View file

@ -767,6 +767,12 @@
"url": "/_mozilla/mozilla/window_performance.html" "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": [ "mozilla/window_setInterval.html": [
{ {
"path": "mozilla/window_setInterval.html", "path": "mozilla/window_setInterval.html",

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>