diff options
-rw-r--r-- | components/compositing/constellation.rs | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 6ebe4dd9c53..7ef9cd9c296 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -441,6 +441,9 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> pipeline_id: PipelineId, unprivileged_pipeline_content: UnprivilegedPipelineContent) { + // Note that this function can panic, due to process creation, + // avoiding this panic would require a mechanism for dealing + // with low-resource scenarios. let (server, token) = IpcOneShotServer::<IpcSender<UnprivilegedPipelineContent>>::new().unwrap(); @@ -708,7 +711,7 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> debug!("constellation got remove iframe message"); self.handle_remove_iframe_msg(pipeline_id); if let Some(sender) = sender { - sender.send(()).unwrap(); + sender.send(()).unwrap_or_else(|e| debug!("Error replying to remove iframe ({})", e)); } } Request::Script(FromScriptMsg::NewFavicon(url)) => { @@ -1458,6 +1461,10 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> /// Since this function is only used in reftests, we do not harden it against panic. fn handle_is_ready_to_save_image(&mut self, pipeline_states: HashMap<PipelineId, Epoch>) -> ReadyToSave { + // Note that this function can panic, due to ipc-channel creation failure. + // avoiding this panic would require a mechanism for dealing + // with low-resource scenarios. + // // If there is no root frame yet, the initial page has // not loaded, so there is nothing to save yet. if self.root_frame_id.is_none() { @@ -1487,8 +1494,9 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> // but hasn't yet notified the document. let (sender, receiver) = ipc::channel().unwrap(); let msg = LayoutControlMsg::GetWebFontLoadState(sender); - pipeline.layout_chan.0.send(msg).unwrap(); - if receiver.recv().unwrap() { + pipeline.layout_chan.0.send(msg) + .unwrap_or_else(|e| debug!("Get web font failed ({})", e)); + if receiver.recv().unwrap_or(true) { return ReadyToSave::WebFontNotLoaded; } @@ -1563,7 +1571,9 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> self.close_pipeline(*pipeline_id, exit_mode); } - self.frames.remove(&frame_id).unwrap(); + if let None = self.frames.remove(&frame_id) { + debug!("Closing frame {:?} twice.", frame_id); + } if let Some((parent_pipeline_id, _)) = parent_info { let parent_pipeline = self.mut_pipeline(parent_pipeline_id); @@ -1591,7 +1601,10 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> self.close_frame(*child_frame, exit_mode); } - let pipeline = self.pipelines.remove(&pipeline_id).unwrap(); + let pipeline = match self.pipelines.remove(&pipeline_id) { + Some(pipeline) => pipeline, + None => return debug!("Closing pipeline {:?} twice.", pipeline_id), + }; // If a child pipeline, remove from subpage map if let Some(info) = pipeline.parent_info { @@ -1665,6 +1678,9 @@ impl<LTF: LayoutThreadFactory, STF: ScriptThreadFactory> Constellation<LTF, STF> // Send the current frame tree to compositor, and grant paint // permission to each pipeline in the current frame tree. fn send_frame_tree_and_grant_paint_permission(&mut self) { + // Note that this function can panic, due to ipc-channel creation failure. + // avoiding this panic would require a mechanism for dealing + // with low-resource scenarios. if let Some(root_frame_id) = self.root_frame_id { let frame_tree = self.frame_to_sendable(root_frame_id); |