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

Unified Diff: chrome/browser/page_load_metrics/metrics_web_contents_observer.cc

Issue 2189543002: Notify page load metrics when the app enters the background. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@clankbackgroundcallback
Patch Set: rename method Created 4 years, 5 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/page_load_metrics/metrics_web_contents_observer.cc
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
index 9f927511dcde2c2122bcbf117d29eded4a9bbb0d..d3a5b9de344d3d72e9d8baf33f55c7290e1b4c66 100644
--- a/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
+++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer.cc
@@ -22,6 +22,8 @@
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host.h"
+#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
@@ -53,6 +55,8 @@ const char kClientRedirectWithoutPaint[] =
"PageLoad.Internal.ClientRedirect.NavigationWithoutPaint";
const char kCommitToCompleteNoTimingIPCs[] =
"PageLoad.Internal.CommitToComplete.NoTimingIPCs";
+const char kPageLoadCompletedAfterAppBackground[] =
+ "PageLoad.Internal.PageLoadCompleted.AfterAppBackground";
} // namespace internal
@@ -247,6 +251,7 @@ PageLoadTracker::PageLoadTracker(
int aborted_chain_size,
int aborted_chain_size_same_url)
: did_stop_tracking_(false),
+ app_entered_background_(false),
navigation_start_(navigation_handle->NavigationStart()),
url_(navigation_handle->GetURL()),
abort_type_(ABORT_NONE),
@@ -263,6 +268,10 @@ PageLoadTracker::PageLoadTracker(
}
PageLoadTracker::~PageLoadTracker() {
+ if (app_entered_background_) {
Charlie Harrison 2016/07/28 14:45:27 Hm. Can you log a 3-state histogram instead of a 2
Bryan McQuade 2016/07/28 16:26:11 I think the third state you describe should just b
Bryan McQuade 2016/07/28 16:29:15 Ah, sorry, re-reading your comment, I think this h
Charlie Harrison 2016/07/28 16:38:04 Ah you're right, my mistake.
+ UMA_HISTOGRAM_BOOLEAN(internal::kPageLoadCompletedAfterAppBackground, true);
+ }
+
if (did_stop_tracking_)
return;
@@ -398,6 +407,14 @@ void PageLoadTracker::OnInputEvent(const blink::WebInputEvent& event) {
}
}
+void PageLoadTracker::FlushMetricsOnAppEnterBackground() {
+ if (!app_entered_background_) {
+ UMA_HISTOGRAM_BOOLEAN(internal::kPageLoadCompletedAfterAppBackground,
+ false);
+ app_entered_background_ = true;
+ }
+}
+
void PageLoadTracker::NotifyClientRedirectTo(
const PageLoadTracker& destination) {
if (timing_.first_paint) {
@@ -615,6 +632,33 @@ MetricsWebContentsObserver::~MetricsWebContentsObserver() {
NotifyAbortAllLoads(ABORT_CLOSE);
}
+// static
+std::vector<MetricsWebContentsObserver*>
+MetricsWebContentsObserver::GetAllObservers() {
+ std::vector<MetricsWebContentsObserver*> result;
+ std::unique_ptr<content::RenderWidgetHostIterator> widgets(
+ content::RenderWidgetHost::GetRenderWidgetHosts());
+ while (content::RenderWidgetHost* rwh = widgets->GetNextHost()) {
+ content::RenderViewHost* rvh = content::RenderViewHost::From(rwh);
+ if (!rvh)
+ continue;
+ content::WebContents* web_contents =
+ content::WebContents::FromRenderViewHost(rvh);
+ if (!web_contents)
+ continue;
+ if (web_contents->GetRenderViewHost() != rvh)
Charlie Harrison 2016/07/28 14:45:27 How can this happen?
Bryan McQuade 2016/07/28 16:26:11 I actually lifted this logic from https://cs.chrom
Charlie Harrison 2016/07/28 16:38:04 Yeah, let's see if we can expose this. No point du
Charlie Reis 2016/07/28 17:36:49 Adding jam@, who has been against having a public
Charlie Harrison 2016/07/28 17:42:17 Ah that makes sense. Bryan, have you look at doing
Charlie Reis 2016/07/28 17:56:44 That would be great if it covered all the cases yo
+ continue;
+ MetricsWebContentsObserver* observer =
+ MetricsWebContentsObserver::FromWebContents(web_contents);
+ if (!observer)
+ continue;
+ // Verify there are no duplicates.
+ DCHECK(std::find(result.begin(), result.end(), observer) == result.end());
Charlie Harrison 2016/07/28 14:45:27 If you want this feature let's use an std::set ins
Bryan McQuade 2016/07/28 16:26:11 The drawback to set<> is that iteration order will
Charlie Harrison 2016/07/28 16:38:04 No, your reasoning makes sense. Keeping this DCHEC
+ result.push_back(observer);
+ }
+ return result;
+}
+
void MetricsWebContentsObserver::RegisterInputEventObserver(
content::RenderViewHost* host) {
if (host != nullptr)
@@ -805,6 +849,17 @@ void MetricsWebContentsObserver::OnInputEvent(
committed_load_->OnInputEvent(event);
}
+void MetricsWebContentsObserver::FlushMetricsOnAppEnterBackground() {
+ if (committed_load_)
+ committed_load_->FlushMetricsOnAppEnterBackground();
+ for (const auto& kv : provisional_loads_) {
+ kv.second->FlushMetricsOnAppEnterBackground();
+ }
+ for (const auto& tracker : aborted_provisional_loads_) {
+ tracker->FlushMetricsOnAppEnterBackground();
+ }
+}
+
void MetricsWebContentsObserver::DidRedirectNavigation(
content::NavigationHandle* navigation_handle) {
if (!navigation_handle->IsInMainFrame())

Powered by Google App Engine
This is Rietveld 408576698