aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/compositing/constellation.rs46
-rw-r--r--components/script/script_task.rs4
2 files changed, 32 insertions, 18 deletions
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs
index acfde8d1d53..030bec0f986 100644
--- a/components/compositing/constellation.rs
+++ b/components/compositing/constellation.rs
@@ -217,9 +217,23 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
}
}
+ /// Gets the current window_size rect for an existing pipeline. This is used
+ /// to initialize the window size for a new pipeline, but may be None
+ /// when a new frame is loading.
+ fn get_window_size_data_for_pipeline(&self, pipeline_id: PipelineId) -> Option<WindowSizeData> {
+ self.pipeline(pipeline_id).rect.map(|rect| {
+ WindowSizeData {
+ visible_viewport: rect.size,
+ initial_viewport: rect.size * ScaleFactor(1.0),
+ device_pixel_ratio: self.window_size.device_pixel_ratio,
+ }
+ })
+ }
+
/// Helper function for creating a pipeline
fn new_pipeline(&mut self,
parent_info: Option<(PipelineId, SubpageId)>,
+ initial_window_size: Option<WindowSizeData>,
script_channel: Option<ScriptControlChan>,
load_data: LoadData)
-> PipelineId {
@@ -227,15 +241,6 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
let PipelineId(ref mut i) = self.next_pipeline_id;
*i += 1;
- // If this is a child frame, don't attach the main window
- // size to this pipeline - it will get its window size
- // assigned by the parent layout task.
- let window_size = if parent_info.is_some() {
- None
- } else {
- Some(self.window_size)
- };
-
let pipeline = Pipeline::create::<LTF, STF>(pipeline_id,
parent_info,
self.chan.clone(),
@@ -247,7 +252,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
self.storage_task.clone(),
self.time_profiler_chan.clone(),
self.memory_profiler_chan.clone(),
- window_size,
+ initial_window_size,
script_channel,
load_data);
@@ -324,7 +329,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
new_subpage_id,
old_subpage_id,
sandbox) => {
- debug!("constellation got iframe URL load message");
+ debug!("constellation got iframe URL load message {:?} {:?} {:?}", source_pipeline_id, old_subpage_id, new_subpage_id);
self.handle_script_loaded_url_in_iframe_msg(url,
source_pipeline_id,
new_subpage_id,
@@ -415,14 +420,16 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
}
debug!("creating replacement pipeline for about:failure");
- let new_pipeline_id = self.new_pipeline(parent_info, None,
+ let window_size = self.get_window_size_data_for_pipeline(pipeline_id);
+ let new_pipeline_id = self.new_pipeline(parent_info, window_size, None,
LoadData::new(Url::parse("about:failure").unwrap()));
self.push_pending_frame(new_pipeline_id, Some(pipeline_id));
}
fn handle_init_load(&mut self, url: Url) {
- let root_pipeline_id = self.new_pipeline(None, None, LoadData::new(url));
+ let window_size = self.window_size;
+ let root_pipeline_id = self.new_pipeline(None, Some(window_size), None, LoadData::new(url));
self.push_pending_frame(root_pipeline_id, None);
}
@@ -485,13 +492,17 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
};
// Create the new pipeline, attached to the parent and push to pending frames
+ let old_pipeline_id = old_subpage_id.map(|old_subpage_id| {
+ self.find_subpage(containing_pipeline_id, old_subpage_id).id
+ });
+ let window_size = old_pipeline_id.and_then(|old_pipeline_id| {
+ self.get_window_size_data_for_pipeline(old_pipeline_id)
+ });
let new_pipeline_id = self.new_pipeline(Some((containing_pipeline_id, new_subpage_id)),
+ window_size,
script_chan,
LoadData::new(url));
self.subpage_map.insert((containing_pipeline_id, new_subpage_id), new_pipeline_id);
- let old_pipeline_id = old_subpage_id.map(|old_subpage_id| {
- self.find_subpage(containing_pipeline_id, old_subpage_id).id
- });
self.push_pending_frame(new_pipeline_id, old_pipeline_id);
}
@@ -527,7 +538,8 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
// changes would be overridden by changing the subframe associated with source_id.
// Create the new pipeline
- let new_pipeline_id = self.new_pipeline(None, None, load_data);
+ let window_size = self.get_window_size_data_for_pipeline(source_id);
+ let new_pipeline_id = self.new_pipeline(None, window_size, None, load_data);
self.push_pending_frame(new_pipeline_id, Some(source_id));
// Send message to ScriptTask that will suspend all timers
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index c8873387d5d..02c504804ce 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -1148,7 +1148,9 @@ impl ScriptTask {
.find(|node| node.subpage_id() == Some(subpage_id))
.map(Temporary::from_rooted)
}).root();
- iframe.r().unwrap().navigate_child_browsing_context(load_data.url);
+ if let Some(iframe) = iframe.r() {
+ iframe.navigate_child_browsing_context(load_data.url);
+ }
}
None => {
let ConstellationChan(ref const_chan) = self.constellation_chan;