diff options
-rw-r--r-- | components/compositing/constellation.rs | 10 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 5 | ||||
-rw-r--r-- | components/script/script_task.rs | 23 | ||||
-rw-r--r-- | components/script_traits/lib.rs | 2 |
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 { |