blob: fc2b0c32a2ccdb989b7bf438c2f1adbdeeecf4d8 [file] [log] [blame]
// Copyright 2017 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.
#include <cstdint>
#include <string>
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chromecast/browser/cast_content_window.h"
#include "chromecast/browser/cast_web_contents.h"
#include "chromecast/graphics/cast_window_manager.h"
#include "content/public/browser/bluetooth_chooser.h"
#include "content/public/browser/web_contents.h"
#include "url/gurl.h"
namespace chromecast {
class CastWindowManager;
using shell::VisibilityPriority;
// A simplified interface for loading and displaying WebContents in cast_shell.
class CastWebView {
class Delegate : public CastWebContents::Delegate,
public shell::CastContentWindow::Delegate {
// Called when there is console log output from web_contents.
// Returning true indicates that the delegate handled the message.
// If false is returned the default logging mechanism will be used.
virtual bool OnAddMessageToConsoleReceived(
content::WebContents* source,
int32_t level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) = 0;
// Invoked by CastWebView when WebContentsDelegate::RunBluetoothChooser is
// called. Returns a BluetoothChooser, a class used to solicit bluetooth
// device selection from the user for WebBluetooth applications. If a
// delegate does not provide an implementation, WebBluetooth will not be
// supported for that CastWebView.
virtual std::unique_ptr<content::BluetoothChooser> RunBluetoothChooser(
content::RenderFrameHost* frame,
const content::BluetoothChooser::EventHandler& event_handler);
// Observer interface for tracking CastWebView lifetime.
class Observer {
// Notifies that |web_view| is being destroyed. |web_view| should be assumed
// invalid after this method returns.
virtual void OnPageDestroyed(CastWebView* web_view) {}
virtual ~Observer() {}
// The parameters used to create a CastWebView instance. Passed to
// CastWebContentsManager::CreateWebView().
struct CreateParams {
// The delegate for the CastWebView. Must be non-null.
Delegate* delegate = nullptr;
// Parameters for creating the content window for this CastWebView.
shell::CastContentWindow::CreateParams window_params;
// Identifies the activity that is hosted by this CastWebView.
std::string activity_id = "";
// Whether this CastWebView has a transparent background.
bool transparent = false;
// Whether this CastWebView is granted media access.
bool allow_media_access = false;
// Enable development mode for this CastWebView. Whitelists certain
// functionality for the WebContents, like remote debugging and debugging
// interfaces.
bool enabled_for_dev = false;
// Enable/Force 720p resolution for this CastWebView instance.
bool force_720p_resolution = false;
// Whether this CastWebView should be managed by web ui window manager.
bool managed = true;
virtual ~CastWebView();
virtual shell::CastContentWindow* window() const = 0;
virtual content::WebContents* web_contents() const = 0;
// Navigates to |url|. The loaded page will be preloaded if MakeVisible has
// not been called on the object.
virtual void LoadUrl(GURL url) = 0;
// Begins the close process for this page (ie. triggering document.onunload).
// A consumer of the class can be notified when the process has been finished
// via Delegate::OnPageStopped(). The page will be torn down after
// |shutdown_delay| has elapsed, or sooner if required.
virtual void ClosePage(const base::TimeDelta& shutdown_delay) = 0;
// Adds the page to the window manager and makes it visible to the user if
// |is_visible| is true. |z_order| determines how this window is layered in
// relationt other windows (higher value == more foreground).
virtual void InitializeWindow(CastWindowManager* window_manager,
CastWindowManager::WindowId z_order,
VisibilityPriority initial_priority) = 0;
// Sets the activity context exposed to web view and content window. The exact
// format of context is defined by each activity.
virtual void SetContext(base::Value context) = 0;
// Allows the page to be shown on the screen. The page cannot be shown on the
// screen until this is called.
virtual void GrantScreenAccess() = 0;
// Prevents the page from being shown on the screen until GrantScreenAccess()
// is called.
virtual void RevokeScreenAccess() = 0;
// Observer interface:
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
base::ObserverList<Observer>::Unchecked observer_list_;
} // namespace chromecast