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/. */
7 #ifndef mozilla_dom_MediaSession_h
8 #define mozilla_dom_MediaSession_h
10 #include "js/TypeDecls.h"
11 #include "mozilla/Attributes.h"
12 #include "mozilla/dom/MediaSessionBinding.h"
13 #include "mozilla/EnumeratedArray.h"
14 #include "mozilla/TimeStamp.h"
15 #include "nsCycleCollectionParticipant.h"
16 #include "nsIDocumentActivity.h"
17 #include "nsWrapperCache.h"
19 class nsPIDOMWindowInner
;
29 // https://w3c.github.io/mediasession/#position-state
30 struct PositionState
{
31 PositionState() = default;
32 PositionState(double aDuration
, double aPlaybackRate
,
33 double aLastReportedTime
, TimeStamp aPositionUpdatedTime
)
34 : mDuration(aDuration
),
35 mPlaybackRate(aPlaybackRate
),
36 mLastReportedPlaybackPosition(aLastReportedTime
),
37 mPositionUpdatedTime(aPositionUpdatedTime
) {}
39 double mDuration
= 0.0;
40 double mPlaybackRate
= 0.0;
41 double mLastReportedPlaybackPosition
= 0.0;
42 TimeStamp mPositionUpdatedTime
;
44 // Returns the playback position in seconds (from 0 to mDuration)
45 // at the current time (aNow).
46 // https://w3c.github.io/mediasession/#current-playback-position
47 double CurrentPlaybackPosition(TimeStamp aNow
= TimeStamp::Now()) const;
50 class MediaSession final
: public nsIDocumentActivity
, public nsWrapperCache
{
52 // Ref counting and cycle collection
53 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
54 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(MediaSession
)
55 NS_DECL_NSIDOCUMENTACTIVITY
57 explicit MediaSession(nsPIDOMWindowInner
* aParent
);
60 nsPIDOMWindowInner
* GetParentObject() const;
62 JSObject
* WrapObject(JSContext
* aCx
,
63 JS::Handle
<JSObject
*> aGivenProto
) override
;
65 MediaMetadata
* GetMetadata() const;
67 void SetMetadata(MediaMetadata
* aMetadata
);
69 void SetPlaybackState(const MediaSessionPlaybackState
& aPlaybackState
);
71 MediaSessionPlaybackState
PlaybackState() const;
73 void SetActionHandler(MediaSessionAction aAction
,
74 MediaSessionActionHandler
* aHandler
);
76 void SetPositionState(const MediaPositionState
& aState
, ErrorResult
& aRv
);
78 bool IsSupportedAction(MediaSessionAction aAction
) const;
80 // Use this method to trigger media session action handler asynchronously.
81 void NotifyHandler(const MediaSessionActionDetails
& aDetails
);
85 // `MediaStatusManager` would determine which media session is an active media
86 // session and update it from the chrome process. This active session is not
87 // 100% equal to the active media session in the spec, which is a globally
88 // active media session *among all tabs*. The active session here is *among
89 // different windows but in same tab*, so each tab can have at most one
90 // active media session.
91 bool IsActive() const;
94 // When the document which media session belongs to is going to be destroyed,
95 // or is in the bfcache, then the session would be inactive. Otherwise, it's
96 // active all the time.
97 enum class SessionDocStatus
: bool {
101 void SetMediaSessionDocStatus(SessionDocStatus aState
);
103 // These methods are used to propagate media session's status to the chrome
105 void NotifyMediaSessionDocStatus(SessionDocStatus aState
);
106 void NotifyMediaSessionAttributes();
107 void NotifyPlaybackStateUpdated();
108 void NotifyMetadataUpdated();
109 void NotifyEnableSupportedAction(MediaSessionAction aAction
);
110 void NotifyDisableSupportedAction(MediaSessionAction aAction
);
111 void NotifyPositionStateChanged();
113 void DispatchNotifyHandler(const MediaSessionActionDetails
& aDetails
);
115 MediaSessionActionHandler
* GetActionHandler(MediaSessionAction aAction
) const;
117 ~MediaSession() = default;
119 nsCOMPtr
<nsPIDOMWindowInner
> mParent
;
121 RefPtr
<MediaMetadata
> mMediaMetadata
;
123 EnumeratedArray
<MediaSessionAction
, RefPtr
<MediaSessionActionHandler
>>
126 // This is used as is a hint for the user agent to determine whether the
127 // browsing context is playing or paused.
128 // https://w3c.github.io/mediasession/#declared-playback-state
129 MediaSessionPlaybackState mDeclaredPlaybackState
=
130 MediaSessionPlaybackState::None
;
132 Maybe
<PositionState
> mPositionState
;
133 RefPtr
<Document
> mDoc
;
134 SessionDocStatus mSessionDocState
= SessionDocStatus::eInactive
;
138 } // namespace mozilla
140 #endif // mozilla_dom_MediaSession_h