aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/main/constellation.rs17
-rw-r--r--src/components/msg/constellation_msg.rs2
-rw-r--r--src/components/script/script_task.rs46
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() {