aboutsummaryrefslogtreecommitdiffstats
path: root/components/constellation
diff options
context:
space:
mode:
authorMs2ger <Ms2ger@gmail.com>2016-11-28 10:23:04 +0100
committerMs2ger <Ms2ger@gmail.com>2016-11-30 11:26:35 +0100
commitb86965f3948cb830b084a53133ec949af0d11ff7 (patch)
tree6cfc43be4b56abfe483ce436fc2a113705382376 /components/constellation
parent2677540cd0fe93b741e82e1176b5073a8a92fba6 (diff)
downloadservo-b86965f3948cb830b084a53133ec949af0d11ff7.tar.gz
servo-b86965f3948cb830b084a53133ec949af0d11ff7.zip
Implement synchronous about:blank loading.
Based on initial work by jdm in <https://github.com/servo/servo/pull/8600>.
Diffstat (limited to 'components/constellation')
-rw-r--r--components/constellation/constellation.rs77
-rw-r--r--components/constellation/pipeline.rs24
2 files changed, 77 insertions, 24 deletions
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs
index 8cb82a5cdd5..19e70c90bfc 100644
--- a/components/constellation/constellation.rs
+++ b/components/constellation/constellation.rs
@@ -42,7 +42,7 @@ use rand::{Rng, SeedableRng, StdRng, random};
use script_traits::{AnimationState, AnimationTickType, CompositorEvent};
use script_traits::{ConstellationControlMsg, ConstellationMsg as FromCompositorMsg};
use script_traits::{DocumentState, LayoutControlMsg, LoadData};
-use script_traits::{IFrameLoadInfo, IFrameSandboxState, TimerEventRequest};
+use script_traits::{IFrameLoadInfo, IFrameLoadInfoWithData, IFrameSandboxState, TimerEventRequest};
use script_traits::{LayoutMsg as FromLayoutMsg, ScriptMsg as FromScriptMsg, ScriptThreadFactory};
use script_traits::{LogEntry, ServiceWorkerMsg, webdriver_msg};
use script_traits::{MozBrowserErrorType, MozBrowserEvent, WebDriverCommandMsg, WindowSizeData};
@@ -914,11 +914,17 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
}
FromScriptMsg::ScriptLoadedURLInIFrame(load_info) => {
debug!("constellation got iframe URL load message {:?} {:?} {:?}",
- load_info.parent_pipeline_id,
+ load_info.info.parent_pipeline_id,
load_info.old_pipeline_id,
- load_info.new_pipeline_id);
+ load_info.info.new_pipeline_id);
self.handle_script_loaded_url_in_iframe_msg(load_info);
}
+ FromScriptMsg::ScriptLoadedAboutBlankInIFrame(load_info, lc) => {
+ debug!("constellation got loaded `about:blank` in iframe message {:?} {:?}",
+ load_info.parent_pipeline_id,
+ load_info.new_pipeline_id);
+ self.handle_script_loaded_about_blank_in_iframe_msg(load_info, lc);
+ }
FromScriptMsg::ChangeRunningAnimationsState(pipeline_id, animation_state) => {
self.handle_change_running_animations_state(pipeline_id, animation_state)
}
@@ -1363,14 +1369,14 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
// will result in a new pipeline being spawned and a frame tree being added to
// parent_pipeline_id's frame tree's children. This message is never the result of a
// page navigation.
- fn handle_script_loaded_url_in_iframe_msg(&mut self, load_info: IFrameLoadInfo) {
+ fn handle_script_loaded_url_in_iframe_msg(&mut self, load_info: IFrameLoadInfoWithData) {
let (load_data, window_size, is_private) = {
let old_pipeline = load_info.old_pipeline_id
.and_then(|old_pipeline_id| self.pipelines.get(&old_pipeline_id));
- let source_pipeline = match self.pipelines.get(&load_info.parent_pipeline_id) {
+ let source_pipeline = match self.pipelines.get(&load_info.info.parent_pipeline_id) {
Some(source_pipeline) => source_pipeline,
- None => return warn!("Script loaded url in closed iframe {}.", load_info.parent_pipeline_id),
+ None => return warn!("Script loaded url in closed iframe {}.", load_info.info.parent_pipeline_id),
};
// If no url is specified, reload.
@@ -1384,7 +1390,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
LoadData::new(url, None, None)
});
- let is_private = load_info.is_private || source_pipeline.is_private;
+ let is_private = load_info.info.is_private || source_pipeline.is_private;
let window_size = old_pipeline.and_then(|old_pipeline| old_pipeline.size);
@@ -1396,20 +1402,65 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
};
// Create the new pipeline, attached to the parent and push to pending frames
- self.new_pipeline(load_info.new_pipeline_id,
- load_info.frame_id,
- Some((load_info.parent_pipeline_id, load_info.frame_type)),
+ self.new_pipeline(load_info.info.new_pipeline_id,
+ load_info.info.frame_id,
+ Some((load_info.info.parent_pipeline_id, load_info.info.frame_type)),
window_size,
load_data,
load_info.sandbox,
is_private);
self.pending_frames.push(FrameChange {
- frame_id: load_info.frame_id,
+ frame_id: load_info.info.frame_id,
old_pipeline_id: load_info.old_pipeline_id,
- new_pipeline_id: load_info.new_pipeline_id,
+ new_pipeline_id: load_info.info.new_pipeline_id,
+ document_ready: false,
+ replace: load_info.info.replace,
+ });
+ }
+
+ fn handle_script_loaded_about_blank_in_iframe_msg(&mut self,
+ load_info: IFrameLoadInfo,
+ layout_sender: IpcSender<LayoutControlMsg>) {
+ let IFrameLoadInfo {
+ parent_pipeline_id,
+ new_pipeline_id,
+ frame_type,
+ replace,
+ frame_id,
+ is_private,
+ } = load_info;
+
+ let pipeline = {
+ let parent_pipeline = match self.pipelines.get(&parent_pipeline_id) {
+ Some(parent_pipeline) => parent_pipeline,
+ None => return warn!("Script loaded url in closed iframe {}.", parent_pipeline_id),
+ };
+
+ let script_sender = parent_pipeline.script_chan.clone();
+
+ let url = ServoUrl::parse("about:blank").expect("infallible");
+ Pipeline::new(new_pipeline_id,
+ frame_id,
+ Some((parent_pipeline_id, frame_type)),
+ script_sender,
+ layout_sender,
+ self.compositor_proxy.clone_compositor_proxy(),
+ is_private || parent_pipeline.is_private,
+ url,
+ None,
+ parent_pipeline.visible)
+ };
+
+ assert!(!self.pipelines.contains_key(&new_pipeline_id));
+ self.pipelines.insert(new_pipeline_id, pipeline);
+
+ self.pending_frames.push(FrameChange {
+ frame_id: frame_id,
+ old_pipeline_id: None,
+ new_pipeline_id: new_pipeline_id,
document_ready: false,
- replace: load_info.replace,
+ replace: replace,
});
}
diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs
index 53c2a58e091..890476e5010 100644
--- a/components/constellation/pipeline.rs
+++ b/components/constellation/pipeline.rs
@@ -256,17 +256,19 @@ impl Pipeline {
Ok((pipeline, child_process))
}
- fn new(id: PipelineId,
- frame_id: FrameId,
- parent_info: Option<(PipelineId, FrameType)>,
- script_chan: Rc<ScriptChan>,
- layout_chan: IpcSender<LayoutControlMsg>,
- compositor_proxy: Box<CompositorProxy + 'static + Send>,
- is_private: bool,
- url: ServoUrl,
- size: Option<TypedSize2D<f32, PagePx>>,
- visible: bool)
- -> Pipeline {
+ /// Creates a new `Pipeline`, after the script and layout threads have been
+ /// spawned.
+ pub fn new(id: PipelineId,
+ frame_id: FrameId,
+ parent_info: Option<(PipelineId, FrameType)>,
+ script_chan: Rc<ScriptChan>,
+ layout_chan: IpcSender<LayoutControlMsg>,
+ compositor_proxy: Box<CompositorProxy + 'static + Send>,
+ is_private: bool,
+ url: ServoUrl,
+ size: Option<TypedSize2D<f32, PagePx>>,
+ visible: bool)
+ -> Pipeline {
let pipeline = Pipeline {
id: id,
frame_id: frame_id,