tor-browser

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

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