Chromium Code Reviews| 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..7a4a6ad35a89d57fd7c31e8d916883b6859a4b19 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,7 +53,7 @@ class WebContentsEntry : public content::WebContentsObserver { |
| void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
| void RenderFrameHostChanged(RenderFrameHost* old_host, |
| RenderFrameHost* new_host) override; |
| - void RenderViewReady() override; |
| + void RenderFrameCreated(RenderFrameHost*) override; |
| void WebContentsDestroyed() override; |
| void RenderProcessGone(base::TerminationStatus status) override; |
| void OnRendererUnresponsive(RenderWidgetHost* render_widget_host) override; |
| @@ -59,6 +61,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 +91,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 +102,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,9 +152,31 @@ void WebContentsEntry::RenderFrameHostChanged(RenderFrameHost* old_host, |
| CreateTaskForFrame(new_host); |
| } |
| -void WebContentsEntry::RenderViewReady() { |
| - ClearAllTasks(true); |
| - CreateAllTasks(); |
| +void WebContentsEntry::RenderFrameCreated(RenderFrameHost* render_frame_host) { |
| + // Skip hosts that will be processed anyway by RenderFrameHostChanged. |
|
ncarter (slow)
2017/05/16 20:50:57
// Skip pending/speculative hosts. We'll create ta
Łukasz Anforowicz
2017/05/16 21:33:44
Done.
|
| + if (!render_frame_host->IsCurrent()) |
| + return; |
| + |
| + // Task manager will have no separate entry for |render_frame_host| if it has |
| + // the same site instance as its parent - quit early in this case. |
| + if (render_frame_host->GetParent() && |
| + render_frame_host->GetParent()->GetSiteInstance() == |
| + render_frame_host->GetSiteInstance()) |
| + return; |
| + |
| + // Postpone processing |render_frame_host| until its process has a PID. |
| + render_frame_host->GetProcess()->PostTaskWhenProcessIsReady(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::WebContentsDestroyed() { |
| @@ -213,11 +241,14 @@ void WebContentsEntry::TitleWasSet(content::NavigationEntry* entry, |
| } |
| void WebContentsEntry::CreateTaskForFrame(RenderFrameHost* render_frame_host) { |
| + DCHECK(render_frame_host); |
| DCHECK(!tasks_by_frames_.count(render_frame_host)); |
| content::SiteInstance* site_instance = render_frame_host->GetSiteInstance(); |
| if (!site_instance->GetProcess()->HasConnection()) |
| return; |
| + if (!render_frame_host->IsRenderFrameLive()) |
| + return; |
| bool site_instance_exists = |
| frames_by_site_instance_.count(site_instance) != 0; |