| Index: content/browser/renderer_host/render_widget_host_view_mac_unittest.mm | 
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm | 
| index 59ba0e7c5c24564d1d44f5281ad0f51fb30896ad..e482c755c8966ead410ed6881e340c63afa52a83 100644 | 
| --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm | 
| +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm | 
| @@ -40,6 +40,7 @@ | 
| #include "testing/gtest_mac.h" | 
| #import "third_party/ocmock/OCMock/OCMock.h" | 
| #import "third_party/ocmock/ocmock_extensions.h" | 
| +#import "ui/base/test/scoped_fake_nswindow_focus.h" | 
| #include "ui/events/base_event_utils.h" | 
| #include "ui/events/blink/web_input_event_traits.h" | 
| #include "ui/events/test/cocoa_test_event_utils.h" | 
| @@ -465,6 +466,10 @@ TEST_F(RenderWidgetHostViewMacTest, AcceleratorDestroy) { | 
| NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, | 
| Source<RenderWidgetHost>(rwh)); | 
|  | 
| +  // Key equivalents are only sent to the renderer if the window is key. | 
| +  ui::test::ScopedFakeNSWindowFocus key_window_faker; | 
| +  [[view->cocoa_view() window] makeKeyWindow]; | 
| + | 
| // Command-ESC will destroy the view, while the window is still in | 
| // |-performKeyEquivalent:|.  There are other cases where this can | 
| // happen, Command-ESC is the easiest to trigger. | 
| @@ -1795,4 +1800,46 @@ TEST_F(InputMethodMacTest, MonitorCompositionRangeForActiveWidget) { | 
| EXPECT_FALSE(is_child_msg_for_monitor_request); | 
| } | 
|  | 
| +// Ensure RenderWidgetHostViewMac claims hotkeys when AppKit spams the UI with | 
| +// -performKeyEquivalent:, but only when the window is key. | 
| +TEST_F(RenderWidgetHostViewMacTest, ForwardKeyEquivalentsOnlyIfKey) { | 
| +  // This test needs an NSWindow. |rwhv_cocoa_| isn't in one, but going | 
| +  // fullscreen conveniently puts it in one. | 
| +  EXPECT_FALSE([rwhv_cocoa_ window]); | 
| +  rwhv_mac_->InitAsFullscreen(nullptr); | 
| +  NSWindow* window = [rwhv_cocoa_ window]; | 
| +  EXPECT_TRUE(window); | 
| + | 
| +  MockRenderProcessHost* process_host = test_rvh()->GetProcess(); | 
| +  process_host->sink().ClearMessages(); | 
| + | 
| +  ui::test::ScopedFakeNSWindowFocus key_window_faker; | 
| +  EXPECT_FALSE([window isKeyWindow]); | 
| +  EXPECT_EQ(0U, process_host->sink().message_count()); | 
| + | 
| +  // Cmd+x. | 
| +  NSEvent* key_down = | 
| +      cocoa_test_event_utils::KeyEventWithType(NSKeyDown, NSCommandKeyMask); | 
| + | 
| +  // Sending while not key should forward along the responder chain (e.g. to the | 
| +  // mainMenu). Note the event is being sent to the NSWindow, which may also ask | 
| +  // other parts of the UI to handle it, but in the test they should all say | 
| +  // "NO" as well. | 
| +  EXPECT_FALSE([window performKeyEquivalent:key_down]); | 
| +  EXPECT_EQ(0U, process_host->sink().message_count()); | 
| + | 
| +  // Make key and send again. Event should be seen. | 
| +  [window makeKeyWindow]; | 
| +  EXPECT_TRUE([window isKeyWindow]); | 
| +  process_host->sink().ClearMessages();  // Ignore the focus messages. | 
| + | 
| +  // -performKeyEquivalent: now returns YES to prevent further propagation, and | 
| +  // the event is sent to the renderer. | 
| +  EXPECT_TRUE([window performKeyEquivalent:key_down]); | 
| +  EXPECT_EQ(2U, process_host->sink().message_count()); | 
| +  EXPECT_EQ("RawKeyDown Char", GetInputMessageTypes(process_host)); | 
| + | 
| +  rwhv_mac_->release_pepper_fullscreen_window_for_testing(); | 
| +} | 
| + | 
| }  // namespace content | 
|  |