text: // Copyright 2020 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef COMPONENTS_MEDIA_CONTROL_BROWSER_MEDIA_BLOCKER_H_
  #define COMPONENTS_MEDIA_CONTROL_BROWSER_MEDIA_BLOCKER_H_
  
  #include "base/macros.h"
  #include "content/public/browser/web_contents_observer.h"
  
  namespace media_control {
  
  // This class implements a blocking mode for web applications. Media is
  // unblocked by default.
  // This is currently used in Chromecast internal code.
  // TODO(crbug.com/1057860): Add comment about Fuchsia with implementation.
  class MediaBlocker : public content::WebContentsObserver {
   public:
    // Observes WebContents.
    explicit MediaBlocker(content::WebContents* web_contents);
  
    ~MediaBlocker() override;
  
    MediaBlocker(const MediaBlocker&) = delete;
    MediaBlocker& operator=(const MediaBlocker&) = delete;
  
    // Sets if the web contents is allowed to load and play media or not.
    // If media is unblocked, previously suspended elements should begin playing
    // again.
    void BlockMediaLoading(bool blocked);
  
    bool media_loading_blocked() const { return media_loading_blocked_; }
  
   private:
    // content::WebContentsObserver implementation:
    void RenderFrameCreated(content::RenderFrameHost* render_frame_host) final;
    void RenderViewReady() final;
  
    // Blocks or unblocks the render process from loading new media
    // according to |media_loading_blocked_|.
    void UpdateMediaLoadingBlockedState();
    void UpdateRenderFrameMediaLoadingBlockedState(
        content::RenderFrameHost* render_frame_host);
  
    // Subclasses can override this function if additional handling for
    // BlockMediaLoading is needed when the blocked state changes.
    virtual void OnBlockMediaLoadingChanged() {}
  
    // Subclasses can override this function if additional handling for
    // RenderFrameCreated is needed.
    virtual void OnRenderFrameCreated(
        content::RenderFrameHost* render_frame_host) {}
  
    // Whether or not media loading should be blocked. This value cache's the last
    // call to BlockMediaLoading. Is false by default.
    bool media_loading_blocked_ = false;
  };
  
  }  // namespace media_control
  
  #endif  // COMPONENTS_MEDIA_CONTROL_BROWSER_MEDIA_BLOCKER_H_
  