| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_stream_ma
nager.h" | 5 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_stream_ma
nager.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/memory/singleton.h" | 8 #include "base/memory/singleton.h" |
| 9 #include "components/keyed_service/content/browser_context_dependency_manager.h" | 9 #include "components/keyed_service/content/browser_context_dependency_manager.h" |
| 10 #include "components/keyed_service/content/browser_context_keyed_service_factory
.h" | 10 #include "components/keyed_service/content/browser_context_keyed_service_factory
.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 EmbedderObserver(MimeHandlerStreamManager* stream_manager, | 77 EmbedderObserver(MimeHandlerStreamManager* stream_manager, |
| 78 const std::string& view_id, | 78 const std::string& view_id, |
| 79 int frame_tree_node_id, | 79 int frame_tree_node_id, |
| 80 int render_process_id, | 80 int render_process_id, |
| 81 int render_frame_id); | 81 int render_frame_id); |
| 82 | 82 |
| 83 private: | 83 private: |
| 84 // WebContentsObserver overrides. | 84 // WebContentsObserver overrides. |
| 85 void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; | 85 void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; |
| 86 void RenderProcessGone(base::TerminationStatus status) override; | 86 void RenderProcessGone(base::TerminationStatus status) override; |
| 87 void DidStartProvisionalLoadForFrame( | |
| 88 content::RenderFrameHost* render_frame_host, | |
| 89 const GURL& validated_url, | |
| 90 bool is_error_page) override; | |
| 91 void WebContentsDestroyed() override; | 87 void WebContentsDestroyed() override; |
| 92 void DidStartNavigation( | 88 void DidStartNavigation( |
| 93 content::NavigationHandle* navigation_handle) override; | 89 content::NavigationHandle* navigation_handle) override; |
| 90 void ReadyToCommitNavigation( |
| 91 content::NavigationHandle* navigation_handle) override; |
| 94 void RenderFrameHostChanged(content::RenderFrameHost* old_host, | 92 void RenderFrameHostChanged(content::RenderFrameHost* old_host, |
| 95 content::RenderFrameHost* new_host) override; | 93 content::RenderFrameHost* new_host) override; |
| 96 | 94 |
| 97 void AbortStream(); | 95 void AbortStream(); |
| 98 | 96 |
| 99 bool IsTrackedRenderFrameHost(content::RenderFrameHost* render_frame_host); | 97 bool IsTrackedRenderFrameHost(content::RenderFrameHost* render_frame_host); |
| 100 | 98 |
| 101 MimeHandlerStreamManager* const stream_manager_; | 99 MimeHandlerStreamManager* const stream_manager_; |
| 102 const std::string view_id_; | 100 const std::string view_id_; |
| 103 int frame_tree_node_id_; | 101 int frame_tree_node_id_; |
| 104 int render_process_id_; | 102 int render_process_id_; |
| 105 int render_frame_id_; | 103 int render_frame_id_; |
| 106 // With PlzNavigate we get an initial provisional load notification for the | 104 // We get an initial load notification for the URL the mime handler is |
| 107 // URL the mime handler is serving. We don't want to clean up the stream | 105 // serving. We don't want to clean up the stream here. This field helps us |
| 108 // here. This field helps us track the first load notification. Defaults | 106 // track the first load notification. Defaults to true. |
| 109 // to true. | |
| 110 bool initial_load_for_frame_; | 107 bool initial_load_for_frame_; |
| 111 // If a RFH is swapped with another RFH, this is set to the new RFH. This | 108 // If a RFH is swapped with another RFH, this is set to the new RFH. This |
| 112 // ensures that we don't inadvarently clean up the stream when the old RFH | 109 // ensures that we don't inadvarently clean up the stream when the old RFH |
| 113 // dies. | 110 // dies. |
| 114 content::RenderFrameHost* new_host_; | 111 content::RenderFrameHost* new_host_; |
| 115 }; | 112 }; |
| 116 | 113 |
| 117 MimeHandlerStreamManager::MimeHandlerStreamManager() | 114 MimeHandlerStreamManager::MimeHandlerStreamManager() |
| 118 : extension_registry_observer_(this) { | 115 : extension_registry_observer_(this) { |
| 119 } | 116 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 if (!IsTrackedRenderFrameHost(render_frame_host)) | 195 if (!IsTrackedRenderFrameHost(render_frame_host)) |
| 199 return; | 196 return; |
| 200 AbortStream(); | 197 AbortStream(); |
| 201 } | 198 } |
| 202 | 199 |
| 203 void MimeHandlerStreamManager::EmbedderObserver::RenderProcessGone( | 200 void MimeHandlerStreamManager::EmbedderObserver::RenderProcessGone( |
| 204 base::TerminationStatus status) { | 201 base::TerminationStatus status) { |
| 205 AbortStream(); | 202 AbortStream(); |
| 206 } | 203 } |
| 207 | 204 |
| 208 void MimeHandlerStreamManager::EmbedderObserver:: | 205 void MimeHandlerStreamManager::EmbedderObserver::ReadyToCommitNavigation( |
| 209 DidStartProvisionalLoadForFrame(content::RenderFrameHost* render_frame_host, | 206 content::NavigationHandle* navigation_handle) { |
| 210 const GURL& validated_url, | 207 if (navigation_handle->IsSamePage() || |
| 211 bool is_error_page) { | 208 !IsTrackedRenderFrameHost(navigation_handle->GetRenderFrameHost())) { |
| 212 if (!IsTrackedRenderFrameHost(render_frame_host)) | |
| 213 return; | 209 return; |
| 214 // With PlzNavigate we get a provisional load notification for the URL we are | 210 } |
| 215 // serving. We don't want to clean up the stream here. | 211 |
| 216 if (initial_load_for_frame_ && content::IsBrowserSideNavigationEnabled()) { | 212 // We get an initial load notification for the URL we are serving. We don't |
| 213 // want to clean up the stream here. |
| 214 if (initial_load_for_frame_) { |
| 217 initial_load_for_frame_ = false; | 215 initial_load_for_frame_ = false; |
| 218 return; | 216 return; |
| 219 } | 217 } |
| 220 AbortStream(); | 218 AbortStream(); |
| 221 } | 219 } |
| 222 | 220 |
| 223 void MimeHandlerStreamManager::EmbedderObserver::DidStartNavigation( | 221 void MimeHandlerStreamManager::EmbedderObserver::DidStartNavigation( |
| 224 content::NavigationHandle* navigation_handle) { | 222 content::NavigationHandle* navigation_handle) { |
| 225 // If the top level frame is navigating away, clean up the stream. | 223 // If the top level frame is navigating away, clean up the stream. |
| 226 if (navigation_handle->IsInMainFrame() && !navigation_handle->IsSamePage()) | 224 if (navigation_handle->IsInMainFrame() && !navigation_handle->IsSamePage()) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 if (frame_tree_node_id_ != -1) { | 275 if (frame_tree_node_id_ != -1) { |
| 278 return render_frame_host->GetFrameTreeNodeId() == frame_tree_node_id_; | 276 return render_frame_host->GetFrameTreeNodeId() == frame_tree_node_id_; |
| 279 } else { | 277 } else { |
| 280 DCHECK((render_frame_id_ != -1) && (render_process_id_ != -1)); | 278 DCHECK((render_frame_id_ != -1) && (render_process_id_ != -1)); |
| 281 return render_frame_host->GetRoutingID() == render_frame_id_ && | 279 return render_frame_host->GetRoutingID() == render_frame_id_ && |
| 282 render_frame_host->GetProcess()->GetID() == render_process_id_; | 280 render_frame_host->GetProcess()->GetID() == render_process_id_; |
| 283 } | 281 } |
| 284 } | 282 } |
| 285 | 283 |
| 286 } // namespace extensions | 284 } // namespace extensions |
| OLD | NEW |