tor-browser

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

TestMediaController.cpp (7260B)


      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 #include "MediaControlService.h"
      6 #include "MediaController.h"
      7 #include "gtest/gtest.h"
      8 #include "mozilla/dom/MediaSessionBinding.h"
      9 
     10 using namespace mozilla::dom;
     11 
     12 #define CONTROLLER_ID 0
     13 #define FAKE_CONTEXT_ID 0
     14 
     15 #define FIRST_CONTROLLER_ID 0
     16 
     17 TEST(MediaController, DefaultValueCheck)
     18 {
     19  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
     20  ASSERT_TRUE(!controller->IsAnyMediaBeingControlled());
     21  ASSERT_TRUE(controller->Id() == CONTROLLER_ID);
     22  ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None);
     23  ASSERT_TRUE(!controller->IsAudible());
     24 }
     25 
     26 TEST(MediaController, IsAnyMediaBeingControlled)
     27 {
     28  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
     29  ASSERT_TRUE(!controller->IsAnyMediaBeingControlled());
     30 
     31  controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     32                                         MediaPlaybackState::eStarted);
     33  ASSERT_TRUE(controller->IsAnyMediaBeingControlled());
     34 
     35  controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     36                                         MediaPlaybackState::eStarted);
     37  ASSERT_TRUE(controller->IsAnyMediaBeingControlled());
     38 
     39  controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     40                                         MediaPlaybackState::eStopped);
     41  ASSERT_TRUE(controller->IsAnyMediaBeingControlled());
     42 
     43  controller->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     44                                         MediaPlaybackState::eStopped);
     45  ASSERT_TRUE(!controller->IsAnyMediaBeingControlled());
     46 }
     47 
     48 class FakeControlledMedia final {
     49 public:
     50  explicit FakeControlledMedia(MediaController* aController)
     51      : mController(aController) {
     52    mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     53                                            MediaPlaybackState::eStarted);
     54  }
     55 
     56  void SetPlaying(MediaPlaybackState aState) {
     57    if (mPlaybackState == aState) {
     58      return;
     59    }
     60    mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID, aState);
     61    mPlaybackState = aState;
     62  }
     63 
     64  void SetAudible(MediaAudibleState aState) {
     65    if (mAudibleState == aState) {
     66      return;
     67    }
     68    mController->NotifyMediaAudibleChanged(FAKE_CONTEXT_ID, aState);
     69    mAudibleState = aState;
     70  }
     71 
     72  ~FakeControlledMedia() {
     73    if (mPlaybackState == MediaPlaybackState::ePlayed) {
     74      mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     75                                              MediaPlaybackState::ePaused);
     76    }
     77    mController->NotifyMediaPlaybackChanged(FAKE_CONTEXT_ID,
     78                                            MediaPlaybackState::eStopped);
     79  }
     80 
     81 private:
     82  MediaPlaybackState mPlaybackState = MediaPlaybackState::eStopped;
     83  MediaAudibleState mAudibleState = MediaAudibleState::eInaudible;
     84  RefPtr<MediaController> mController;
     85 };
     86 
     87 TEST(MediaController, ActiveAndDeactiveController)
     88 {
     89  RefPtr<MediaControlService> service = MediaControlService::GetService();
     90  ASSERT_TRUE(service->GetActiveControllersNum() == 0);
     91 
     92  RefPtr<MediaController> controller = new MediaController(FIRST_CONTROLLER_ID);
     93 
     94  // In order to check active control number after FakeControlledMedia
     95  // destroyed.
     96  {
     97    FakeControlledMedia fakeMedia(controller);
     98    fakeMedia.SetPlaying(MediaPlaybackState::ePlayed);
     99    ASSERT_TRUE(service->GetActiveControllersNum() == 1);
    100 
    101    fakeMedia.SetAudible(MediaAudibleState::eAudible);
    102    ASSERT_TRUE(service->GetActiveControllersNum() == 1);
    103 
    104    fakeMedia.SetAudible(MediaAudibleState::eInaudible);
    105    ASSERT_TRUE(service->GetActiveControllersNum() == 1);
    106  }
    107 
    108  ASSERT_TRUE(service->GetActiveControllersNum() == 0);
    109 }
    110 
    111 TEST(MediaController, AudibleChanged)
    112 {
    113  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
    114 
    115  FakeControlledMedia fakeMedia(controller);
    116  fakeMedia.SetPlaying(MediaPlaybackState::ePlayed);
    117  ASSERT_TRUE(!controller->IsAudible());
    118 
    119  fakeMedia.SetAudible(MediaAudibleState::eAudible);
    120  ASSERT_TRUE(controller->IsAudible());
    121 
    122  fakeMedia.SetAudible(MediaAudibleState::eInaudible);
    123  ASSERT_TRUE(!controller->IsAudible());
    124 }
    125 
    126 TEST(MediaController, PlayingStateChangeViaControlledMedia)
    127 {
    128  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
    129 
    130  // In order to check playing state after FakeControlledMedia destroyed.
    131  {
    132    FakeControlledMedia foo(controller);
    133    ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None);
    134 
    135    foo.SetPlaying(MediaPlaybackState::ePlayed);
    136    ASSERT_TRUE(controller->PlaybackState() ==
    137                MediaSessionPlaybackState::Playing);
    138 
    139    foo.SetPlaying(MediaPlaybackState::ePaused);
    140    ASSERT_TRUE(controller->PlaybackState() ==
    141                MediaSessionPlaybackState::Paused);
    142 
    143    foo.SetPlaying(MediaPlaybackState::ePlayed);
    144    ASSERT_TRUE(controller->PlaybackState() ==
    145                MediaSessionPlaybackState::Playing);
    146  }
    147 
    148  // FakeControlledMedia has been destroyed, no playing media exists.
    149  ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::Paused);
    150 }
    151 
    152 TEST(MediaController, ControllerShouldRemainPlayingIfAnyPlayingMediaExists)
    153 {
    154  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
    155 
    156  {
    157    FakeControlledMedia foo(controller);
    158    ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::None);
    159 
    160    foo.SetPlaying(MediaPlaybackState::ePlayed);
    161    ASSERT_TRUE(controller->PlaybackState() ==
    162                MediaSessionPlaybackState::Playing);
    163 
    164    // foo is playing, so controller is in `playing` state.
    165    FakeControlledMedia bar(controller);
    166    ASSERT_TRUE(controller->PlaybackState() ==
    167                MediaSessionPlaybackState::Playing);
    168 
    169    bar.SetPlaying(MediaPlaybackState::ePlayed);
    170    ASSERT_TRUE(controller->PlaybackState() ==
    171                MediaSessionPlaybackState::Playing);
    172 
    173    // Although we paused bar, but foo is still playing, so the controller would
    174    // still be in `playing`.
    175    bar.SetPlaying(MediaPlaybackState::ePaused);
    176    ASSERT_TRUE(controller->PlaybackState() ==
    177                MediaSessionPlaybackState::Playing);
    178 
    179    foo.SetPlaying(MediaPlaybackState::ePaused);
    180    ASSERT_TRUE(controller->PlaybackState() ==
    181                MediaSessionPlaybackState::Paused);
    182  }
    183 
    184  // both foo and bar have been destroyed, no playing media exists.
    185  ASSERT_TRUE(controller->PlaybackState() == MediaSessionPlaybackState::Paused);
    186 }
    187 
    188 TEST(MediaController, PictureInPictureModeOrFullscreen)
    189 {
    190  RefPtr<MediaController> controller = new MediaController(CONTROLLER_ID);
    191  ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen());
    192 
    193  controller->SetIsInPictureInPictureMode(FAKE_CONTEXT_ID, true);
    194  ASSERT_TRUE(controller->IsBeingUsedInPIPModeOrFullscreen());
    195 
    196  controller->SetIsInPictureInPictureMode(FAKE_CONTEXT_ID, false);
    197  ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen());
    198 
    199  controller->NotifyMediaFullScreenState(FAKE_CONTEXT_ID, true);
    200  ASSERT_TRUE(controller->IsBeingUsedInPIPModeOrFullscreen());
    201 
    202  controller->NotifyMediaFullScreenState(FAKE_CONTEXT_ID, false);
    203  ASSERT_TRUE(!controller->IsBeingUsedInPIPModeOrFullscreen());
    204 }