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

Side by Side Diff: chrome/browser/page_load_metrics/metrics_web_contents_observer.cc

Issue 2847513002: Break page load metrics test dependency on IPC. (Closed)
Patch Set: add expectation in wait method 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 unified diff | Download patch
OLDNEW
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 "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" 5 #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <ostream> 8 #include <ostream>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 57
58 return UserInitiatedInfo::RenderInitiated( 58 return UserInitiatedInfo::RenderInitiated(
59 navigation_handle->HasUserGesture(), 59 navigation_handle->HasUserGesture(),
60 committed_load && 60 committed_load &&
61 committed_load->input_tracker()->FindAndConsumeInputEventsBefore( 61 committed_load->input_tracker()->FindAndConsumeInputEventsBefore(
62 navigation_handle->NavigationStart())); 62 navigation_handle->NavigationStart()));
63 } 63 }
64 64
65 } // namespace 65 } // namespace
66 66
67 // static
68 MetricsWebContentsObserver::MetricsWebContentsObserver( 67 MetricsWebContentsObserver::MetricsWebContentsObserver(
69 content::WebContents* web_contents, 68 content::WebContents* web_contents,
70 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) 69 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface)
71 : content::WebContentsObserver(web_contents), 70 : content::WebContentsObserver(web_contents),
72 in_foreground_(false), 71 in_foreground_(false),
73 embedder_interface_(std::move(embedder_interface)), 72 embedder_interface_(std::move(embedder_interface)),
74 has_navigated_(false) { 73 has_navigated_(false) {
75 RegisterInputEventObserver(web_contents->GetRenderViewHost()); 74 RegisterInputEventObserver(web_contents->GetRenderViewHost());
76 } 75 }
77 76
77 // static
78 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( 78 MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents(
79 content::WebContents* web_contents, 79 content::WebContents* web_contents,
80 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) { 80 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface) {
81 DCHECK(web_contents); 81 DCHECK(web_contents);
82 82
83 MetricsWebContentsObserver* metrics = FromWebContents(web_contents); 83 MetricsWebContentsObserver* metrics = FromWebContents(web_contents);
84 if (!metrics) { 84 if (!metrics) {
85 metrics = new MetricsWebContentsObserver(web_contents, 85 metrics = new MetricsWebContentsObserver(web_contents,
86 std::move(embedder_interface)); 86 std::move(embedder_interface));
87 web_contents->SetUserData(UserDataKey(), metrics); 87 web_contents->SetUserData(UserDataKey(), metrics);
88 } 88 }
89 return metrics; 89 return metrics;
90 } 90 }
91 91
92 MetricsWebContentsObserver::~MetricsWebContentsObserver() { 92 MetricsWebContentsObserver::~MetricsWebContentsObserver() {
93 // TODO(csharrison): Use a more user-initiated signal for CLOSE. 93 // TODO(csharrison): Use a more user-initiated signal for CLOSE.
94 NotifyPageEndAllLoads(END_CLOSE, UserInitiatedInfo::NotUserInitiated()); 94 NotifyPageEndAllLoads(END_CLOSE, UserInitiatedInfo::NotUserInitiated());
95
96 for (auto& observer : testing_observers_)
97 observer.OnGoingAway();
95 } 98 }
96 99
97 void MetricsWebContentsObserver::RegisterInputEventObserver( 100 void MetricsWebContentsObserver::RegisterInputEventObserver(
98 content::RenderViewHost* host) { 101 content::RenderViewHost* host) {
99 if (host != nullptr) 102 if (host != nullptr)
100 host->GetWidget()->AddInputEventObserver(this); 103 host->GetWidget()->AddInputEventObserver(this);
101 } 104 }
102 105
103 void MetricsWebContentsObserver::UnregisterInputEventObserver( 106 void MetricsWebContentsObserver::UnregisterInputEventObserver(
104 content::RenderViewHost* host) { 107 content::RenderViewHost* host) {
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 if (render_frame_host->GetParent() != nullptr) { 575 if (render_frame_host->GetParent() != nullptr) {
573 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming 576 // Child frames may send PageLoadMetadata updates, but not PageLoadTiming
574 // updates. 577 // updates.
575 if (!timing.IsEmpty()) 578 if (!timing.IsEmpty())
576 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME); 579 RecordInternalError(ERR_TIMING_IPC_FROM_SUBFRAME);
577 committed_load_->UpdateChildFrameMetadata(metadata); 580 committed_load_->UpdateChildFrameMetadata(metadata);
578 return; 581 return;
579 } 582 }
580 583
581 committed_load_->UpdateTiming(timing, metadata); 584 committed_load_->UpdateTiming(timing, metadata);
585
586 for (auto& observer : testing_observers_)
587 observer.OnTimingUpdated(timing, metadata);
582 } 588 }
583 589
584 bool MetricsWebContentsObserver::ShouldTrackNavigation( 590 bool MetricsWebContentsObserver::ShouldTrackNavigation(
585 content::NavigationHandle* navigation_handle) const { 591 content::NavigationHandle* navigation_handle) const {
586 DCHECK(navigation_handle->IsInMainFrame()); 592 DCHECK(navigation_handle->IsInMainFrame());
587 DCHECK(!navigation_handle->HasCommitted() || 593 DCHECK(!navigation_handle->HasCommitted() ||
588 !navigation_handle->IsSameDocument()); 594 !navigation_handle->IsSameDocument());
589 595
590 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), 596 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(),
591 navigation_handle).ShouldTrack(); 597 navigation_handle).ShouldTrack();
592 } 598 }
593 599
600 void MetricsWebContentsObserver::AddTestingObserver(TestingObserver* observer) {
601 if (!testing_observers_.HasObserver(observer))
602 testing_observers_.AddObserver(observer);
603 }
604
605 void MetricsWebContentsObserver::RemoveTestingObserver(
606 TestingObserver* observer) {
607 testing_observers_.RemoveObserver(observer);
608 }
609
610 MetricsWebContentsObserver::TestingObserver::TestingObserver(
611 content::WebContents* web_contents)
612 : observer_(page_load_metrics::MetricsWebContentsObserver::FromWebContents(
613 web_contents)) {
614 observer_->AddTestingObserver(this);
615 }
616
617 MetricsWebContentsObserver::TestingObserver::~TestingObserver() {
618 if (observer_) {
619 observer_->RemoveTestingObserver(this);
620 observer_ = nullptr;
621 }
622 }
623
624 void MetricsWebContentsObserver::TestingObserver::OnGoingAway() {
625 observer_ = nullptr;
626 }
627
594 } // namespace page_load_metrics 628 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698