aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/compositing/constellation.rs10
-rw-r--r--components/script/dom/htmliframeelement.rs5
-rw-r--r--components/script/script_task.rs23
-rw-r--r--components/script_traits/lib.rs2
4 files changed, 40 insertions, 0 deletions
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs
index 86efe99ab8d..f822a9e19a5 100644
--- a/components/compositing/constellation.rs
+++ b/components/compositing/constellation.rs
@@ -597,6 +597,16 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> {
// Set paint permissions correctly for the compositor layers.
self.revoke_paint_permission(prev_pipeline_id);
self.send_frame_tree_and_grant_paint_permission();
+
+ // Update the owning iframe to point to the new subpage id.
+ // This makes things like contentDocument work correctly.
+ if let Some((parent_pipeline_id, subpage_id)) = pipeline_info {
+ let ScriptControlChan(ref script_chan) = self.pipeline(parent_pipeline_id).script_chan;
+ let (_, new_subpage_id) = self.pipeline(next_pipeline_id).parent_info.unwrap();
+ script_chan.send(ConstellationControlMsg::UpdateSubpageId(parent_pipeline_id,
+ subpage_id,
+ new_subpage_id)).unwrap();
+ }
}
fn handle_key_msg(&self, key: Key, state: KeyState, mods: KeyModifiers) {
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index ec532c7b695..64a0f2db7a7 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -73,6 +73,7 @@ pub trait HTMLIFrameElementHelpers {
fn generate_new_subpage_id(self) -> (SubpageId, Option<SubpageId>);
fn navigate_child_browsing_context(self, url: Url);
fn dispatch_mozbrowser_event(self, event_name: String, event_detail: Option<String>);
+ fn update_subpage_id(self, new_subpage_id: SubpageId);
}
impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> {
@@ -156,6 +157,10 @@ impl<'a> HTMLIFrameElementHelpers for JSRef<'a, HTMLIFrameElement> {
event.fire(target);
}
}
+
+ fn update_subpage_id(self, new_subpage_id: SubpageId) {
+ self.subpage_id.set(Some(new_subpage_id));
+ }
}
impl HTMLIFrameElement {
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index c66a0a424a3..35e57eacfa3 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -652,6 +652,10 @@ impl ScriptTask {
subpage_id,
event_name,
event_detail),
+ ConstellationControlMsg::UpdateSubpageId(containing_pipeline_id,
+ old_subpage_id,
+ new_subpage_id) =>
+ self.handle_update_subpage_id(containing_pipeline_id, old_subpage_id, new_subpage_id),
}
}
@@ -817,6 +821,25 @@ impl ScriptTask {
}
}
+ fn handle_update_subpage_id(&self,
+ containing_pipeline_id: PipelineId,
+ old_subpage_id: SubpageId,
+ new_subpage_id: SubpageId) {
+ let borrowed_page = self.root_page();
+
+ let frame_element = borrowed_page.find(containing_pipeline_id).and_then(|page| {
+ let doc = page.document().root();
+ let doc: JSRef<Node> = NodeCast::from_ref(doc.r());
+
+ doc.traverse_preorder()
+ .filter_map(HTMLIFrameElementCast::to_ref)
+ .find(|node| node.subpage_id() == Some(old_subpage_id))
+ .map(Temporary::from_rooted)
+ }).root();
+
+ frame_element.unwrap().r().update_subpage_id(new_subpage_id);
+ }
+
/// Handles a notification that reflow completed.
fn handle_reflow_complete_msg(&self, pipeline_id: PipelineId, reflow_id: uint) {
debug!("Script: Reflow {:?} complete for {:?}", reflow_id, pipeline_id);
diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs
index fbd64434b06..6ae35202c7e 100644
--- a/components/script_traits/lib.rs
+++ b/components/script_traits/lib.rs
@@ -74,6 +74,8 @@ pub enum ConstellationControlMsg {
Navigate(PipelineId, SubpageId, LoadData),
/// Requests the script task forward a mozbrowser event to an iframe it owns
MozBrowserEvent(PipelineId, SubpageId, String, Option<String>),
+ /// Updates the current subpage id of a given iframe
+ UpdateSubpageId(PipelineId, SubpageId, SubpageId),
}
unsafe impl Send for ConstellationControlMsg {