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

Unified Diff: chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc

Issue 2857263003: Task Manager should listen to WebContentsObserver::RenderFrameCreated. (Closed)
Patch Set: Created 3 years, 8 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: chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
diff --git a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
index 98284767b575d8e5a8d0a1d58f220a3fe55178e6..06fe986cbfff3a1adc8fb69d9e187190263d4dc5 100644
--- a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
+++ b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
@@ -6,10 +6,12 @@
#include "base/bind.h"
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
#include "chrome/browser/task_manager/providers/web_contents/subframe_task.h"
#include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_manager.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_process_host_utils.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
@@ -48,8 +50,7 @@ class WebContentsEntry : public content::WebContentsObserver {
// content::WebContentsObserver:
void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
- void RenderFrameHostChanged(RenderFrameHost* old_host,
- RenderFrameHost* new_host) override;
+ void RenderFrameCreated(RenderFrameHost*) override;
void RenderViewReady() override;
void WebContentsDestroyed() override;
void RenderProcessGone(base::TerminationStatus status) override;
@@ -58,6 +59,8 @@ class WebContentsEntry : public content::WebContentsObserver {
content::NavigationHandle* navigation_handle) override;
void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override;
+ void RenderFrameReady(int process_routing_id, int frame_routing_id);
+
private:
// Defines a callback for WebContents::ForEachFrame() to create a
// corresponding task for the given |render_frame_host| and notifying the
@@ -86,6 +89,8 @@ class WebContentsEntry : public content::WebContentsObserver {
// States whether we did record a main frame for this entry.
SiteInstance* main_frame_site_instance_;
+ base::WeakPtrFactory<WebContentsEntry> weak_factory_;
+
DISALLOW_COPY_AND_ASSIGN(WebContentsEntry);
};
@@ -95,8 +100,8 @@ WebContentsEntry::WebContentsEntry(content::WebContents* web_contents,
WebContentsTaskProvider* provider)
: WebContentsObserver(web_contents),
provider_(provider),
- main_frame_site_instance_(nullptr) {
-}
+ main_frame_site_instance_(nullptr),
+ weak_factory_(this) {}
WebContentsEntry::~WebContentsEntry() {
ClearAllTasks(false);
@@ -139,10 +144,22 @@ void WebContentsEntry::RenderFrameDeleted(RenderFrameHost* render_frame_host) {
ClearTaskForFrame(render_frame_host);
}
-void WebContentsEntry::RenderFrameHostChanged(RenderFrameHost* old_host,
- RenderFrameHost* new_host) {
- ClearTaskForFrame(old_host);
- CreateTaskForFrame(new_host);
+void WebContentsEntry::RenderFrameCreated(RenderFrameHost* render_frame_host) {
+ // Postpone processing |render_frame_host| until its process has a PID.
+ PostTaskWhenRenderProcessHostIsReady(
+ render_frame_host->GetProcess(),
+ base::Bind(&WebContentsEntry::RenderFrameReady,
+ weak_factory_.GetWeakPtr(),
+ render_frame_host->GetProcess()->GetID(),
+ render_frame_host->GetRoutingID()));
+}
+
+void WebContentsEntry::RenderFrameReady(int render_process_id,
+ int render_frame_id) {
+ content::RenderFrameHost* render_frame_host =
+ content::RenderFrameHost::FromID(render_process_id, render_frame_id);
+ if (render_frame_host)
+ CreateTaskForFrame(render_frame_host);
}
void WebContentsEntry::RenderViewReady() {

Powered by Google App Engine
This is Rietveld 408576698