Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Unified Diff: extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc

Issue 2331343005: PlzNavigate: Get StreamPrivate API to work. (Closed)
Patch Set: Fixed comment Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
index 78b76340f07594e71f6b6e7d9303300e5cf9cdd8..164d216a0d0c01772ac9e7034465ea3f15fa3fdf 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.cc
@@ -8,8 +8,10 @@
#include "base/memory/singleton.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/common/browser_side_navigation_policy.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
@@ -72,19 +74,18 @@ class MimeHandlerStreamManager::EmbedderObserver
: public content::WebContentsObserver {
public:
EmbedderObserver(MimeHandlerStreamManager* stream_manager,
+ const std::string& view_id,
+ content::WebContents* web_contents,
+ int frame_tree_node_id,
int render_process_id,
- int render_frame_id,
- const std::string& view_id);
+ int render_frame_id);
private:
// WebContentsObserver overrides.
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
void RenderProcessGone(base::TerminationStatus status) override;
- void DidStartProvisionalLoadForFrame(
- content::RenderFrameHost* render_frame_host,
- const GURL& validated_url,
- bool is_error_page,
- bool is_iframe_srcdoc) override;
+ void DidStartNavigation(
+ content::NavigationHandle* navigation_handle) override;
void WebContentsDestroyed() override;
void AbortStream();
@@ -92,9 +93,10 @@ class MimeHandlerStreamManager::EmbedderObserver
bool IsTrackedRenderFrameHost(content::RenderFrameHost* render_frame_host);
MimeHandlerStreamManager* const stream_manager_;
+ const std::string view_id_;
+ const int frame_tree_node_id_;
const int render_process_id_;
const int render_frame_id_;
- const std::string view_id_;
};
MimeHandlerStreamManager::MimeHandlerStreamManager()
@@ -113,13 +115,16 @@ MimeHandlerStreamManager* MimeHandlerStreamManager::Get(
void MimeHandlerStreamManager::AddStream(
const std::string& view_id,
std::unique_ptr<StreamContainer> stream,
+ content::WebContents* web_contents,
+ int frame_tree_node_id,
int render_process_id,
int render_frame_id) {
streams_by_extension_id_[stream->extension_id()].insert(view_id);
auto result = streams_.insert(std::make_pair(view_id, std::move(stream)));
DCHECK(result.second);
embedder_observers_[view_id] = base::MakeUnique<EmbedderObserver>(
- this, render_process_id, render_frame_id, view_id);
+ this, view_id, web_contents, frame_tree_node_id, render_process_id,
+ render_frame_id);
}
std::unique_ptr<StreamContainer> MimeHandlerStreamManager::ReleaseStream(
@@ -153,23 +158,26 @@ void MimeHandlerStreamManager::OnExtensionUnloaded(
MimeHandlerStreamManager::EmbedderObserver::EmbedderObserver(
MimeHandlerStreamManager* stream_manager,
+ const std::string& view_id,
+ content::WebContents* web_contents,
+ int frame_tree_node_id,
int render_process_id,
- int render_frame_id,
- const std::string& view_id)
- : WebContentsObserver(content::WebContents::FromRenderFrameHost(
- content::RenderFrameHost::FromID(render_process_id,
- render_frame_id))),
+ int render_frame_id)
+ : WebContentsObserver(web_contents),
stream_manager_(stream_manager),
+ view_id_(view_id),
+ frame_tree_node_id_(frame_tree_node_id),
render_process_id_(render_process_id),
- render_frame_id_(render_frame_id),
- view_id_(view_id) {
-}
+ render_frame_id_(render_frame_id) {}
void MimeHandlerStreamManager::EmbedderObserver::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
- if (!IsTrackedRenderFrameHost(render_frame_host))
+ // For PlzNavigate, we only cleanup when the renderer process goes away or
+ // if the main frame or the child frame initiates a new navigation.
+ if (content::IsBrowserSideNavigationEnabled() ||
lazyboy 2016/09/17 00:59:01 Q: Isn't it better to keep this as is? That way, n
ananta 2016/09/17 02:06:07 Thanks. Done. I made a change to RenderFrameHostIm
+ !IsTrackedRenderFrameHost(render_frame_host)) {
return;
-
+ }
AbortStream();
}
@@ -177,15 +185,15 @@ void MimeHandlerStreamManager::EmbedderObserver::RenderProcessGone(
base::TerminationStatus status) {
AbortStream();
}
-void MimeHandlerStreamManager::EmbedderObserver::
- DidStartProvisionalLoadForFrame(content::RenderFrameHost* render_frame_host,
- const GURL& validated_url,
- bool is_error_page,
- bool is_iframe_srcdoc) {
- if (!IsTrackedRenderFrameHost(render_frame_host))
- return;
- AbortStream();
+void MimeHandlerStreamManager::EmbedderObserver::DidStartNavigation(
+ content::NavigationHandle* navigation_handle) {
+ // If the top level frame or the associated child frame is navigating away
+ // cleanup the stream.
+ if (navigation_handle->IsInMainFrame() ||
+ IsTrackedRenderFrameHost(navigation_handle->GetRenderFrameHost())) {
+ AbortStream();
+ }
}
void MimeHandlerStreamManager::EmbedderObserver::WebContentsDestroyed() {
@@ -200,8 +208,13 @@ void MimeHandlerStreamManager::EmbedderObserver::AbortStream() {
bool MimeHandlerStreamManager::EmbedderObserver::IsTrackedRenderFrameHost(
content::RenderFrameHost* render_frame_host) {
- return render_frame_host->GetRoutingID() == render_frame_id_ &&
- render_frame_host->GetProcess()->GetID() == render_process_id_;
+ if (frame_tree_node_id_ != -1) {
lazyboy 2016/09/17 00:59:01 s/-1/FrameTreeNode::FrameTreeNodeInvalidId
ananta 2016/09/17 02:06:07 Can't do that as that constant is defined in the F
+ return render_frame_host->GetFrameTreeNodeId() == frame_tree_node_id_;
+ } else {
+ DCHECK((render_frame_id_ != -1) && (render_process_id_ != -1));
+ return render_frame_host->GetRoutingID() == render_frame_id_ &&
+ render_frame_host->GetProcess()->GetID() == render_process_id_;
+ }
}
} // namespace extensions
« no previous file with comments | « extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698