Backed out changeset 06f41c22f3a6 (bug 1888460) for causing linux xpcshell failures...
[gecko.git] / dom / media / mediasession / MediaSession.h
blob6784fb531f940edfe60552787707dfc596e0f86f
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;
21 namespace mozilla {
22 class ErrorResult;
24 namespace dom {
26 class Document;
27 class MediaMetadata;
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 {
51 public:
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);
59 // WebIDL methods
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);
83 void Shutdown();
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;
93 private:
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 {
98 eInactive = false,
99 eActive = true,
101 void SetMediaSessionDocStatus(SessionDocStatus aState);
103 // These methods are used to propagate media session's status to the chrome
104 // process.
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>>
124 mActionHandlers;
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;
137 } // namespace dom
138 } // namespace mozilla
140 #endif // mozilla_dom_MediaSession_h