| // Copyright 2016 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CHROMECAST_BROWSER_CAST_MEDIA_BLOCKER_H_ | 
 | #define CHROMECAST_BROWSER_CAST_MEDIA_BLOCKER_H_ | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "components/media_control/browser/media_blocker.h" | 
 | #include "mojo/public/cpp/bindings/receiver.h" | 
 | #include "services/media_session/public/mojom/media_session.mojom.h" | 
 |  | 
 | namespace content { | 
 | class MediaSession; | 
 | }  // namespace content | 
 |  | 
 | namespace chromecast { | 
 |  | 
 | namespace shell { | 
 | class CastMediaBlockerTest; | 
 | }  // namespace shell | 
 |  | 
 | // This class implements a blocking mode for web applications and is used in | 
 | // Chromecast internal code. Media is unblocked by default. | 
 | class CastMediaBlocker : public media_control::MediaBlocker, | 
 |                          public media_session::mojom::MediaSessionObserver { | 
 |  public: | 
 |   // Observes WebContents and the associated MediaSession. | 
 |   explicit CastMediaBlocker(content::WebContents* web_contents); | 
 |  | 
 |   ~CastMediaBlocker() override; | 
 |  | 
 |   CastMediaBlocker(const CastMediaBlocker&) = delete; | 
 |   CastMediaBlocker& operator=(const CastMediaBlocker&) = delete; | 
 |  | 
 |   // Called when there's a change in whether or not web contents is allowed to | 
 |   // load and play media. | 
 |   // If media is unblocked, previously suspended elements should begin playing | 
 |   // again. Media is unblocked when both MediaLoading and MediaStarting blocks | 
 |   // are off. | 
 |   void OnBlockMediaLoadingChanged() override; | 
 |   // Sets if the web contents is allowed to play media or not. If media is | 
 |   // unblocked, previously suspended elements should begin playing again.  Media | 
 |   // is unblocked when both MediaLoading and MediaStarting blocks are off. | 
 |   // This is a more relaxed block than BlockMediaLoading since the block doesn't | 
 |   // block media from loading but it does block media from starting. | 
 |   void BlockMediaStarting(bool blocked); | 
 |   void EnableBackgroundVideoPlayback(bool enabled); | 
 |  | 
 |   // media_session::mojom::MediaSessionObserver implementation: | 
 |   void MediaSessionInfoChanged( | 
 |       media_session::mojom::MediaSessionInfoPtr session_info) override; | 
 |   void MediaSessionMetadataChanged( | 
 |       const absl::optional<media_session::MediaMetadata>& metadata) override {} | 
 |   void MediaSessionActionsChanged( | 
 |       const std::vector<media_session::mojom::MediaSessionAction>& action) | 
 |       override {} | 
 |   void MediaSessionImagesChanged( | 
 |       const base::flat_map<media_session::mojom::MediaSessionImageType, | 
 |                            std::vector<media_session::MediaImage>>& images) | 
 |       override {} | 
 |   void MediaSessionPositionChanged( | 
 |       const absl::optional<media_session::MediaPosition>& position) override {} | 
 |  | 
 |  private: | 
 |   friend shell::CastMediaBlockerTest; | 
 |   // components::media_control::MediaBlocker implementation: | 
 |   void OnRenderFrameCreated( | 
 |       content::RenderFrameHost* render_frame_host) override; | 
 |  | 
 |   // Suspends or resumes the media session for the web contents. | 
 |   void Suspend(); | 
 |   void Resume(); | 
 |  | 
 |   void UpdatePlayingState(); | 
 |  | 
 |   void UpdateBackgroundVideoPlaybackState(); | 
 |   void UpdateRenderFrameBackgroundVideoPlaybackState( | 
 |       content::RenderFrameHost* frame); | 
 |  | 
 |   bool PlayingBlocked() const; | 
 |  | 
 |   // MediaSession when initialized from WebContesnts is always a | 
 |   // MediaSessionImpl type. This method allows to replace the MediaSession with | 
 |   // mockable MediaSessions for testing. | 
 |   void SetMediaSessionForTesting(content::MediaSession* media_session); | 
 |  | 
 |   // Whether or not media starting should be blocked. This value caches the last | 
 |   // call to BlockMediaStarting. | 
 |   bool media_starting_blocked_ = false; | 
 |  | 
 |   // Whether or not the user paused media on the page. | 
 |   bool paused_by_user_ = true; | 
 |  | 
 |   // Whether or not media in the app can be controlled and if media is currently | 
 |   // suspended. These variables cache arguments from MediaSessionInfoChanged(). | 
 |   bool suspended_ = true; | 
 |   bool controllable_ = false; | 
 |  | 
 |   // Setting for whether or not the WebContents should suspend video when the | 
 |   // content is put into the background. For most content, this setting should | 
 |   // be disabled. | 
 |   bool background_video_playback_enabled_ = false; | 
 |  | 
 |   content::MediaSession* media_session_; | 
 |  | 
 |   mojo::Receiver<media_session::mojom::MediaSessionObserver> observer_receiver_{ | 
 |       this}; | 
 | }; | 
 |  | 
 | }  // namespace chromecast | 
 |  | 
 | #endif  // CHROMECAST_BROWSER_CAST_MEDIA_BLOCKER_H_ |