TestMediaKeysEventMac.mm (5193B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #import <AppKit/AppKit.h> 6 #import <AppKit/NSEvent.h> 7 #import <ApplicationServices/ApplicationServices.h> 8 #import <CoreFoundation/CoreFoundation.h> 9 #import <IOKit/hidsystem/ev_keymap.h> 10 11 #include "MediaHardwareKeysEventSourceMac.h" 12 #include "MediaKeyListenerTest.h" 13 #include "gtest/gtest.h" 14 15 using namespace mozilla::dom; 16 using namespace mozilla::widget; 17 18 static const int kSystemDefinedEventMediaKeysSubtype = 8; 19 20 static void SendFakeEvent(RefPtr<MediaHardwareKeysEventSourceMac>& aSource, 21 int aKeyData) { 22 NSEvent* event = 23 [NSEvent otherEventWithType:NSEventTypeSystemDefined 24 location:NSZeroPoint 25 modifierFlags:0 26 timestamp:0 27 windowNumber:0 28 context:nil 29 subtype:kSystemDefinedEventMediaKeysSubtype 30 data1:aKeyData 31 data2:0]; 32 aSource->EventTapCallback(nullptr, static_cast<CGEventType>(0), 33 [event CGEvent], aSource.get()); 34 } 35 36 static void NotifyFakeNonMediaKey( 37 RefPtr<MediaHardwareKeysEventSourceMac>& aSource, bool aIsKeyPressed) { 38 int keyData = 0 | ((aIsKeyPressed ? 0xA : 0xB) << 8); 39 SendFakeEvent(aSource, keyData); 40 } 41 42 static void NotifyFakeMediaControlKey( 43 RefPtr<MediaHardwareKeysEventSourceMac>& aSource, MediaControlKey aEvent, 44 bool aIsKeyPressed) { 45 int keyData = 0; 46 if (aEvent == MediaControlKey::Playpause) { 47 keyData = NX_KEYTYPE_PLAY << 16; 48 } else if (aEvent == MediaControlKey::Nexttrack) { 49 keyData = NX_KEYTYPE_NEXT << 16; 50 } else if (aEvent == MediaControlKey::Previoustrack) { 51 keyData = NX_KEYTYPE_PREVIOUS << 16; 52 } 53 keyData |= ((aIsKeyPressed ? 0xA : 0xB) << 8); 54 SendFakeEvent(aSource, keyData); 55 } 56 57 static void NotifyKeyPressedMediaKey( 58 RefPtr<MediaHardwareKeysEventSourceMac>& aSource, MediaControlKey aEvent) { 59 NotifyFakeMediaControlKey(aSource, aEvent, true /* key pressed */); 60 } 61 62 static void NotifyKeyReleasedMediaKeysEvent( 63 RefPtr<MediaHardwareKeysEventSourceMac>& aSource, MediaControlKey aEvent) { 64 NotifyFakeMediaControlKey(aSource, aEvent, false /* key released */); 65 } 66 67 static void NotifyKeyPressedNonMediaKeysEvents( 68 RefPtr<MediaHardwareKeysEventSourceMac>& aSource) { 69 NotifyFakeNonMediaKey(aSource, true /* key pressed */); 70 } 71 72 static void NotifyKeyReleasedNonMediaKeysEvents( 73 RefPtr<MediaHardwareKeysEventSourceMac>& aSource) { 74 NotifyFakeNonMediaKey(aSource, false /* key released */); 75 } 76 77 TEST(MediaHardwareKeysEventSourceMac, TestKeyPressedMediaKeysEvent) 78 { 79 RefPtr<MediaHardwareKeysEventSourceMac> source = 80 new MediaHardwareKeysEventSourceMac(); 81 ASSERT_TRUE(source->GetListenersNum() == 0); 82 83 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 84 source->AddListener(listener.get()); 85 ASSERT_TRUE(source->GetListenersNum() == 1); 86 ASSERT_TRUE(!listener->IsReceivedResult()); 87 88 NotifyKeyPressedMediaKey(source, MediaControlKey::Playpause); 89 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Playpause)); 90 91 NotifyKeyPressedMediaKey(source, MediaControlKey::Nexttrack); 92 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Nexttrack)); 93 94 NotifyKeyPressedMediaKey(source, MediaControlKey::Previoustrack); 95 ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Previoustrack)); 96 97 source->RemoveListener(listener); 98 ASSERT_TRUE(source->GetListenersNum() == 0); 99 } 100 101 TEST(MediaHardwareKeysEventSourceMac, TestKeyReleasedMediaKeysEvent) 102 { 103 RefPtr<MediaHardwareKeysEventSourceMac> source = 104 new MediaHardwareKeysEventSourceMac(); 105 ASSERT_TRUE(source->GetListenersNum() == 0); 106 107 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 108 source->AddListener(listener.get()); 109 ASSERT_TRUE(source->GetListenersNum() == 1); 110 ASSERT_TRUE(!listener->IsReceivedResult()); 111 112 NotifyKeyReleasedMediaKeysEvent(source, MediaControlKey::Playpause); 113 ASSERT_TRUE(!listener->IsReceivedResult()); 114 115 NotifyKeyReleasedMediaKeysEvent(source, MediaControlKey::Nexttrack); 116 ASSERT_TRUE(!listener->IsReceivedResult()); 117 118 NotifyKeyReleasedMediaKeysEvent(source, MediaControlKey::Previoustrack); 119 ASSERT_TRUE(!listener->IsReceivedResult()); 120 121 source->RemoveListener(listener); 122 ASSERT_TRUE(source->GetListenersNum() == 0); 123 } 124 125 TEST(MediaHardwareKeysEventSourceMac, TestNonMediaKeysEvent) 126 { 127 RefPtr<MediaHardwareKeysEventSourceMac> source = 128 new MediaHardwareKeysEventSourceMac(); 129 ASSERT_TRUE(source->GetListenersNum() == 0); 130 131 RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest(); 132 source->AddListener(listener.get()); 133 ASSERT_TRUE(source->GetListenersNum() == 1); 134 ASSERT_TRUE(!listener->IsReceivedResult()); 135 136 NotifyKeyPressedNonMediaKeysEvents(source); 137 ASSERT_TRUE(!listener->IsReceivedResult()); 138 139 NotifyKeyReleasedNonMediaKeysEvents(source); 140 ASSERT_TRUE(!listener->IsReceivedResult()); 141 142 source->RemoveListener(listener); 143 ASSERT_TRUE(source->GetListenersNum() == 0); 144 }