chromium/chromecast/browser/cast_content_window.h

// Copyright 2014 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_CONTENT_WINDOW_H_
#define CHROMECAST_BROWSER_CAST_CONTENT_WINDOW_H_

#include "base/functional/callback_forward.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromecast/browser/cast_web_contents.h"
#include "chromecast/browser/gesture_router.h"
#include "chromecast/browser/mojom/cast_content_window.mojom.h"
#include "chromecast/browser/mojom/cast_web_service.mojom.h"
#include "chromecast/browser/visibility_types.h"
#include "chromecast/common/mojom/activity_window.mojom.h"
#include "chromecast/graphics/gestures/cast_gesture_handler.h"
#include "chromecast/ui/back_gesture_router.h"
#include "chromecast/ui/mojom/ui_service.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "ui/events/event.h"

namespace chromecast {

// Class that represents the "window" a WebContents is displayed in cast_shell.
// For Linux, this represents an Aura window. For Android, this is a Activity.
// See CastContentWindowAura and CastContentWindowAndroid.
class CastContentWindow : public mojom::CastContentWindow,
                          public mojom::ActivityWindow {
 public:
  // Synchronous in-process observer for CastContentWindow.
  class Observer : public base::CheckedObserver {
   public:
    virtual void OnVisibilityChange(VisibilityType visibility_type) = 0;
  };

  explicit CastContentWindow(mojom::CastWebViewParamsPtr params);
  ~CastContentWindow() override;

  // |cast_web_contents| must outlive the CastContentWindow.
  void SetCastWebContents(CastWebContents* cast_web_contents);

  // Adds an observer that receives the notifications in-process.
  void AddObserver(Observer* observer);
  // Removes an observer that would receive the notifications in-process.
  void RemoveObserver(Observer* observer);

  CastWebContents* cast_web_contents() { return cast_web_contents_; }
  GestureRouter* gesture_router() { return &gesture_router_; }

  // mojom::CastContentWindow implementation:
  void CreateWindow(mojom::ZOrder z_order,
                    VisibilityPriority visibility_priority) override = 0;
  void AddObserver(
      mojo::PendingRemote<mojom::CastContentWindowObserver> observer) override;
  void GrantScreenAccess() override = 0;
  void RevokeScreenAccess() override = 0;
  void RequestVisibility(VisibilityPriority visibility_priority) override = 0;
  void EnableTouchInput(bool enabled) override = 0;

  // mojom::ActivityWindow implementation:
  void Show() override;
  void Hide() override;

  // Notify the window that its visibility type has changed. This should only
  // ever be called by the window manager.
  // TODO(seantopping): Make this private to the window manager.
  virtual void NotifyVisibilityChange(VisibilityType visibility_type);

  // Registers this as a delegate to BackGestureRouter.
  virtual void RegisterBackGestureRouter(
      ::chromecast::BackGestureRouter* gesture_router) {}

  // Binds a receiver for remote control of CastContentWindow.
  void BindReceiver(mojo::PendingReceiver<mojom::CastContentWindow> receiver);

 protected:
  void BindActivityWindow(
      mojo::PendingReceiver<mojom::ActivityWindow> receiver);

  // Camel case due to conflict with WebContentsObserver::web_contents().
  content::WebContents* WebContents() {
    return cast_web_contents() ? cast_web_contents()->web_contents() : nullptr;
  }

  CastWebContents* cast_web_contents_ = nullptr;
  mojom::CastWebViewParamsPtr params_;

  GestureRouter gesture_router_;
  mojo::Receiver<mojom::CastContentWindow> receiver_{this};
  mojo::Receiver<mojom::ActivityWindow> activity_window_receiver_{this};
  mojo::RemoteSet<mojom::CastContentWindowObserver> observers_;
  base::ObserverList<Observer> sync_observers_;
  base::WeakPtrFactory<CastContentWindow> weak_factory_{this};
};

}  // namespace chromecast

#endif  // CHROMECAST_BROWSER_CAST_CONTENT_WINDOW_H_