Chromium Code Reviews| Index: components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| index 7678a3f4ace6e08330d369f04b13909e94293bf4..7c22cc55971162568caf43576df81b7a5aa7d6a2 100644 |
| --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc |
| @@ -20,6 +20,7 @@ |
| #include "content/public/browser/navigation_details.h" |
| #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/web_contents.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "content/public/browser/web_contents_user_data.h" |
| @@ -30,6 +31,8 @@ |
| DEFINE_WEB_CONTENTS_USER_DATA_KEY( |
| page_load_metrics::MetricsWebContentsObserver); |
| +class RenderViewHost; |
| + |
| namespace page_load_metrics { |
| namespace internal { |
| @@ -372,6 +375,12 @@ void PageLoadTracker::Redirect(content::NavigationHandle* navigation_handle) { |
| } |
| } |
| +void PageLoadTracker::OnInputEvent(const blink::WebInputEvent& event) { |
| + for (const auto& observer : observers_) { |
| + observer->OnUserInput(event, navigation_start_ - base::TimeTicks::Now()); |
|
Bryan McQuade
2016/05/27 15:03:31
I'm inclined to not provide a timestamp in the cal
Bryan McQuade
2016/05/27 17:31:47
charles pointed out to me that you can call naviga
|
| + } |
| +} |
| + |
| bool PageLoadTracker::UpdateTiming(const PageLoadTiming& new_timing, |
| const PageLoadMetadata& new_metadata) { |
| // Throw away IPCs that are not relevant to the current navigation. |
| @@ -508,7 +517,9 @@ MetricsWebContentsObserver::MetricsWebContentsObserver( |
| : content::WebContentsObserver(web_contents), |
| in_foreground_(false), |
| embedder_interface_(std::move(embedder_interface)), |
| - has_navigated_(false) {} |
| + has_navigated_(false) { |
| + this->RegisterInputEventObserver(web_contents->GetRenderViewHost()); |
|
Bryan McQuade
2016/05/27 15:03:31
you can exclude 'this->' when invoking member func
|
| +} |
| MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
| content::WebContents* web_contents, |
| @@ -521,11 +532,30 @@ MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
| std::move(embedder_interface)); |
| web_contents->SetUserData(UserDataKey(), metrics); |
| } |
| + |
| return metrics; |
| } |
| MetricsWebContentsObserver::~MetricsWebContentsObserver() { |
| NotifyAbortAllLoads(ABORT_CLOSE); |
| + UnregisterInputEventObserver(web_contents()->GetRenderViewHost()); |
| +} |
| + |
| +void MetricsWebContentsObserver::RegisterInputEventObserver( |
| + content::RenderViewHost* host) { |
| + host->GetWidget()->AddInputEventObserver(this); |
| +} |
| + |
| +void MetricsWebContentsObserver::UnregisterInputEventObserver( |
| + content::RenderViewHost* host) { |
| + host->GetWidget()->RemoveInputEventObserver(this); |
| +} |
| + |
| +void MetricsWebContentsObserver::RenderViewHostChanged( |
| + content::RenderViewHost* old_host, |
| + content::RenderViewHost* new_host) { |
| + UnregisterInputEventObserver(old_host); |
| + RegisterInputEventObserver(new_host); |
| } |
| bool MetricsWebContentsObserver::OnMessageReceived( |
| @@ -663,6 +693,21 @@ void MetricsWebContentsObserver::NavigationStopped() { |
| NotifyAbortAllLoads(ABORT_STOP); |
| } |
| +bool MetricsWebContentsObserver::OnInputEvent( |
| + const blink::WebInputEvent& event) { |
| + // Ignore browser navigation or reload which comes with type Undefined. |
| + if (event.type == blink::WebInputEvent::Type::Undefined) |
| + return false; |
| + |
| + if (!committed_load_) { |
| + RecordInternalError(ERR_USER_INPUT_WITH_NO_RELEVANT_LOAD); |
| + return false; |
| + } |
| + |
| + committed_load_->OnInputEvent(event); |
| + return true; |
| +} |
| + |
| void MetricsWebContentsObserver::DidRedirectNavigation( |
| content::NavigationHandle* navigation_handle) { |
| if (!navigation_handle->IsInMainFrame()) |