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

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: Make PostTaskWhenProcessIsReady an instance method of RPH. Created 3 years, 7 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 43dd6ece4ffa9838c37835fdbea1597e6e8b1404..7579b6b0fa7b38fe0bf211ec01eadabed116ce05 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,6 +6,8 @@
#include "base/bind.h"
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/stl_util.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/navigation_handle.h"
@@ -51,6 +53,7 @@ class WebContentsEntry : public 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;
@@ -59,6 +62,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
@@ -87,6 +92,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);
};
@@ -96,8 +103,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);
@@ -146,6 +153,22 @@ void WebContentsEntry::RenderFrameHostChanged(RenderFrameHost* old_host,
CreateTaskForFrame(new_host);
}
+void WebContentsEntry::RenderFrameCreated(RenderFrameHost* render_frame_host) {
+ // Postpone processing |render_frame_host| until its process has a PID.
+ render_frame_host->GetProcess()->PostTaskWhenProcessIsReady(base::Bind(
ncarter (slow) 2017/05/12 21:56:02 When we show the task manager, this means we will
Łukasz Anforowicz 2017/05/16 16:37:25 In the most recent patchset, I am returning early
+ &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)
ncarter (slow) 2017/05/12 21:56:02 This would need to be: render_frame_host && rende
Łukasz Anforowicz 2017/05/16 16:37:25 RE: IsRenderFrameLive Wouldn't this be redundant
+ CreateTaskForFrame(render_frame_host);
+}
+
void WebContentsEntry::RenderViewReady() {
ClearAllTasks(true);
CreateAllTasks();
@@ -213,7 +236,8 @@ void WebContentsEntry::TitleWasSet(content::NavigationEntry* entry,
}
void WebContentsEntry::CreateTaskForFrame(RenderFrameHost* render_frame_host) {
ncarter (slow) 2017/05/12 21:56:02 This function is implemented assuming that |render
Łukasz Anforowicz 2017/05/16 16:37:25 I am not sure if this is still needed?
- DCHECK(!tasks_by_frames_.count(render_frame_host));
+ if (base::ContainsKey(tasks_by_frames_, render_frame_host))
+ ClearTaskForFrame(render_frame_host);
ncarter (slow) 2017/05/12 21:56:02 When does this happen? If |render_frame_host| is
Łukasz Anforowicz 2017/05/16 16:37:25 This would happen when CreateTaskForFrame would be
content::SiteInstance* site_instance = render_frame_host->GetSiteInstance();
if (!site_instance->GetProcess()->HasConnection())
ncarter (slow) 2017/05/12 21:56:02 Should probably be IsReady()
Łukasz Anforowicz 2017/05/16 16:37:25 Changing this makes PrintPreviewDialogControllerBr

Powered by Google App Engine
This is Rietveld 408576698