diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index 62676a44db65d8..7e0c34e4fda3b5 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn @@ -99,8 +99,6 @@ cast_source_set("browser") { "cast_web_contents_impl.h", "cast_web_service.cc", "cast_web_service.h", - "cast_web_view_base.cc", - "cast_web_view_base.h", "cast_web_view_default.cc", "cast_web_view_default.h", "cast_web_view_factory.cc", diff --git a/chromecast/browser/cast_content_window_aura.cc b/chromecast/browser/cast_content_window_aura.cc index f0da6a28d0d21b..068cae6435c536 100644 --- a/chromecast/browser/cast_content_window_aura.cc +++ b/chromecast/browser/cast_content_window_aura.cc @@ -79,8 +79,7 @@ CastContentWindowAura::CastContentWindowAura( gesture_priority_(params.gesture_priority), is_touch_enabled_(params.enable_touch_input), window_(nullptr), - has_screen_access_(false), - resize_window_when_navigation_starts_(true) {} + has_screen_access_(false) {} CastContentWindowAura::~CastContentWindowAura() { CastWebContents::Observer::Observe(nullptr); @@ -100,7 +99,6 @@ void CastContentWindowAura::CreateWindowForWebContents( DCHECK(window_manager_) << "A CastWindowManager must be provided before " << "creating a window for WebContents."; CastWebContents::Observer::Observe(cast_web_contents); - content::WebContentsObserver::Observe(cast_web_contents->web_contents()); window_ = cast_web_contents->web_contents()->GetNativeView(); if (!window_->HasObserver(this)) { window_->AddObserver(this); @@ -133,7 +131,6 @@ void CastContentWindowAura::GrantScreenAccess() { void CastContentWindowAura::RevokeScreenAccess() { has_screen_access_ = false; - resize_window_when_navigation_starts_ = false; if (window_) { window_->Hide(); // Because rendering a larger window may require more system resources, @@ -191,23 +188,4 @@ void CastContentWindowAura::OnWindowDestroyed(aura::Window* window) { window_ = nullptr; } -void CastContentWindowAura::DidStartNavigation( - content::NavigationHandle* navigation_handle) { - if (!resize_window_when_navigation_starts_) { - return; - } - resize_window_when_navigation_starts_ = false; - - // Resize window - gfx::Size display_size = - display::Screen::GetScreen()->GetPrimaryDisplay().size(); - aura::Window* content_window = web_contents()->GetNativeView(); - content_window->SetBounds( - gfx::Rect(display_size.width(), display_size.height())); -} - -void CastContentWindowAura::WebContentsDestroyed() { - content::WebContentsObserver::Observe(nullptr); -} - } // namespace chromecast diff --git a/chromecast/browser/cast_content_window_aura.h b/chromecast/browser/cast_content_window_aura.h index 6379810a057333..bff975c2d02511 100644 --- a/chromecast/browser/cast_content_window_aura.h +++ b/chromecast/browser/cast_content_window_aura.h @@ -9,8 +9,6 @@ #include "chromecast/browser/cast_content_gesture_handler.h" #include "chromecast/browser/cast_content_window.h" #include "chromecast/ui/media_control_ui.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_observer.h" #include "ui/aura/window_observer.h" namespace aura { @@ -23,7 +21,6 @@ class TouchBlocker; class CastContentWindowAura : public CastContentWindow, public CastWebContents::Observer, - private content::WebContentsObserver, public aura::WindowObserver { public: CastContentWindowAura(const CastContentWindow::CreateParams& params, @@ -53,11 +50,6 @@ class CastContentWindowAura : public CastContentWindow, void OnWindowDestroyed(aura::Window* window) override; private: - // WebContentsObserver implementation: - void DidStartNavigation( - content::NavigationHandle* navigation_handle) override; - void WebContentsDestroyed() override; - CastWindowManager* const window_manager_; // Utility class for detecting and dispatching gestures to delegates. @@ -71,7 +63,6 @@ class CastContentWindowAura : public CastContentWindow, aura::Window* window_; bool has_screen_access_; - bool resize_window_when_navigation_starts_; DISALLOW_COPY_AND_ASSIGN(CastContentWindowAura); }; diff --git a/chromecast/browser/cast_web_contents.h b/chromecast/browser/cast_web_contents.h index a4df057ab568b6..11559a1d6144ca 100644 --- a/chromecast/browser/cast_web_contents.h +++ b/chromecast/browser/cast_web_contents.h @@ -295,18 +295,6 @@ class CastWebContents { // page. virtual void Stop(int error_code) = 0; - // =========================================================================== - // Visibility - // =========================================================================== - - // Specify if the WebContents should be treated as visible. This triggers a - // document "visibilitychange" change event, and will paint the WebContents - // quad if |visible| is true (otherwise it will be blank). Note that this does - // *not* guarantee the page is visible on the screen, as that depends on if - // the WebContents quad is present in the screen layout and isn't obscured by - // another window. - virtual void SetWebVisibilityAndPaint(bool visible) = 0; - // =========================================================================== // Media Management // =========================================================================== diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index 874be2e13cb465..7dd83daccec7b9 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc @@ -290,21 +290,6 @@ void CastWebContentsImpl::Stop(int error_code) { NotifyPageState(); } -void CastWebContentsImpl::SetWebVisibilityAndPaint(bool visible) { - if (!web_contents_) - return; - if (visible) { - web_contents_->WasShown(); - } else { - web_contents_->WasHidden(); - } - if (web_contents_->GetVisibility() != content::Visibility::VISIBLE) { - // Since we are managing the visibility, we need to ensure pages are - // unfrozen in the event this occurred while in the background. - web_contents_->SetPageFrozen(false); - } -} - void CastWebContentsImpl::BlockMediaLoading(bool blocked) { if (media_blocker_) media_blocker_->BlockMediaLoading(blocked); diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h index accde3b2232f8e..165dabfe86fc18 100644 --- a/chromecast/browser/cast_web_contents_impl.h +++ b/chromecast/browser/cast_web_contents_impl.h @@ -59,7 +59,6 @@ class CastWebContentsImpl : public CastWebContents, void LoadUrl(const GURL& url) override; void ClosePage() override; void Stop(int error_code) override; - void SetWebVisibilityAndPaint(bool visible) override; void RegisterInterfaceProvider( const InterfaceSet& interface_set, service_manager::InterfaceProvider* interface_provider) override; diff --git a/chromecast/browser/cast_web_service.cc b/chromecast/browser/cast_web_service.cc index 5ed2454e44cfa6..882598707adb8b 100644 --- a/chromecast/browser/cast_web_service.cc +++ b/chromecast/browser/cast_web_service.cc @@ -17,11 +17,11 @@ #include "base/time/time.h" #include "chromecast/browser/cast_web_view_default.h" #include "chromecast/browser/cast_web_view_factory.h" -#include "chromecast/browser/lru_renderer_cache.h" #include "chromecast/chromecast_buildflags.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/gpu_utils.h" #include "content/public/browser/media_session.h" +#include "content/public/browser/site_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "services/network/public/mojom/cookie_manager.mojom.h" @@ -46,8 +46,6 @@ CastWebService::CastWebService(content::BrowserContext* browser_context, : browser_context_(browser_context), web_view_factory_(web_view_factory), window_manager_(window_manager), - overlay_renderer_cache_( - std::make_unique(browser_context_, 1)), task_runner_(base::SequencedTaskRunnerHandle::Get()), weak_factory_(this) { DCHECK(browser_context_); @@ -60,9 +58,26 @@ CastWebService::~CastWebService() = default; CastWebView::Scoped CastWebService::CreateWebView( const CastWebView::CreateParams& params, + scoped_refptr site_instance, const GURL& initial_url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - auto web_view = web_view_factory_->CreateWebView(params, this, initial_url); + auto web_view = web_view_factory_->CreateWebView( + params, this, std::move(site_instance), initial_url); + CastWebView::Scoped scoped(web_view.get(), [this](CastWebView* web_view) { + OwnerDestroyed(web_view); + }); + web_views_.insert(std::move(web_view)); + return scoped; +} + +CastWebView::Scoped CastWebService::CreateWebView( + const CastWebView::CreateParams& params, + const GURL& initial_url) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto web_view = web_view_factory_->CreateWebView( + params, this, + content::SiteInstance::CreateForURL(browser_context_, initial_url), + initial_url); CastWebView::Scoped scoped(web_view.get(), [this](CastWebView* web_view) { OwnerDestroyed(web_view); }); diff --git a/chromecast/browser/cast_web_service.h b/chromecast/browser/cast_web_service.h index dea0c11f55a762..fb6328a67a00f8 100644 --- a/chromecast/browser/cast_web_service.h +++ b/chromecast/browser/cast_web_service.h @@ -28,7 +28,6 @@ namespace chromecast { class CastWebViewFactory; class CastWindowManager; -class LRURendererCache; // This class dispenses CastWebView objects which are used to wrap WebContents // in cast_shell. This class temporarily takes ownership of CastWebViews when @@ -42,17 +41,17 @@ class CastWebService { CastWindowManager* window_manager); ~CastWebService(); + CastWebView::Scoped CreateWebView( + const CastWebView::CreateParams& params, + scoped_refptr site_instance, + const GURL& initial_url); + CastWebView::Scoped CreateWebView(const CastWebView::CreateParams& params, const GURL& initial_url); std::unique_ptr CreateWindow( const CastContentWindow::CreateParams& params); - content::BrowserContext* browser_context() { return browser_context_; } - LRURendererCache* overlay_renderer_cache() { - return overlay_renderer_cache_.get(); - } - void FlushDomLocalStorage(); // |callback| is called when data deletion is done or at least the deletion @@ -69,8 +68,6 @@ class CastWebService { CastWindowManager* const window_manager_; base::flat_set> web_views_; - const std::unique_ptr overlay_renderer_cache_; - const scoped_refptr task_runner_; base::WeakPtr weak_ptr_; diff --git a/chromecast/browser/cast_web_view.cc b/chromecast/browser/cast_web_view.cc index f6775bb1a43804..5f6e9d4d97811c 100644 --- a/chromecast/browser/cast_web_view.cc +++ b/chromecast/browser/cast_web_view.cc @@ -13,10 +13,31 @@ CastWebView::Delegate::RunBluetoothChooser( return nullptr; } -CastWebView::CreateParams::CreateParams() = default; +CastWebView::CastWebView(const CreateParams& create_params) + : delegate_(create_params.delegate), + shutdown_delay_(create_params.shutdown_delay) {} -CastWebView::CreateParams::CreateParams(const CreateParams& other) = default; +CastWebView::~CastWebView() { + for (Observer& observer : observer_list_) { + observer.OnPageDestroyed(this); + } +} +void CastWebView::ForceClose() { + shutdown_delay_ = base::TimeDelta(); + ClosePage(); +} + +void CastWebView::AddObserver(CastWebView::Observer* observer) { + observer_list_.AddObserver(observer); +} + +void CastWebView::RemoveObserver(CastWebView::Observer* observer) { + observer_list_.RemoveObserver(observer); +} + +CastWebView::CreateParams::CreateParams() = default; +CastWebView::CreateParams::CreateParams(const CreateParams& other) = default; CastWebView::CreateParams::~CreateParams() = default; } // namespace chromecast diff --git a/chromecast/browser/cast_web_view.h b/chromecast/browser/cast_web_view.h index 2c83c2ded6f336..6ca15a35fb4e83 100644 --- a/chromecast/browser/cast_web_view.h +++ b/chromecast/browser/cast_web_view.h @@ -9,8 +9,10 @@ #include #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/ui/mojom/ui_service.mojom.h" @@ -20,8 +22,6 @@ namespace chromecast { -class CastWebService; - // A simplified interface for loading and displaying WebContents in cast_shell. class CastWebView { public: @@ -55,14 +55,6 @@ class CastWebView { using Scoped = std::unique_ptr>; - enum class RendererPool { - // Don't use a renderer pool for prelaunching. This means launching the - // render process eagerly is un-restricted and will always succeed. - NONE, - // Pool for overlay apps, which allows up to one pre-cached site. - OVERLAY, - }; - // The parameters used to create a CastWebView instance. Passed to // CastWebService::CreateWebView(). struct CreateParams { @@ -79,8 +71,6 @@ class CastWebView { // Parameters for creating the content window for this CastWebView. CastContentWindow::CreateParams window_params; - CastWebService* web_service = nullptr; - // Identifies the activity that is hosted by this CastWebView. std::string activity_id = ""; @@ -105,19 +95,13 @@ class CastWebView { // immediately and synchronously. base::TimeDelta shutdown_delay = base::TimeDelta(); - // Pool for pre-launched renderers. - RendererPool renderer_pool = RendererPool::NONE; - - // Eagerly pre-launches a render process for |prelaunch_url| if it is valid. - GURL prelaunch_url; - CreateParams(); CreateParams(const CreateParams& other); ~CreateParams(); }; - CastWebView() = default; - virtual ~CastWebView() = default; + explicit CastWebView(const CreateParams& create_params); + virtual ~CastWebView(); virtual CastContentWindow* window() const = 0; @@ -125,10 +109,21 @@ class CastWebView { virtual CastWebContents* cast_web_contents() = 0; - virtual base::TimeDelta shutdown_delay() const = 0; + base::TimeDelta shutdown_delay() const { return shutdown_delay_; } + + // 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 + // |CreateParams::shutdown_delay| has elapsed, or immediately if the browser + // is shutting down. + virtual void ClosePage() = 0; // Closes the page immediately, ignoring |CreateParams::shutdown_delay|. - virtual void ForceClose() = 0; + void ForceClose(); // 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 @@ -136,11 +131,26 @@ class CastWebView { virtual void InitializeWindow(mojom::ZOrder z_order, VisibilityPriority initial_priority) = 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: - virtual void AddObserver(Observer* observer) = 0; - virtual void RemoveObserver(Observer* observer) = 0; + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + protected: + base::WeakPtr delegate_; private: + base::TimeDelta shutdown_delay_; + + base::ObserverList::Unchecked observer_list_; + DISALLOW_COPY_AND_ASSIGN(CastWebView); }; diff --git a/chromecast/browser/cast_web_view_base.cc b/chromecast/browser/cast_web_view_base.cc deleted file mode 100644 index db4ca23e5245bd..00000000000000 --- a/chromecast/browser/cast_web_view_base.cc +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2019 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 "chromecast/browser/cast_web_view_base.h" - -#include "chromecast/browser/cast_web_service.h" -#include "chromecast/browser/lru_renderer_cache.h" -#include "chromecast/browser/renderer_prelauncher.h" -#include "content/public/browser/site_instance.h" - -namespace chromecast { - -CastWebViewBase::CastWebViewBase(const CreateParams& create_params, - CastWebService* web_service) - : delegate_(create_params.delegate), - web_service_(web_service), - shutdown_delay_(create_params.shutdown_delay), - renderer_pool_(create_params.renderer_pool), - prelaunch_url_(create_params.prelaunch_url), - renderer_prelauncher_(nullptr), - site_instance_(nullptr) { - DCHECK(web_service_); - if (prelaunch_url_.is_valid()) { - if (renderer_pool_ == RendererPool::OVERLAY) { - renderer_prelauncher_ = - web_service_->overlay_renderer_cache()->TakeRendererPrelauncher( - prelaunch_url_); - } else { - renderer_prelauncher_ = std::make_unique( - web_service_->browser_context(), prelaunch_url_); - } - } - if (renderer_prelauncher_) { - renderer_prelauncher_->Prelaunch(); - site_instance_ = renderer_prelauncher_->site_instance(); - } -} - -CastWebViewBase::~CastWebViewBase() { - if (renderer_prelauncher_ && prelaunch_url_.is_valid() && - renderer_pool_ == RendererPool::OVERLAY) { - web_service_->overlay_renderer_cache()->ReleaseRendererPrelauncher( - prelaunch_url_); - } - for (Observer& observer : observer_list_) { - observer.OnPageDestroyed(this); - } -} - -void CastWebViewBase::ForceClose() { - shutdown_delay_ = base::TimeDelta(); - cast_web_contents()->ClosePage(); -} - -void CastWebViewBase::AddObserver(CastWebViewBase::Observer* observer) { - observer_list_.AddObserver(observer); -} - -void CastWebViewBase::RemoveObserver(CastWebViewBase::Observer* observer) { - observer_list_.RemoveObserver(observer); -} - -base::TimeDelta CastWebViewBase::shutdown_delay() const { - return shutdown_delay_; -} - -} // namespace chromecast diff --git a/chromecast/browser/cast_web_view_base.h b/chromecast/browser/cast_web_view_base.h deleted file mode 100644 index 9da7e7140584af..00000000000000 --- a/chromecast/browser/cast_web_view_base.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2019 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 CHROMECAST_BROWSER_CAST_WEB_VIEW_BASE_H_ -#define CHROMECAST_BROWSER_CAST_WEB_VIEW_BASE_H_ - -#include -#include - -#include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list.h" -#include "base/time/time.h" -#include "chromecast/browser/cast_web_view.h" -#include "url/gurl.h" - -namespace content { -class SiteInstance; -} // namespace content - -namespace chromecast { - -class CastWebService; -class RendererPrelauncher; - -// Common logic for CastWebView implementations. -class CastWebViewBase : public CastWebView { - public: - CastWebViewBase(const CreateParams& create_params, - CastWebService* web_service); - CastWebViewBase(const CastWebViewBase&) = delete; - CastWebViewBase& operator=(const CastWebViewBase&) = delete; - ~CastWebViewBase() override; - - scoped_refptr site_instance() const { - return site_instance_; - } - - // CastWebView implementation (partial): - void ForceClose() override; - void AddObserver(Observer* observer) override; - void RemoveObserver(Observer* observer) override; - base::TimeDelta shutdown_delay() const override; - - protected: - base::WeakPtr delegate_; - CastWebService* const web_service_; - - private: - base::TimeDelta shutdown_delay_; - const RendererPool renderer_pool_; - const GURL prelaunch_url_; - - std::unique_ptr renderer_prelauncher_; - scoped_refptr site_instance_; - - base::ObserverList::Unchecked observer_list_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BROWSER_CAST_WEB_VIEW_BASE_H_ diff --git a/chromecast/browser/cast_web_view_default.cc b/chromecast/browser/cast_web_view_default.cc index d4f0ad13b5d48b..b24749c2b10a9b 100644 --- a/chromecast/browser/cast_web_view_default.cc +++ b/chromecast/browser/cast_web_view_default.cc @@ -19,6 +19,7 @@ #include "chromecast/chromecast_buildflags.h" #include "content/public/browser/media_capture_devices.h" #include "content/public/browser/media_session.h" +#include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" @@ -53,23 +54,27 @@ CastWebViewDefault::CastWebViewDefault( const CreateParams& params, CastWebService* web_service, content::BrowserContext* browser_context, + scoped_refptr site_instance, std::unique_ptr cast_content_window) - : CastWebViewBase(params, web_service), + : CastWebView(params), web_service_(web_service), browser_context_(browser_context), + site_instance_(std::move(site_instance)), activity_id_(params.activity_id), session_id_(params.window_params.session_id), sdk_version_(params.sdk_version), allow_media_access_(params.allow_media_access), log_prefix_(params.log_prefix), - web_contents_(CreateWebContents(browser_context_, site_instance())), + web_contents_(CreateWebContents(browser_context_, site_instance_)), cast_web_contents_(web_contents_.get(), params.web_contents_params), window_(cast_content_window ? std::move(cast_content_window) - : web_service->CreateWindow(params.window_params)) { + : web_service->CreateWindow(params.window_params)), + resize_window_when_navigation_starts_(true) { DCHECK(web_service_); DCHECK(browser_context_); DCHECK(window_); + content::WebContentsObserver::Observe(web_contents_.get()); web_contents_->SetDelegate(this); #if defined(USE_AURA) @@ -99,6 +104,15 @@ CastWebContents* CastWebViewDefault::cast_web_contents() { return &cast_web_contents_; } +void CastWebViewDefault::LoadUrl(GURL url) { + cast_web_contents_.LoadUrl(url); +} + +void CastWebViewDefault::ClosePage() { + content::WebContentsObserver::Observe(nullptr); + cast_web_contents_.ClosePage(); +} + void CastWebViewDefault::CloseContents(content::WebContents* source) { DCHECK_EQ(source, web_contents_.get()); window_.reset(); // Window destructor requires live web_contents on Android. @@ -116,6 +130,19 @@ void CastWebViewDefault::InitializeWindow(mojom::ZOrder z_order, web_contents_->Focus(); } +void CastWebViewDefault::GrantScreenAccess() { + if (!window_) + return; + window_->GrantScreenAccess(); +} + +void CastWebViewDefault::RevokeScreenAccess() { + resize_window_when_navigation_starts_ = false; + if (!window_) + return; + window_->RevokeScreenAccess(); +} + content::WebContents* CastWebViewDefault::OpenURLFromTab( content::WebContents* source, const content::OpenURLParams& params) { @@ -254,4 +281,21 @@ bool CastWebViewDefault::ShouldAllowRunningInsecureContent( return allowed_per_prefs; } +void CastWebViewDefault::DidStartNavigation( + content::NavigationHandle* navigation_handle) { + if (!resize_window_when_navigation_starts_) { + return; + } + resize_window_when_navigation_starts_ = false; + +#if defined(USE_AURA) + // Resize window + gfx::Size display_size = + display::Screen::GetScreen()->GetPrimaryDisplay().size(); + aura::Window* content_window = web_contents()->GetNativeView(); + content_window->SetBounds( + gfx::Rect(display_size.width(), display_size.height())); +#endif +} + } // namespace chromecast diff --git a/chromecast/browser/cast_web_view_default.h b/chromecast/browser/cast_web_view_default.h index b46d7f5180e34a..becf40066ba1e0 100644 --- a/chromecast/browser/cast_web_view_default.h +++ b/chromecast/browser/cast_web_view_default.h @@ -13,9 +13,10 @@ #include "build/build_config.h" #include "chromecast/browser/cast_content_window.h" #include "chromecast/browser/cast_web_contents_impl.h" -#include "chromecast/browser/cast_web_view_base.h" +#include "chromecast/browser/cast_web_view.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" +#include "content/public/browser/web_contents_observer.h" namespace content { class BrowserContext; @@ -27,8 +28,9 @@ namespace chromecast { class CastWebService; // A simplified interface for loading and displaying WebContents in cast_shell. -class CastWebViewDefault : public CastWebViewBase, - private content::WebContentsDelegate { +class CastWebViewDefault : public CastWebView, + content::WebContentsObserver, + content::WebContentsDelegate { public: // |web_service| and |browser_context| should outlive this object. If // |cast_content_window| is not provided, an instance will be constructed from @@ -37,6 +39,7 @@ class CastWebViewDefault : public CastWebViewBase, const CreateParams& params, CastWebService* web_service, content::BrowserContext* browser_context, + scoped_refptr site_instance, std::unique_ptr cast_content_window = nullptr); ~CastWebViewDefault() override; @@ -44,10 +47,18 @@ class CastWebViewDefault : public CastWebViewBase, CastContentWindow* window() const override; content::WebContents* web_contents() const override; CastWebContents* cast_web_contents() override; + void LoadUrl(GURL url) override; + void ClosePage() override; void InitializeWindow(mojom::ZOrder z_order, VisibilityPriority initial_priority) override; + void GrantScreenAccess() override; + void RevokeScreenAccess() override; private: + // WebContentsObserver implementation: + void DidStartNavigation( + content::NavigationHandle* navigation_handle) override; + // WebContentsDelegate implementation: content::WebContents* OpenURLFromTab( content::WebContents* source, @@ -87,6 +98,7 @@ class CastWebViewDefault : public CastWebViewBase, std::unique_ptr web_contents_; CastWebContentsImpl cast_web_contents_; std::unique_ptr window_; + bool resize_window_when_navigation_starts_; DISALLOW_COPY_AND_ASSIGN(CastWebViewDefault); }; diff --git a/chromecast/browser/cast_web_view_factory.cc b/chromecast/browser/cast_web_view_factory.cc index 9e49e87d089acc..0b9eb9d5cff779 100644 --- a/chromecast/browser/cast_web_view_factory.cc +++ b/chromecast/browser/cast_web_view_factory.cc @@ -23,10 +23,11 @@ void CastWebViewFactory::OnPageDestroyed(CastWebView* web_view) { std::unique_ptr CastWebViewFactory::CreateWebView( const CastWebView::CreateParams& params, CastWebService* web_service, + scoped_refptr site_instance, const GURL& initial_url) { std::unique_ptr webview; - webview = std::make_unique(params, web_service, - browser_context_); + webview = std::make_unique( + params, web_service, browser_context_, site_instance); if (webview) { webview->AddObserver(this); } diff --git a/chromecast/browser/cast_web_view_factory.h b/chromecast/browser/cast_web_view_factory.h index 725fead66e5a10..6fe95e9cecc6d8 100644 --- a/chromecast/browser/cast_web_view_factory.h +++ b/chromecast/browser/cast_web_view_factory.h @@ -16,6 +16,7 @@ namespace content { class BrowserContext; +class SiteInstance; } // namespace content namespace chromecast { @@ -30,6 +31,7 @@ class CastWebViewFactory : public CastWebView::Observer { virtual std::unique_ptr CreateWebView( const CastWebView::CreateParams& params, CastWebService* web_service, + scoped_refptr site_instance, const GURL& initial_url); content::BrowserContext* browser_context() const { return browser_context_; } diff --git a/chromecast/browser/service/cast_service_simple.cc b/chromecast/browser/service/cast_service_simple.cc index a961d1a567ffdf..3f7ea0abc3d486 100644 --- a/chromecast/browser/service/cast_service_simple.cc +++ b/chromecast/browser/service/cast_service_simple.cc @@ -72,9 +72,10 @@ void CastServiceSimple::StartInternal() { params.web_contents_params.enabled_for_dev = true; params.window_params.delegate = weak_factory_.GetWeakPtr(); cast_web_view_ = - web_service_->CreateWebView(params, GURL() /* initial_url */); - cast_web_view_->cast_web_contents()->LoadUrl(startup_url_); - cast_web_view_->window()->GrantScreenAccess(); + web_service_->CreateWebView(params, nullptr, /* site_instance */ + GURL() /* initial_url */); + cast_web_view_->LoadUrl(startup_url_); + cast_web_view_->GrantScreenAccess(); cast_web_view_->InitializeWindow( ::chromecast::mojom::ZOrder::APP, chromecast::VisibilityPriority::STICKY_ACTIVITY); @@ -82,7 +83,7 @@ void CastServiceSimple::StartInternal() { void CastServiceSimple::StopInternal() { if (cast_web_view_) { - cast_web_view_->cast_web_contents()->ClosePage(); + cast_web_view_->ClosePage(); } cast_web_view_.reset(); } diff --git a/chromecast/browser/test/cast_browser_test.cc b/chromecast/browser/test/cast_browser_test.cc index be2502e298faf3..5f9300e47e70d4 100644 --- a/chromecast/browser/test/cast_browser_test.cc +++ b/chromecast/browser/test/cast_browser_test.cc @@ -64,7 +64,8 @@ content::WebContents* CastBrowserTest::CreateWebView() { params.web_contents_params.enabled_for_dev = true; params.window_params.delegate = weak_factory_.GetWeakPtr(); cast_web_view_ = - web_service_->CreateWebView(params, GURL() /* initial_url */); + web_service_->CreateWebView(params, nullptr, /* site_instance */ + GURL() /* initial_url */); return cast_web_view_->web_contents(); } @@ -76,7 +77,7 @@ content::WebContents* CastBrowserTest::NavigateToURL(const GURL& url) { content::WaitForLoadStop(web_contents); content::TestNavigationObserver same_tab_observer(web_contents, 1); - cast_web_view_->cast_web_contents()->LoadUrl(url); + cast_web_view_->LoadUrl(url); same_tab_observer.Wait(); diff --git a/chromecast/browser/test/cast_browser_test.h b/chromecast/browser/test/cast_browser_test.h index 9e12f9ca354d6e..1bcad425d92402 100644 --- a/chromecast/browser/test/cast_browser_test.h +++ b/chromecast/browser/test/cast_browser_test.h @@ -35,8 +35,6 @@ class CastBrowserTest : public content::BrowserTestBase, CastBrowserTest(); ~CastBrowserTest() override; - CastWebView* cast_web_view() const { return cast_web_view_.get(); } - // content::BrowserTestBase implementation: void SetUp() final; void SetUpCommandLine(base::CommandLine* command_line) override;