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..17f7579f4ba849398bb92c68264e09a2ebff4696 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; |
Bryan McQuade
2016/05/27 20:06:36
now that you include the header for this class you
mushan1
2016/05/28 03:58:32
Removed.
|
+ |
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); |
+ } |
+} |
+ |
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) { |
+ RegisterInputEventObserver(web_contents->GetRenderViewHost()); |
+} |
MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
content::WebContents* web_contents, |
@@ -526,6 +537,24 @@ MetricsWebContentsObserver* MetricsWebContentsObserver::CreateForWebContents( |
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 +692,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()) |