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: Update chrome_resource_dispatcher_host_delegate.cc 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
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..bd2105fe65a76ab26003147af76be84435dd4408 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
@@ -4,12 +4,16 @@
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_stream_manager.h"
+#include <map>
#include "base/memory/ptr_util.h"
#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/browser/web_contents.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,9 +76,10 @@ class MimeHandlerStreamManager::EmbedderObserver
: public content::WebContentsObserver {
nasko 2016/09/21 21:32:18 Does this object need to track subframes or are is
ananta 2016/09/21 21:59:12 This codepath also kicks in for iframes.
nasko 2016/09/21 22:08:55 Can you help me understand in what cases that happ
public:
EmbedderObserver(MimeHandlerStreamManager* stream_manager,
+ const std::string& view_id,
+ 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.
@@ -86,15 +91,32 @@ class MimeHandlerStreamManager::EmbedderObserver
bool is_error_page,
bool is_iframe_srcdoc) override;
void WebContentsDestroyed() override;
+ void DidStartNavigation(
+ content::NavigationHandle* navigation_handle) override;
+ void RenderFrameHostChanged(content::RenderFrameHost* old_host,
+ content::RenderFrameHost* new_host) override;
void AbortStream();
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_;
+ // With PlzNavigate we get an initial provisional load notification for the
+ // URL the mime handler is serving. We don't want to clean up the stream
+ // here. This field helps us track the first load notification. Defaults
+ // to true.
+ bool initial_load_for_frame_;
+ // Used to track whether a RenderFrameHost is swapped with another
+ // RenderFrameHost. We use it to determine when it is safe to clean up the
+ // stream. For e.g if a RFH is swapped with another RFH, and the first one
nasko 2016/09/21 21:32:18 nit: e.g.
ananta 2016/09/21 21:59:12 Comment has changed
+ // goes away, we want to clean up the stream when the second RFH dies.
+ typedef std::map<content::RenderFrameHost*, content::RenderFrameHost*>
+ RenderFrameHostMap;
+ RenderFrameHostMap changed_hosts_map_;
};
MimeHandlerStreamManager::MimeHandlerStreamManager()
@@ -113,13 +135,14 @@ MimeHandlerStreamManager* MimeHandlerStreamManager::Get(
void MimeHandlerStreamManager::AddStream(
const std::string& view_id,
std::unique_ptr<StreamContainer> stream,
+ 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, frame_tree_node_id, render_process_id, render_frame_id);
}
std::unique_ptr<StreamContainer> MimeHandlerStreamManager::ReleaseStream(
@@ -153,23 +176,40 @@ void MimeHandlerStreamManager::OnExtensionUnloaded(
MimeHandlerStreamManager::EmbedderObserver::EmbedderObserver(
MimeHandlerStreamManager* stream_manager,
+ const std::string& view_id,
+ 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))),
- stream_manager_(stream_manager),
+ int render_frame_id)
+ : 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) {
+ initial_load_for_frame_(true) {
+ content::WebContents* web_contents = nullptr;
+ if (frame_tree_node_id != -1) {
+ web_contents =
+ content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
+ } else {
+ web_contents = content::WebContents::FromRenderFrameHost(
+ content::RenderFrameHost::FromID(render_process_id, render_frame_id));
+ }
+ content::WebContentsObserver::Observe(web_contents);
}
void MimeHandlerStreamManager::EmbedderObserver::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
- if (!IsTrackedRenderFrameHost(render_frame_host))
+ if (!IsTrackedRenderFrameHost(render_frame_host)) {
nasko 2016/09/21 21:32:18 nit: Why add {}? The rest of the file omits {} on
ananta 2016/09/21 21:59:12 Done.
return;
-
+ }
+ // If the |render_frame_host| is swapped with another RFH, then we should
+ // cleanup the stream when the other RFH dies,
+ RenderFrameHostMap::iterator index =
+ changed_hosts_map_.find(render_frame_host);
+ if (index != changed_hosts_map_.end()) {
+ changed_hosts_map_.erase(index);
+ return;
+ }
AbortStream();
}
@@ -177,6 +217,7 @@ void MimeHandlerStreamManager::EmbedderObserver::RenderProcessGone(
base::TerminationStatus status) {
AbortStream();
}
+
void MimeHandlerStreamManager::EmbedderObserver::
DidStartProvisionalLoadForFrame(content::RenderFrameHost* render_frame_host,
const GURL& validated_url,
@@ -184,10 +225,28 @@ void MimeHandlerStreamManager::EmbedderObserver::
bool is_iframe_srcdoc) {
if (!IsTrackedRenderFrameHost(render_frame_host))
return;
-
+ // With PlzNavigate we get a provisional load notification for the URL we are
+ // serving. We don't want to clean up the stream here.
+ if (initial_load_for_frame_ && content::IsBrowserSideNavigationEnabled()) {
+ initial_load_for_frame_ = false;
+ return;
+ }
AbortStream();
}
+void MimeHandlerStreamManager::EmbedderObserver::DidStartNavigation(
+ content::NavigationHandle* navigation_handle) {
+ // If the top level frame is navigating away, clean up the stream.
+ if (navigation_handle->IsInMainFrame())
+ AbortStream();
+}
+
+void MimeHandlerStreamManager::EmbedderObserver::RenderFrameHostChanged(
+ content::RenderFrameHost* old_host,
+ content::RenderFrameHost* new_host) {
+ changed_hosts_map_[old_host] = new_host;
nasko 2016/09/21 21:32:18 Why do we need to keep a map? Can't we always just
ananta 2016/09/21 21:59:12 Thanks. Done
+}
+
void MimeHandlerStreamManager::EmbedderObserver::WebContentsDestroyed() {
AbortStream();
}
@@ -200,8 +259,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) {
+ 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

Powered by Google App Engine
This is Rietveld 408576698