OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if !defined(OS_ANDROID) | 5 #if !defined(OS_ANDROID) |
6 | 6 |
7 #include "chrome/browser/metrics/first_web_contents_profiler.h" | 7 #include "chrome/browser/metrics/first_web_contents_profiler.h" |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/location.h" | 11 #include "base/location.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
16 #include "chrome/browser/ui/browser_iterator.h" | 16 #include "chrome/browser/ui/browser_iterator.h" |
17 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 17 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
18 #include "components/metrics/profiler/tracking_synchronizer.h" | 18 #include "components/metrics/profiler/tracking_synchronizer.h" |
19 #include "components/metrics/proto/profiler_event.pb.h" | 19 #include "components/metrics/proto/profiler_event.pb.h" |
20 #include "components/startup_metric_utils/browser/startup_metric_utils.h" | 20 #include "components/startup_metric_utils/browser/startup_metric_utils.h" |
21 #include "content/public/browser/navigation_handle.h" | 21 #include "content/public/browser/navigation_handle.h" |
22 | 22 |
23 scoped_ptr<FirstWebContentsProfiler> | 23 // static |
24 FirstWebContentsProfiler::CreateProfilerForFirstWebContents( | 24 void FirstWebContentsProfiler::Start() { |
25 Delegate* delegate) { | 25 for (chrome::BrowserIterator browser_it; !browser_it.done(); |
26 DCHECK(delegate); | 26 browser_it.Next()) { |
27 for (chrome::BrowserIterator iterator; !iterator.done(); iterator.Next()) { | |
28 Browser* browser = *iterator; | |
29 content::WebContents* web_contents = | 27 content::WebContents* web_contents = |
30 browser->tab_strip_model()->GetActiveWebContents(); | 28 browser_it->tab_strip_model()->GetActiveWebContents(); |
31 if (web_contents) { | 29 if (web_contents) { |
32 return scoped_ptr<FirstWebContentsProfiler>( | 30 // FirstWebContentsProfiler owns itself and is also bound to |
33 new FirstWebContentsProfiler(web_contents, delegate)); | 31 // |web_contents|'s lifetime by observing WebContentsDestroyed(). |
| 32 new FirstWebContentsProfiler(web_contents); |
| 33 return; |
34 } | 34 } |
35 } | 35 } |
36 return nullptr; | |
37 } | 36 } |
38 | 37 |
39 FirstWebContentsProfiler::FirstWebContentsProfiler( | 38 FirstWebContentsProfiler::FirstWebContentsProfiler( |
40 content::WebContents* web_contents, | 39 content::WebContents* web_contents) |
41 Delegate* delegate) | |
42 : content::WebContentsObserver(web_contents), | 40 : content::WebContentsObserver(web_contents), |
43 collected_paint_metric_(false), | 41 collected_paint_metric_(false), |
44 collected_load_metric_(false), | 42 collected_load_metric_(false), |
45 collected_main_navigation_start_metric_(false), | 43 collected_main_navigation_start_metric_(false), |
46 collected_main_navigation_finished_metric_(false), | 44 collected_main_navigation_finished_metric_(false), |
47 finished_(false), | 45 finished_(false) {} |
48 delegate_(delegate) {} | |
49 | 46 |
50 void FirstWebContentsProfiler::DidFirstVisuallyNonEmptyPaint() { | 47 void FirstWebContentsProfiler::DidFirstVisuallyNonEmptyPaint() { |
51 if (collected_paint_metric_) | 48 if (collected_paint_metric_) |
52 return; | 49 return; |
53 if (startup_metric_utils::WasNonBrowserUIDisplayed()) { | 50 if (startup_metric_utils::WasNonBrowserUIDisplayed()) { |
54 FinishedCollectingMetrics(FinishReason::ABANDON_BLOCKING_UI); | 51 FinishedCollectingMetrics(FinishReason::ABANDON_BLOCKING_UI); |
55 return; | 52 return; |
56 } | 53 } |
57 | 54 |
58 collected_paint_metric_ = true; | 55 collected_paint_metric_ = true; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 } | 167 } |
171 finished_ = true; | 168 finished_ = true; |
172 } | 169 } |
173 | 170 |
174 // Continue recording deprecated v1 stats (see |finished_|) except in | 171 // Continue recording deprecated v1 stats (see |finished_|) except in |
175 // scenarios where stats collection was already being abandonned previously. | 172 // scenarios where stats collection was already being abandonned previously. |
176 // TODO(gab): Delete right away when getting rid of |finished_|. | 173 // TODO(gab): Delete right away when getting rid of |finished_|. |
177 if (IsFinishedCollectingMetrics() || | 174 if (IsFinishedCollectingMetrics() || |
178 finish_reason == FinishReason::ABANDON_CONTENT_DESTROYED || | 175 finish_reason == FinishReason::ABANDON_CONTENT_DESTROYED || |
179 finish_reason == FinishReason::ABANDON_BLOCKING_UI) { | 176 finish_reason == FinishReason::ABANDON_BLOCKING_UI) { |
180 delegate_->ProfilerFinishedCollectingMetrics(); | 177 delete this; |
181 } | 178 } |
182 } | 179 } |
183 | 180 |
184 #endif // !defined(OS_ANDROID) | 181 #endif // !defined(OS_ANDROID) |
OLD | NEW |