Add interface and Mac implementation for responsiveness::NativeEventObserver.

NativeEventObserver forwards will_run and did_run callbacks from the native
event processor to responsiveness::Watcher.

This CL also adds the macOS implementation. This requires modifying
BrowserCrApplication and ShellCrApplication to support a new protocol:
NativeEventProcessor, which allows observers to register for event will_run and
did_run callbacks.

Bug: 859155
Change-Id: Ie2db48efb4a93377ad54e91cbdb376d990b25f11
Reviewed-on: https://chromium-review.googlesource.com/1157235
Commit-Queue: Erik Chen <[email protected]>
Reviewed-by: Avi Drissman <[email protected]>
Reviewed-by: Alexander Timin <[email protected]>
Reviewed-by: Timothy Dresser <[email protected]>
Cr-Commit-Position: refs/heads/master@{#580345}
diff --git a/content/shell/browser/shell_application_mac.mm b/content/shell/browser/shell_application_mac.mm
index 58d8773c..89896675 100644
--- a/content/shell/browser/shell_application_mac.mm
+++ b/content/shell/browser/shell_application_mac.mm
@@ -5,12 +5,20 @@
 #include "content/shell/browser/shell_application_mac.h"
 
 #include "base/auto_reset.h"
+#include "base/observer_list.h"
+#include "content/public/browser/native_event_processor_mac.h"
+#include "content/public/browser/native_event_processor_observer_mac.h"
 #include "content/public/common/url_constants.h"
 #include "content/shell/browser/shell.h"
 #include "content/shell/browser/shell_browser_context.h"
 #include "content/shell/browser/shell_content_browser_client.h"
 #include "url/gurl.h"
 
+@interface ShellCrApplication ()<NativeEventProcessor> {
+  base::ObserverList<content::NativeEventProcessorObserver> observers_;
+}
+@end
+
 @implementation ShellCrApplication
 
 - (BOOL)isHandlingSendEvent {
@@ -19,6 +27,9 @@
 
 - (void)sendEvent:(NSEvent*)event {
   base::AutoReset<BOOL> scoper(&handlingSendEvent_, YES);
+
+  content::ScopedNotifyNativeEventProcessorObserver scopedObserverNotifier(
+      &observers_, event);
   [super sendEvent:event];
 }
 
@@ -35,4 +46,14 @@
                                   gfx::Size());
 }
 
+- (void)addNativeEventProcessorObserver:
+    (content::NativeEventProcessorObserver*)observer {
+  observers_.AddObserver(observer);
+}
+
+- (void)removeNativeEventProcessorObserver:
+    (content::NativeEventProcessorObserver*)observer {
+  observers_.RemoveObserver(observer);
+}
+
 @end