OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #include "base/files/scoped_temp_dir.h" | 5 #include "base/files/scoped_temp_dir.h" |
6 #include "base/macros.h" | 6 #include "base/macros.h" |
7 #include "base/test/histogram_tester.h" | 7 #include "base/test/histogram_tester.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 9 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" |
10 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob server.h" | 10 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_ob server.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
23 #include "chrome/common/url_constants.h" | 23 #include "chrome/common/url_constants.h" |
24 #include "chrome/test/base/in_process_browser_test.h" | 24 #include "chrome/test/base/in_process_browser_test.h" |
25 #include "chrome/test/base/ui_test_utils.h" | 25 #include "chrome/test/base/ui_test_utils.h" |
26 #include "components/prefs/pref_service.h" | 26 #include "components/prefs/pref_service.h" |
27 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
28 #include "content/public/browser/render_process_host.h" | 28 #include "content/public/browser/render_process_host.h" |
29 #include "content/public/browser/render_view_host.h" | 29 #include "content/public/browser/render_view_host.h" |
30 #include "content/public/test/browser_test_utils.h" | 30 #include "content/public/test/browser_test_utils.h" |
31 #include "content/public/test/download_test_observer.h" | 31 #include "content/public/test/download_test_observer.h" |
32 #include "content/public/test/web_contents_binding_set_test_binder.h" | |
33 #include "mojo/public/cpp/bindings/associated_binding.h" | |
32 #include "net/http/failing_http_transaction_factory.h" | 34 #include "net/http/failing_http_transaction_factory.h" |
33 #include "net/http/http_cache.h" | 35 #include "net/http/http_cache.h" |
34 #include "net/test/embedded_test_server/embedded_test_server.h" | 36 #include "net/test/embedded_test_server/embedded_test_server.h" |
35 #include "net/test/url_request/url_request_failed_job.h" | 37 #include "net/test/url_request/url_request_failed_job.h" |
36 #include "net/url_request/url_request_context.h" | 38 #include "net/url_request/url_request_context.h" |
37 #include "net/url_request/url_request_context_getter.h" | 39 #include "net/url_request/url_request_context_getter.h" |
40 #include "testing/gmock/include/gmock/gmock.h" | |
38 | 41 |
39 namespace { | 42 namespace { |
40 | 43 |
41 // Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received | 44 // Waits until a PageLoadMetricsMsg_TimingUpdated message IPC is received |
42 // matching a PageLoadTiming. See WaitForMatchingIPC for details. | 45 // matching a PageLoadTiming. See WaitForMatchingIPC for details. |
43 class TimingUpdatedObserver : public content::BrowserMessageFilter { | 46 class TimingUpdatedObserver : public content::BrowserMessageFilter { |
44 public: | 47 public: |
45 // A bitvector to express which timing fields to match on. | 48 // A bitvector to express which timing fields to match on. |
46 enum ExpectedTimingFields { | 49 enum ExpectedTimingFields { |
47 FIRST_PAINT = 1 << 0, | 50 FIRST_PAINT = 1 << 0, |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 ~TimingUpdatedObserver() override {} | 153 ~TimingUpdatedObserver() override {} |
151 | 154 |
152 std::unique_ptr<base::RunLoop> run_loop_; | 155 std::unique_ptr<base::RunLoop> run_loop_; |
153 int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. | 156 int matching_fields_ = 0; // A bitvector composed from ExpectedTimingFields. |
154 bool matched_timing_update_ = false; | 157 bool matched_timing_update_ = false; |
155 int match_document_write_block_reload_ = 0; | 158 int match_document_write_block_reload_ = 0; |
156 }; | 159 }; |
157 | 160 |
158 } // namespace | 161 } // namespace |
159 | 162 |
163 namespace page_load_metrics { | |
164 | |
165 class MockPageLoadMetrics : public mojom::PageLoadMetrics { | |
166 public: | |
167 MockPageLoadMetrics() {} | |
168 ~MockPageLoadMetrics() override {} | |
169 MOCK_METHOD2(UpdateTiming, | |
170 void(const PageLoadTiming&, const PageLoadMetadata&)); | |
171 }; | |
172 | |
173 } // namespace page_load_metrics | |
174 | |
175 namespace { | |
176 | |
177 class FakePageLoadMetricsBinder | |
178 : public content::WebContentsBindingSetTestBinder< | |
179 page_load_metrics::mojom::PageLoadMetrics> { | |
180 public: | |
181 FakePageLoadMetricsBinder( | |
182 page_load_metrics::mojom::PageLoadMetrics* page_load_metrics) | |
183 : page_load_metrics_(page_load_metrics) {} | |
184 ~FakePageLoadMetricsBinder() override {} | |
185 | |
186 void BindRequest(content::RenderFrameHost* frame_host, | |
187 page_load_metrics::mojom::PageLoadMetricsAssociatedRequest | |
188 request) override { | |
189 bindings_.AddBinding(page_load_metrics_, std::move(request), frame_host); | |
190 } | |
191 | |
192 private: | |
193 page_load_metrics::mojom::PageLoadMetrics* page_load_metrics_; | |
194 mojo::AssociatedBindingSet<page_load_metrics::mojom::PageLoadMetrics, | |
195 content::RenderFrameHost*> | |
196 bindings_; | |
197 | |
198 DISALLOW_COPY_AND_ASSIGN(FakePageLoadMetricsBinder); | |
199 }; | |
200 | |
201 } // namespace | |
202 | |
160 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { | 203 class PageLoadMetricsBrowserTest : public InProcessBrowserTest { |
161 public: | 204 public: |
162 PageLoadMetricsBrowserTest() {} | 205 PageLoadMetricsBrowserTest() {} |
163 ~PageLoadMetricsBrowserTest() override {} | 206 ~PageLoadMetricsBrowserTest() override {} |
164 | 207 |
165 protected: | 208 protected: |
166 void NavigateToUntrackedUrl() { | 209 void NavigateToUntrackedUrl() { |
167 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); | 210 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); |
168 } | 211 } |
169 | 212 |
170 bool NoPageLoadMetricsRecorded() { | 213 bool NoPageLoadMetricsRecorded() { |
171 // Determine whether any 'public' page load metrics are recorded. We exclude | 214 // Determine whether any 'public' page load metrics are recorded. We exclude |
172 // 'internal' metrics as these may be recorded for debugging purposes. | 215 // 'internal' metrics as these may be recorded for debugging purposes. |
173 size_t total_pageload_histograms = | 216 size_t total_pageload_histograms = |
174 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); | 217 histogram_tester_.GetTotalCountsForPrefix("PageLoad.").size(); |
175 size_t total_internal_histograms = | 218 size_t total_internal_histograms = |
176 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); | 219 histogram_tester_.GetTotalCountsForPrefix("PageLoad.Internal.").size(); |
177 DCHECK_GE(total_pageload_histograms, total_internal_histograms); | 220 DCHECK_GE(total_pageload_histograms, total_internal_histograms); |
178 return total_pageload_histograms - total_internal_histograms == 0; | 221 return total_pageload_histograms - total_internal_histograms == 0; |
179 } | 222 } |
180 | 223 |
181 scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() { | 224 scoped_refptr<TimingUpdatedObserver> CreateTimingUpdatedObserver() { |
182 content::WebContents* web_contents = | 225 content::WebContents* web_contents = |
183 browser()->tab_strip_model()->GetActiveWebContents(); | 226 browser()->tab_strip_model()->GetActiveWebContents(); |
227 if (!mock_page_load_metrics_) { | |
Bryan McQuade
2017/04/26 16:04:34
just so i better understand, why is this needed in
lpy
2017/04/27 10:58:35
Done, I forgot to remove this part.
As I mentione
| |
228 mock_page_load_metrics_.reset( | |
229 new page_load_metrics::MockPageLoadMetrics()); | |
230 content::WebContentsBindingSet::GetForWebContents< | |
231 page_load_metrics::mojom::PageLoadMetrics>(web_contents) | |
232 ->SetBinderForTesting(base::MakeUnique<FakePageLoadMetricsBinder>( | |
233 mock_page_load_metrics_.get())); | |
234 } | |
184 scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver( | 235 scoped_refptr<TimingUpdatedObserver> observer(new TimingUpdatedObserver( |
185 web_contents->GetRenderViewHost()->GetWidget())); | 236 web_contents->GetRenderViewHost()->GetWidget())); |
186 return observer; | 237 return observer; |
187 } | 238 } |
188 | 239 |
240 std::unique_ptr<page_load_metrics::MockPageLoadMetrics> | |
241 mock_page_load_metrics_; | |
189 base::HistogramTester histogram_tester_; | 242 base::HistogramTester histogram_tester_; |
190 | 243 |
191 private: | 244 private: |
192 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); | 245 DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsBrowserTest); |
193 }; | 246 }; |
194 | 247 |
195 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { | 248 void FailAllNetworkTransactions(net::URLRequestContextGetter* getter) { |
196 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 249 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
197 net::HttpCache* cache( | 250 net::HttpCache* cache( |
198 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); | 251 getter->GetURLRequestContext()->http_transaction_factory()->GetCache()); |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
783 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( | 836 ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( |
784 "/page_load_metrics/large.html")); | 837 "/page_load_metrics/large.html")); |
785 NavigateToUntrackedUrl(); | 838 NavigateToUntrackedUrl(); |
786 | 839 |
787 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); | 840 histogram_tester_.ExpectTotalCount(internal::kHistogramTotalBytes, 1); |
788 | 841 |
789 // Verify that there is a single sample recorded in the 10kB bucket (the size | 842 // Verify that there is a single sample recorded in the 10kB bucket (the size |
790 // of the main HTML response). | 843 // of the main HTML response). |
791 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); | 844 histogram_tester_.ExpectBucketCount(internal::kHistogramTotalBytes, 10, 1); |
792 } | 845 } |
OLD | NEW |