MediaSession.h (4758B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_MediaSession_h 8 #define mozilla_dom_MediaSession_h 9 10 #include "js/TypeDecls.h" 11 #include "mozilla/EnumeratedArray.h" 12 #include "mozilla/TimeStamp.h" 13 #include "mozilla/dom/MediaSessionBinding.h" 14 #include "nsCycleCollectionParticipant.h" 15 #include "nsIDocumentActivity.h" 16 #include "nsWrapperCache.h" 17 18 class nsPIDOMWindowInner; 19 20 namespace mozilla { 21 class ErrorResult; 22 23 namespace dom { 24 25 class Document; 26 class MediaMetadata; 27 28 // https://w3c.github.io/mediasession/#position-state 29 struct PositionState { 30 PositionState() = default; 31 PositionState(double aDuration, double aPlaybackRate, 32 double aLastReportedTime, TimeStamp aPositionUpdatedTime) 33 : mDuration(aDuration), 34 mPlaybackRate(aPlaybackRate), 35 mLastReportedPlaybackPosition(aLastReportedTime), 36 mPositionUpdatedTime(aPositionUpdatedTime) {} 37 38 double mDuration = 0.0; 39 double mPlaybackRate = 0.0; 40 double mLastReportedPlaybackPosition = 0.0; 41 TimeStamp mPositionUpdatedTime; 42 43 // Returns the playback position in seconds (from 0 to mDuration) 44 // at the current time (aNow). 45 // https://w3c.github.io/mediasession/#current-playback-position 46 double CurrentPlaybackPosition(TimeStamp aNow = TimeStamp::Now()) const; 47 }; 48 49 class MediaSession final : public nsIDocumentActivity, public nsWrapperCache { 50 public: 51 // Ref counting and cycle collection 52 NS_DECL_CYCLE_COLLECTING_ISUPPORTS_FINAL 53 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(MediaSession) 54 NS_DECL_NSIDOCUMENTACTIVITY 55 56 explicit MediaSession(nsPIDOMWindowInner* aParent); 57 58 // WebIDL methods 59 nsPIDOMWindowInner* GetParentObject() const; 60 61 JSObject* WrapObject(JSContext* aCx, 62 JS::Handle<JSObject*> aGivenProto) override; 63 64 MediaMetadata* GetMetadata() const; 65 66 void SetMetadata(MediaMetadata* aMetadata); 67 68 void SetPlaybackState(const MediaSessionPlaybackState& aPlaybackState); 69 70 MediaSessionPlaybackState PlaybackState() const; 71 72 void SetActionHandler(MediaSessionAction aAction, 73 MediaSessionActionHandler* aHandler); 74 75 void SetPositionState(const MediaPositionState& aState, ErrorResult& aRv); 76 77 bool IsSupportedAction(MediaSessionAction aAction) const; 78 79 // Use this method to trigger media session action handler asynchronously. 80 void NotifyHandler(const MediaSessionActionDetails& aDetails); 81 82 void Shutdown(); 83 84 // `MediaStatusManager` would determine which media session is an active media 85 // session and update it from the chrome process. This active session is not 86 // 100% equal to the active media session in the spec, which is a globally 87 // active media session *among all tabs*. The active session here is *among 88 // different windows but in same tab*, so each tab can have at most one 89 // active media session. 90 bool IsActive() const; 91 92 private: 93 // When the document which media session belongs to is going to be destroyed, 94 // or is in the bfcache, then the session would be inactive. Otherwise, it's 95 // active all the time. 96 enum class SessionDocStatus : bool { 97 eInactive = false, 98 eActive = true, 99 }; 100 void SetMediaSessionDocStatus(SessionDocStatus aState); 101 102 // These methods are used to propagate media session's status to the chrome 103 // process. 104 void NotifyMediaSessionDocStatus(SessionDocStatus aState); 105 void NotifyMediaSessionAttributes(); 106 void NotifyPlaybackStateUpdated(); 107 void NotifyMetadataUpdated(); 108 void NotifyEnableSupportedAction(MediaSessionAction aAction); 109 void NotifyDisableSupportedAction(MediaSessionAction aAction); 110 void NotifyPositionStateChanged(); 111 112 void DispatchNotifyHandler(const MediaSessionActionDetails& aDetails); 113 114 MediaSessionActionHandler* GetActionHandler(MediaSessionAction aAction) const; 115 116 ~MediaSession() = default; 117 118 nsCOMPtr<nsPIDOMWindowInner> mParent; 119 120 RefPtr<MediaMetadata> mMediaMetadata; 121 122 EnumeratedArray<MediaSessionAction, RefPtr<MediaSessionActionHandler>> 123 mActionHandlers; 124 125 // This is used as is a hint for the user agent to determine whether the 126 // browsing context is playing or paused. 127 // https://w3c.github.io/mediasession/#declared-playback-state 128 MediaSessionPlaybackState mDeclaredPlaybackState = 129 MediaSessionPlaybackState::None; 130 131 Maybe<PositionState> mPositionState; 132 RefPtr<Document> mDoc; 133 SessionDocStatus mSessionDocState = SessionDocStatus::eInactive; 134 }; 135 136 } // namespace dom 137 } // namespace mozilla 138 139 #endif // mozilla_dom_MediaSession_h