script: Don't do anything before the window size comes in.

This fixes the `getBoundingClientRect()` content test.
This commit is contained in:
Patrick Walton 2013-12-13 18:03:35 -08:00
parent c5d81f13c1
commit 10150b0ec5
3 changed files with 23 additions and 21 deletions

View file

@ -388,6 +388,7 @@ impl Constellation {
self.image_cache_task.clone(), self.image_cache_task.clone(),
self.resource_task.clone(), self.resource_task.clone(),
self.profiler_chan.clone(), self.profiler_chan.clone(),
self.window_size,
self.opts.clone()); self.opts.clone());
let failure = ~"about:failure"; let failure = ~"about:failure";
let url = make_url(failure, None); let url = make_url(failure, None);
@ -409,6 +410,7 @@ impl Constellation {
self.image_cache_task.clone(), self.image_cache_task.clone(),
self.resource_task.clone(), self.resource_task.clone(),
self.profiler_chan.clone(), self.profiler_chan.clone(),
self.window_size,
self.opts.clone()); self.opts.clone());
pipeline.load(url); pipeline.load(url);
@ -545,6 +547,7 @@ impl Constellation {
self.image_cache_task.clone(), self.image_cache_task.clone(),
self.resource_task.clone(), self.resource_task.clone(),
self.profiler_chan.clone(), self.profiler_chan.clone(),
self.window_size,
self.opts.clone()) self.opts.clone())
}; };
@ -598,6 +601,7 @@ impl Constellation {
self.image_cache_task.clone(), self.image_cache_task.clone(),
self.resource_task.clone(), self.resource_task.clone(),
self.profiler_chan.clone(), self.profiler_chan.clone(),
self.window_size,
self.opts.clone()); self.opts.clone());
pipeline.load(url); pipeline.load(url);

View file

