diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/main/constellation.rs | 17 | ||||
-rw-r--r-- | src/components/msg/constellation_msg.rs | 2 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 46 |
3 files changed, 50 insertions, 15 deletions
diff --git a/src/components/main/constellation.rs b/src/components/main/constellation.rs index b35b24c9403..8c4ab3d89d9 100644 --- a/src/components/main/constellation.rs +++ b/src/components/main/constellation.rs @@ -11,10 +11,10 @@ use std::task; use gfx::opts::Opts; use gfx::render_task::{PaintPermissionGranted, PaintPermissionRevoked}; use pipeline::Pipeline; -use servo_msg::constellation_msg::{CompositorAck, ConstellationChan, ExitMsg}; -use servo_msg::constellation_msg::{LoadUrlMsg, Msg, NavigateMsg, RendererReadyMsg}; +use servo_msg::constellation_msg::{CompositorAck, ConstellationChan, ExitMsg, LoadUrlMsg}; +use servo_msg::constellation_msg::{Msg, NavigateMsg, RendererReadyMsg, ResizedWindowBroadcast}; use servo_msg::constellation_msg; -use script::script_task::ExecuteMsg; +use script::script_task::{ResizeInactiveMsg, ExecuteMsg}; use servo_net::image_cache_task::{ImageCacheTask, ImageCacheTaskClient}; use servo_net::resource_task::ResourceTask; use servo_net::resource_task; @@ -199,6 +199,17 @@ impl Constellation { } } + ResizedWindowBroadcast(new_size) => match self.current_painter { + Some(current_painter_id) => for self.pipelines.iter().advance |(&id, pipeline)| { + if current_painter_id != id { + pipeline.script_chan.send(ResizeInactiveMsg(new_size)); + } + }, + None => for self.pipelines.iter().advance |(_, pipeline)| { + pipeline.script_chan.send(ResizeInactiveMsg(new_size)); + }, + }, + // Acknowledgement from the compositor that it has updated its active pipeline id CompositorAck(id) => { self.grant_paint_permission(id); diff --git a/src/components/msg/constellation_msg.rs b/src/components/msg/constellation_msg.rs index bffd0b513b9..57accdddc63 100644 --- a/src/components/msg/constellation_msg.rs +++ b/src/components/msg/constellation_msg.rs @@ -7,6 +7,7 @@ use std::comm::{Chan, SharedChan}; use extra::net::url::Url; +use geom::size::Size2D; #[deriving(Clone)] pub struct ConstellationChan { @@ -30,6 +31,7 @@ pub enum Msg { ExitMsg(Chan<()>), RendererReadyMsg(uint), CompositorAck(uint), + ResizedWindowBroadcast(Size2D<uint>), } /// Represents the two different ways to which a page can be navigated diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 8111ccda72d..264dcefae76 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -20,7 +20,7 @@ use layout_interface::{ReflowDocumentDamage, ReflowForDisplay, ReflowForScriptQu use layout_interface::ReflowMsg; use layout_interface; use servo_msg::constellation_msg::{ConstellationChan, LoadUrlMsg, NavigationDirection}; -use servo_msg::constellation_msg::RendererReadyMsg; +use servo_msg::constellation_msg::{RendererReadyMsg, ResizedWindowBroadcast}; use servo_msg::constellation_msg; use std::cast::transmute; @@ -63,6 +63,8 @@ pub enum ScriptMsg { FireTimerMsg(~TimerData), /// Notifies script that reflow is finished. ReflowCompleteMsg, + /// Notifies script that window has been resized but to not take immediate action. + ResizeInactiveMsg(Size2D<uint>), /// Exits the constellation. ExitMsg, } @@ -143,8 +145,8 @@ pub struct ScriptTask { /// Cached copy of the most recent url loaded by the script /// TODO(tkuehn): this currently does not follow any particular caching policy - /// and simply caches pages forever (!). - last_loaded_url: Option<Url>, + /// and simply caches pages forever (!). The bool indicates if reflow is required + last_loaded_url: Option<(Url, bool)>, } fn global_script_context_key(_: @ScriptTask) {} @@ -284,6 +286,7 @@ impl ScriptTask { FireTimerMsg(timer_data) => self.handle_fire_timer_msg(timer_data), NavigateMsg(direction) => self.handle_navigate_msg(direction), ReflowCompleteMsg => self.handle_reflow_complete_msg(), + ResizeInactiveMsg(new_size) => self.handle_resize_inactive_msg(new_size), ExitMsg => { self.handle_exit_msg(); return false @@ -343,6 +346,15 @@ impl ScriptTask { self.constellation_chan.send(constellation_msg::NavigateMsg(direction)); } + /// Window was resized, but this script was not active, so don't reflow yet + fn handle_resize_inactive_msg(&mut self, new_size: Size2D<uint>) { + self.window_size = new_size; + let last_loaded_url = replace(&mut self.last_loaded_url, None); + for last_loaded_url.iter().advance |last_loaded_url| { + self.last_loaded_url = Some((last_loaded_url.first(), true)); + } + } + /// Handles a request to exit the script task and shut down layout. fn handle_exit_msg(&mut self) { self.join_layout(); @@ -356,9 +368,18 @@ impl ScriptTask { /// The entry point to document loading. Defines bindings, sets up the window and document /// objects, parses HTML and CSS, and kicks off initial layout. fn load(&mut self, url: Url) { - for self.last_loaded_url.iter().advance |last_loaded_url| { - if url == *last_loaded_url { return; } + let last_loaded_url = replace(&mut self.last_loaded_url, None); + for last_loaded_url.iter().advance |last_loaded_url| { + let (ref last_loaded_url, needs_reflow) = *last_loaded_url; + if *last_loaded_url == url { + if needs_reflow { + self.reflow_all(ReflowForDisplay); + self.last_loaded_url = Some((last_loaded_url.clone(), false)); + } + return; + } } + // Define the script DOM bindings. // // FIXME: Can this be done earlier, to save the flag? @@ -425,7 +446,7 @@ impl ScriptTask { ~"???", 1); } - self.last_loaded_url = Some(url); + self.last_loaded_url = Some((url, false)); } /// Sends a ping to layout and waits for the response. The response will arrive when the @@ -493,8 +514,8 @@ impl ScriptTask { pub fn reflow_all(&mut self, goal: ReflowGoal) { for self.root_frame.iter().advance |root_frame| { ScriptTask::damage(&mut self.damage, - root_frame.document.root, - MatchSelectorsDocumentDamage) + root_frame.document.root, + MatchSelectorsDocumentDamage) } self.reflow(goal) @@ -539,13 +560,14 @@ impl ScriptTask { for self.root_frame.iter().advance |root_frame| { ScriptTask::damage(&mut self.damage, - root_frame.document.root, - ReflowDocumentDamage); + root_frame.document.root, + ReflowDocumentDamage); } if self.root_frame.is_some() { self.reflow(ReflowForDisplay) } + self.constellation_chan.send(ResizedWindowBroadcast(self.window_size)); } // FIXME(pcwalton): This reflows the entire document and is not incremental-y. @@ -554,8 +576,8 @@ impl ScriptTask { for self.root_frame.iter().advance |root_frame| { ScriptTask::damage(&mut self.damage, - root_frame.document.root, - MatchSelectorsDocumentDamage); + root_frame.document.root, + MatchSelectorsDocumentDamage); } if self.root_frame.is_some() { |