diff options
author | Tim Kuehn <tkuehn@cmu.edu> | 2013-07-08 18:34:04 -0700 |
---|---|---|
committer | Tim Kuehn <tkuehn@cmu.edu> | 2013-07-10 15:18:56 -0700 |
commit | 8b8d2f5a4b14cec083f0e967c0362d9e2fb39d6d (patch) | |
tree | 2ba54daefbb4c14fee4b3ee809305f41c31a0764 /src/components/script/script_task.rs | |
parent | 9f6cbf91c60c9609453ceba87a65cf438b565893 (diff) | |
download | servo-8b8d2f5a4b14cec083f0e967c0362d9e2fb39d6d.tar.gz servo-8b8d2f5a4b14cec083f0e967c0362d9e2fb39d6d.zip |
scripts from inactive pipelines resize upon navigating to their pages
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r-- | src/components/script/script_task.rs | 46 |
1 files changed, 34 insertions, 12 deletions
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() { |