@ -6,6 +6,7 @@ use compositing::CompositorChan;
use layout::layout_task::LayoutTask; use layout::layout_task::LayoutTask;
use extra::url::Url; use extra::url::Url;
use geom::size::Size2D;
use gfx::opts::Opts; use gfx::opts::Opts;
use gfx::render_task::{PaintPermissionGranted, PaintPermissionRevoked}; use gfx::render_task::{PaintPermissionGranted, PaintPermissionRevoked};
use gfx::render_task::{RenderChan, RenderTask}; use gfx::render_task::{RenderChan, RenderTask};
@ -85,6 +86,7 @@ impl Pipeline {
image_cache_task: ImageCacheTask, image_cache_task: ImageCacheTask,
resource_task: ResourceTask, resource_task: ResourceTask,
profiler_chan: ProfilerChan, profiler_chan: ProfilerChan,
window_size: Size2D<uint>,
opts: Opts) opts: Opts)
-> Pipeline { -> Pipeline {
let (script_port, script_chan) = special_stream!(ScriptChan); let (script_port, script_chan) = special_stream!(ScriptChan);
@ -120,7 +122,8 @@ impl Pipeline {
script_chan.clone(), script_chan.clone(),
constellation_chan.clone(), constellation_chan.clone(),
resource_task, resource_task,
image_cache_task.clone()); image_cache_task.clone(),
window_size);
RenderTask::create(id, RenderTask::create(id,
render_port, render_port,

View file

@ -116,8 +116,8 @@ pub struct Page {
/// What parts of the document are dirty, if any. /// What parts of the document are dirty, if any.
damage: Option<DocumentDamage>, damage: Option<DocumentDamage>,
/// The current size of the window, in pixels. If `None`, we do not know the window size yet. /// The current size of the window, in pixels.
window_size: Option<Size2D<uint>>, window_size: Size2D<uint>,
js_info: Option<JSPageInfo>, js_info: Option<JSPageInfo>,
@ -146,7 +146,7 @@ pub struct PageTreeIterator<'self> {
} }
impl PageTree { impl PageTree {
fn new(id: PipelineId, layout_chan: LayoutChan) -> PageTree { fn new(id: PipelineId, layout_chan: LayoutChan, window_size: Size2D<uint>) -> PageTree {
PageTree { PageTree {
page: @mut Page { page: @mut Page {
id: id, id: id,
@ -154,7 +154,7 @@ impl PageTree {
layout_chan: layout_chan, layout_chan: layout_chan,
layout_join_port: None, layout_join_port: None,
damage: None, damage: None,
window_size: None, window_size: window_size,
js_info: None, js_info: None,
url: None, url: None,
next_subpage_id: SubpageId(0), next_subpage_id: SubpageId(0),
@ -296,14 +296,6 @@ impl Page {
} }
}; };
let window_size = match self.window_size {
None => {
debug!("not reflowing due to lack of a window size");
return
}
Some(window_size) => window_size,
};
match root { match root {
None => {}, None => {},
Some(root) => { Some(root) => {
@ -326,7 +318,7 @@ impl Page {
document_root: root, document_root: root,
url: self.url.get_ref().first().clone(), url: self.url.get_ref().first().clone(),
goal: goal, goal: goal,
window_size: window_size, window_size: self.window_size,
script_chan: script_chan, script_chan: script_chan,
script_join_chan: join_chan, script_join_chan: join_chan,
damage: replace(&mut self.damage, None).unwrap(), damage: replace(&mut self.damage, None).unwrap(),
@ -437,12 +429,13 @@ impl ScriptTask {
chan: ScriptChan, chan: ScriptChan,
constellation_chan: ConstellationChan, constellation_chan: ConstellationChan,
resource_task: ResourceTask, resource_task: ResourceTask,
img_cache_task: ImageCacheTask) img_cache_task: ImageCacheTask,
window_size: Size2D<uint>)
-> @mut ScriptTask { -> @mut ScriptTask {
let js_runtime = js::rust::rt(); let js_runtime = js::rust::rt();
let script_task = @mut ScriptTask { let script_task = @mut ScriptTask {
page_tree: PageTree::new(id, layout_chan), page_tree: PageTree::new(id, layout_chan, window_size),
image_cache_task: img_cache_task, image_cache_task: img_cache_task,
resource_task: resource_task, resource_task: resource_task,
@ -474,7 +467,8 @@ impl ScriptTask {
chan: ScriptChan, chan: ScriptChan,
constellation_chan: ConstellationChan, constellation_chan: ConstellationChan,
resource_task: ResourceTask, resource_task: ResourceTask,
image_cache_task: ImageCacheTask) { image_cache_task: ImageCacheTask,
window_size: Size2D<uint>) {
let parms = Cell::new((compositor, let parms = Cell::new((compositor,
layout_chan, layout_chan,
port, port,
@ -500,7 +494,8 @@ impl ScriptTask {
chan, chan,
constellation_chan, constellation_chan,
resource_task, resource_task,
image_cache_task); image_cache_task,
window_size);
script_task.start(); script_task.start();
} }
} }
@ -580,7 +575,7 @@ impl ScriptTask {
let parent_page_tree = self.page_tree.find(old_id).expect("ScriptTask: received a layout let parent_page_tree = self.page_tree.find(old_id).expect("ScriptTask: received a layout
whose parent has a PipelineId which does not correspond to a pipeline in the script whose parent has a PipelineId which does not correspond to a pipeline in the script
task's page tree. This is a bug."); task's page tree. This is a bug.");
let new_page_tree = PageTree::new(new_id, layout_chan); let new_page_tree = PageTree::new(new_id, layout_chan, parent_page_tree.page.window_size);
parent_page_tree.inner.push(new_page_tree); parent_page_tree.inner.push(new_page_tree);
} }
@ -634,7 +629,7 @@ impl ScriptTask {
fn handle_resize_inactive_msg(&mut self, id: PipelineId, new_size: Size2D<uint>) { fn handle_resize_inactive_msg(&mut self, id: PipelineId, new_size: Size2D<uint>) {
let page = self.page_tree.find(id).expect("Received resize message for PipelineId not associated let page = self.page_tree.find(id).expect("Received resize message for PipelineId not associated
with a page in the page tree. This is a bug.").page; with a page in the page tree. This is a bug.").page;
page.window_size = Some(new_size); page.window_size = new_size;
let last_loaded_url = replace(&mut page.url, None); let last_loaded_url = replace(&mut page.url, None);
for url in last_loaded_url.iter() { for url in last_loaded_url.iter() {
page.url = Some((url.first(), true)); page.url = Some((url.first(), true));
@ -846,7 +841,7 @@ impl ScriptTask {
ResizeEvent(new_width, new_height) => { ResizeEvent(new_width, new_height) => {
debug!("script got resize event: {:u}, {:u}", new_width, new_height); debug!("script got resize event: {:u}, {:u}", new_width, new_height);
page.window_size = Some(Size2D(new_width, new_height)); page.window_size = Size2D(new_width, new_height);
if page.frame.is_some() { if page.frame.is_some() {
page.damage(ReflowDocumentDamage); page.damage(ReflowDocumentDamage);