Bug 1633010 - part6 : use `IMediaController` if we only want to access control related methods r=chunmin

This patch will do :
- create an interface `IMediaController` including only control related methods

The advantage of doing so :
- It's clear to use `IMediaController` as the only surface to control media
- explictly restrict which functions are available which can avoid using control related functions on those situations

Differential Revision: https://phabricator.services.mozilla.com/D73490
This commit is contained in:
alwu 2020-05-13 22:08:01 +00:00
Родитель af00afa1f0
Коммит 2ae724e750
6 изменённых файлов: 54 добавлений и 24 удалений

Просмотреть файл

@ -4,6 +4,7 @@
#include "AudioFocusManager.h"
#include "MediaController.h"
#include "MediaControlUtils.h"
#include "MediaControlService.h"
#include "mozilla/dom/CanonicalBrowsingContext.h"
@ -18,7 +19,7 @@
namespace mozilla {
namespace dom {
void AudioFocusManager::RequestAudioFocus(MediaController* aController) {
void AudioFocusManager::RequestAudioFocus(IMediaController* aController) {
MOZ_ASSERT(aController);
if (mOwningFocusControllers.Contains(aController)) {
return;
@ -28,7 +29,7 @@ void AudioFocusManager::RequestAudioFocus(MediaController* aController) {
mOwningFocusControllers.AppendElement(aController);
}
void AudioFocusManager::RevokeAudioFocus(MediaController* aController) {
void AudioFocusManager::RevokeAudioFocus(IMediaController* aController) {
MOZ_ASSERT(aController);
if (!mOwningFocusControllers.Contains(aController)) {
return;

Просмотреть файл

@ -11,7 +11,7 @@
namespace mozilla {
namespace dom {
class MediaController;
class IMediaController;
class MediaControlService;
/**
@ -25,8 +25,8 @@ class MediaControlService;
*/
class AudioFocusManager {
public:
void RequestAudioFocus(MediaController* aController);
void RevokeAudioFocus(MediaController* aController);
void RequestAudioFocus(IMediaController* aController);
void RevokeAudioFocus(IMediaController* aController);
explicit AudioFocusManager() = default;
~AudioFocusManager() = default;
@ -37,7 +37,7 @@ class AudioFocusManager {
friend class MediaControlService;
void ClearFocusControllersIfNeeded();
nsTArray<RefPtr<MediaController>> mOwningFocusControllers;
nsTArray<RefPtr<IMediaController>> mOwningFocusControllers;
};
} // namespace dom

Просмотреть файл

@ -32,7 +32,7 @@ void MediaControlKeysHandler::OnKeyPressed(MediaControlKeysEvent aKeyEvent) {
RefPtr<MediaControlService> service = MediaControlService::GetService();
MOZ_ASSERT(service);
RefPtr<MediaController> controller = service->GetMainController();
RefPtr<IMediaController> controller = service->GetMainController();
if (!controller) {
return;
}
@ -48,7 +48,7 @@ void MediaControlKeysHandler::OnKeyPressed(MediaControlKeysEvent aKeyEvent) {
controller->Pause();
return;
case MediaControlKeysEvent::ePlayPause: {
if (controller->GetState() == MediaSessionPlaybackState::Playing) {
if (controller->IsPlaying()) {
controller->Pause();
} else {
controller->Play();

Просмотреть файл

@ -84,6 +84,12 @@ void MediaController::Stop() {
MediaControlKeysEvent::eStop);
}
uint64_t MediaController::Id() const { return mTopLevelBCId; }
bool MediaController::IsAudible() const { return IsMediaAudible(); }
bool MediaController::IsPlaying() const { return IsMediaPlaying(); }
void MediaController::UpdateMediaControlKeysEventToContentMediaIfNeeded(
MediaControlKeysEvent aEvent) {
// There is no controlled media existing or controller has been shutdown, we
@ -98,7 +104,7 @@ void MediaController::UpdateMediaControlKeysEventToContentMediaIfNeeded(
RefPtr<BrowsingContext> context =
mActiveMediaSessionContextId
? BrowsingContext::Get(*mActiveMediaSessionContextId)
: BrowsingContext::Get(mTopLevelBCId);
: BrowsingContext::Get(Id());
if (context && !context->IsDiscarded()) {
context->Canonical()->UpdateMediaControlKeysEvent(aEvent);
}
@ -216,7 +222,5 @@ bool MediaController::IsInPictureInPictureMode() const {
return mIsInPictureInPictureMode;
}
bool MediaController::IsAudible() const { return IsMediaAudible(); }
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -21,6 +21,30 @@ namespace dom {
class BrowsingContext;
enum class MediaControlKeysEvent : uint32_t;
/**
* IMediaController is an interface which includes control related methods and
* methods used to know its playback state.
*/
class IMediaController {
public:
NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
// Focus the window currently playing media.
virtual void Focus() = 0;
virtual void Play() = 0;
virtual void Pause() = 0;
virtual void Stop() = 0;
virtual void PrevTrack() = 0;
virtual void NextTrack() = 0;
virtual void SeekBackward() = 0;
virtual void SeekForward() = 0;
// Return the ID of the top level browsing context within a tab.
virtual uint64_t Id() const = 0;
virtual bool IsAudible() const = 0;
virtual bool IsPlaying() const = 0;
};
/**
* MediaController is a class, which is used to control all media within a tab.
* It can only be used in Chrome process and the controlled media are usually
@ -46,22 +70,26 @@ enum class MediaControlKeysEvent : uint32_t;
* controller from `MediaControlService`.
*/
class MediaController final
: public MediaSessionController,
: public IMediaController,
public MediaSessionController,
public LinkedListElement<RefPtr<MediaController>> {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaController, override);
explicit MediaController(uint64_t aContextId);
// Focus the window currently playing media.
void Focus();
void Play();
void Pause();
void Stop();
void PrevTrack();
void NextTrack();
void SeekBackward();
void SeekForward();
// IMediaController's methods
void Focus() override;
void Play() override;
void Pause() override;
void Stop() override;
void PrevTrack() override;
void NextTrack() override;
void SeekBackward() override;
void SeekForward() override;
uint64_t Id() const override;
bool IsAudible() const override;
bool IsPlaying() const override;
// IMediaInfoUpdater's methods
void NotifyMediaPlaybackChanged(uint64_t aBrowsingContextId,
@ -78,8 +106,6 @@ class MediaController final
// then calling any its method won't take any effect.
void Shutdown();
bool IsAudible() const;
private:
~MediaController();

Просмотреть файл

@ -111,7 +111,6 @@ class MediaSessionController : public IMediaInfoUpdater {
// it has already set its metadata. Otherwise, return default media metadata
// which is based on website's title and favicon.
MediaMetadataBase GetCurrentMediaMetadata() const;
uint64_t Id() const { return mTopLevelBCId; }
bool IsMediaAudible() const;
bool IsMediaPlaying() const;