tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }