tor-browser

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

TestMediaKeysEventMediaCenter.mm (9266B)


      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 #import <MediaPlayer/MediaPlayer.h>
      5 
      6 #include "MediaHardwareKeysEventSourceMacMediaCenter.h"
      7 #include "MediaKeyListenerTest.h"
      8 #include "gtest/gtest.h"
      9 #include "mozilla/TimeStamp.h"
     10 #include "nsCocoaUtils.h"
     11 #include "prinrval.h"
     12 #include "prthread.h"
     13 
     14 using namespace mozilla::dom;
     15 using namespace mozilla::widget;
     16 
     17 NS_ASSUME_NONNULL_BEGIN
     18 
     19 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPlayPauseEvent)
     20 {
     21  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
     22      new MediaHardwareKeysEventSourceMacMediaCenter();
     23 
     24  ASSERT_TRUE(source->GetListenersNum() == 0);
     25 
     26  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
     27 
     28  MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter];
     29 
     30  source->AddListener(listener.get());
     31 
     32  ASSERT_TRUE(source->Open());
     33 
     34  ASSERT_TRUE(source->GetListenersNum() == 1);
     35  ASSERT_TRUE(!listener->IsReceivedResult());
     36  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying);
     37 
     38  MediaCenterEventHandler playPauseHandler = source->CreatePlayPauseHandler();
     39  playPauseHandler(nil);
     40 
     41  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePaused);
     42  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Playpause));
     43 
     44  listener->Clear();  // Reset stored media key
     45 
     46  playPauseHandler(nil);
     47 
     48  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying);
     49  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Playpause));
     50 
     51  MPRemoteCommandCenter* commandCenter =
     52      [MPRemoteCommandCenter sharedCommandCenter];
     53 
     54  ASSERT_TRUE(!commandCenter.togglePlayPauseCommand.enabled);
     55 
     56  source->SetSupportedMediaKeys({MediaControlKey::Playpause});
     57 
     58  ASSERT_TRUE(commandCenter.togglePlayPauseCommand.enabled);
     59 }
     60 
     61 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPlayEvent)
     62 {
     63  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
     64      new MediaHardwareKeysEventSourceMacMediaCenter();
     65 
     66  ASSERT_TRUE(source->GetListenersNum() == 0);
     67 
     68  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
     69 
     70  MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter];
     71 
     72  source->AddListener(listener.get());
     73 
     74  ASSERT_TRUE(source->Open());
     75 
     76  ASSERT_TRUE(source->GetListenersNum() == 1);
     77  ASSERT_TRUE(!listener->IsReceivedResult());
     78  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying);
     79 
     80  MediaCenterEventHandler playHandler = source->CreatePlayHandler();
     81 
     82  center.playbackState = MPNowPlayingPlaybackStatePaused;
     83 
     84  playHandler(nil);
     85 
     86  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying);
     87  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Play));
     88 
     89  MPRemoteCommandCenter* commandCenter =
     90      [MPRemoteCommandCenter sharedCommandCenter];
     91 
     92  ASSERT_TRUE(!commandCenter.playCommand.enabled);
     93 
     94  source->SetSupportedMediaKeys({MediaControlKey::Play});
     95 
     96  ASSERT_TRUE(commandCenter.playCommand.enabled);
     97 }
     98 
     99 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPauseEvent)
    100 {
    101  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
    102      new MediaHardwareKeysEventSourceMacMediaCenter();
    103 
    104  ASSERT_TRUE(source->GetListenersNum() == 0);
    105 
    106  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
    107 
    108  MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter];
    109 
    110  source->AddListener(listener.get());
    111 
    112  ASSERT_TRUE(source->Open());
    113 
    114  ASSERT_TRUE(source->GetListenersNum() == 1);
    115  ASSERT_TRUE(!listener->IsReceivedResult());
    116  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePlaying);
    117 
    118  MediaCenterEventHandler pauseHandler = source->CreatePauseHandler();
    119 
    120  pauseHandler(nil);
    121 
    122  ASSERT_TRUE(center.playbackState == MPNowPlayingPlaybackStatePaused);
    123  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Pause));
    124 
    125  MPRemoteCommandCenter* commandCenter =
    126      [MPRemoteCommandCenter sharedCommandCenter];
    127 
    128  ASSERT_TRUE(!commandCenter.pauseCommand.enabled);
    129 
    130  source->SetSupportedMediaKeys({MediaControlKey::Pause});
    131 
    132  ASSERT_TRUE(commandCenter.pauseCommand.enabled);
    133 }
    134 
    135 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterPrevNextEvent)
    136 {
    137  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
    138      new MediaHardwareKeysEventSourceMacMediaCenter();
    139 
    140  ASSERT_TRUE(source->GetListenersNum() == 0);
    141 
    142  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
    143 
    144  source->AddListener(listener.get());
    145 
    146  ASSERT_TRUE(source->Open());
    147 
    148  MediaCenterEventHandler nextHandler = source->CreateNextTrackHandler();
    149 
    150  nextHandler(nil);
    151 
    152  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Nexttrack));
    153 
    154  MediaCenterEventHandler previousHandler =
    155      source->CreatePreviousTrackHandler();
    156 
    157  previousHandler(nil);
    158 
    159  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Previoustrack));
    160 
    161  MPRemoteCommandCenter* commandCenter =
    162      [MPRemoteCommandCenter sharedCommandCenter];
    163 
    164  ASSERT_TRUE(!commandCenter.previousTrackCommand.enabled);
    165  ASSERT_TRUE(!commandCenter.nextTrackCommand.enabled);
    166 
    167  source->SetSupportedMediaKeys(
    168      {MediaControlKey::Previoustrack, MediaControlKey::Nexttrack});
    169 
    170  ASSERT_TRUE(commandCenter.previousTrackCommand.enabled);
    171  ASSERT_TRUE(commandCenter.nextTrackCommand.enabled);
    172 }
    173 
    174 @interface MockChangePlaybackPositionCommandEvent : MPRemoteCommandEvent
    175 @property(nonatomic, assign) NSTimeInterval positionTime;
    176 @end
    177 
    178 @implementation MockChangePlaybackPositionCommandEvent
    179 
    180 - (instancetype)initWithPositionTime:(NSTimeInterval)time {
    181  _positionTime = time;
    182  return self;
    183 }
    184 
    185 @end
    186 
    187 TEST(MediaHardwareKeysEventSourceMacMediaCenter,
    188     TestMediaCenterChangePlaybackPositionEvent)
    189 {
    190  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
    191      new MediaHardwareKeysEventSourceMacMediaCenter();
    192 
    193  ASSERT_TRUE(source->GetListenersNum() == 0);
    194 
    195  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
    196 
    197  source->AddListener(listener.get());
    198 
    199  ASSERT_TRUE(source->Open());
    200 
    201  MediaCenterEventHandler changePositionHandler =
    202      source->CreateChangePlaybackPositionHandler();
    203 
    204  double seekPosition = 5.0;
    205  MockChangePlaybackPositionCommandEvent* event =
    206      [[MockChangePlaybackPositionCommandEvent alloc]
    207          initWithPositionTime:seekPosition];
    208  changePositionHandler(event);
    209 
    210  ASSERT_TRUE(listener->IsKeyEqualTo(MediaControlKey::Seekto));
    211  mozilla::Maybe<SeekDetails> seekDetails = listener->GetSeekDetails();
    212  ASSERT_TRUE(seekDetails->mAbsolute->mSeekTime == seekPosition);
    213 
    214  MPRemoteCommandCenter* commandCenter =
    215      [MPRemoteCommandCenter sharedCommandCenter];
    216 
    217  ASSERT_TRUE(!commandCenter.changePlaybackPositionCommand.enabled);
    218 
    219  source->SetSupportedMediaKeys({MediaControlKey::Seekto});
    220 
    221  ASSERT_TRUE(commandCenter.changePlaybackPositionCommand.enabled);
    222 }
    223 
    224 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestSetMetadata)
    225 {
    226  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
    227      new MediaHardwareKeysEventSourceMacMediaCenter();
    228 
    229  ASSERT_TRUE(source->GetListenersNum() == 0);
    230 
    231  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
    232 
    233  source->AddListener(listener.get());
    234 
    235  ASSERT_TRUE(source->Open());
    236 
    237  MediaMetadataBase metadata;
    238  metadata.mTitle = u"MediaPlayback";
    239  metadata.mArtist = u"Firefox";
    240  metadata.mAlbum = u"Mozilla";
    241  source->SetMediaMetadata(metadata);
    242 
    243  // The update procedure of nowPlayingInfo is async, so wait for a second
    244  // before checking the result.
    245  PR_Sleep(PR_SecondsToInterval(1));
    246  MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter];
    247  ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyTitle]
    248      isEqualToString:@"MediaPlayback"]);
    249  ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyArtist]
    250      isEqualToString:@"Firefox"]);
    251  ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyAlbumTitle]
    252      isEqualToString:@"Mozilla"]);
    253 
    254  source->Close();
    255  PR_Sleep(PR_SecondsToInterval(1));
    256  ASSERT_TRUE(center.nowPlayingInfo == nil);
    257 }
    258 
    259 TEST(MediaHardwareKeysEventSourceMacMediaCenter, TestMediaCenterSetPosition)
    260 {
    261  RefPtr<MediaHardwareKeysEventSourceMacMediaCenter> source =
    262      new MediaHardwareKeysEventSourceMacMediaCenter();
    263 
    264  ASSERT_TRUE(source->GetListenersNum() == 0);
    265 
    266  RefPtr<MediaKeyListenerTest> listener = new MediaKeyListenerTest();
    267 
    268  source->AddListener(listener.get());
    269 
    270  ASSERT_TRUE(source->Open());
    271 
    272  PositionState positionState;
    273  positionState.mDuration = 10.0;
    274  positionState.mPlaybackRate = 1.0;
    275  positionState.mLastReportedPlaybackPosition = 5.0;
    276  positionState.mPositionUpdatedTime = mozilla::TimeStamp::Now();
    277  source->SetPositionState(mozilla::Some(positionState));
    278 
    279  PR_Sleep(PR_SecondsToInterval(1));
    280  MPNowPlayingInfoCenter* center = [MPNowPlayingInfoCenter defaultCenter];
    281  ASSERT_TRUE([center.nowPlayingInfo[MPMediaItemPropertyPlaybackDuration]
    282      isEqualToNumber:@10.0]);
    283  ASSERT_TRUE(
    284      fabs([center.nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime]
    285               doubleValue] -
    286           5.0) < 0.1);
    287  ASSERT_TRUE([center.nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate]
    288      isEqualToNumber:@1.0]);
    289 }
    290 
    291 NS_ASSUME_NONNULL_END