Commit 045d501c authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Commit Bot

Persist custom web preferences over WebContents life

Each WebContents can have an arbitrary number of RenderViewHosts. Since
each RenderViewHost would re-configure their WebPreferences, cast
webviews need to cache the user-configured preferences such that they
can be applied to new RenderViewHosts.

Bug: b/163595220
Test: On device load page with autoplay video.
Change-Id: I546f80a7271204aa2c5ee5939054bc949044d977
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2366474Reviewed-by: default avatarLuke Halliwell (slow) <halliwell@chromium.org>
Reviewed-by: default avatarAlbert Chaulk <achaulk@chromium.org>
Commit-Queue: Daniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800207}
parent 1bcfee63
......@@ -52,6 +52,17 @@ cast_source_set("feature_list") {
]
}
cast_source_set("web_preferences") {
sources = [
"cast_web_preferences.cc",
"cast_web_preferences.h",
]
deps = [
"//base",
"//content/public/common",
]
}
cast_source_set("browser") {
sources = [
"application_media_capabilities.cc",
......@@ -157,6 +168,7 @@ cast_source_set("browser") {
deps = [
":browser_buildflags",
":web_preferences",
"//base",
"//base:i18n",
"//base/util/memory_pressure",
......
......@@ -42,6 +42,7 @@
#include "chromecast/browser/cast_quota_permission_context.h"
#include "chromecast/browser/cast_session_id_map.h"
#include "chromecast/browser/cast_web_contents.h"
#include "chromecast/browser/cast_web_preferences.h"
#include "chromecast/browser/default_navigation_throttle.h"
#include "chromecast/browser/devtools/cast_devtools_manager_delegate.h"
#include "chromecast/browser/general_audience_browsing_navigation_throttle.h"
......@@ -567,6 +568,14 @@ void CastContentBrowserClient::OverrideWebkitPrefs(
prefs->preferred_color_scheme = static_cast<blink::PreferredColorScheme>(
CastBrowserProcess::GetInstance()->pref_service()->GetInteger(
prefs::kWebColorScheme));
// After all other default settings are set, check and see if there are any
// specific overrides for the WebContents.
CastWebPreferences* web_preferences =
static_cast<CastWebPreferences*>(web_contents->GetUserData(
CastWebPreferences::kCastWebPreferencesDataKey));
if (web_preferences)
web_preferences->Update(prefs);
}
std::string CastContentBrowserClient::GetApplicationLocale() {
......
// 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.
#include "chromecast/browser/cast_web_preferences.h"
namespace chromecast {
const void* CastWebPreferences::kCastWebPreferencesDataKey =
&CastWebPreferences::kCastWebPreferencesDataKey;
CastWebPreferences::Preferences::Preferences() = default;
CastWebPreferences::CastWebPreferences() = default;
void CastWebPreferences::Update(content::WebPreferences* prefs) {
if (preferences_.autoplay_policy)
prefs->autoplay_policy = preferences_.autoplay_policy.value();
if (preferences_.hide_scrollbars)
prefs->hide_scrollbars = preferences_.hide_scrollbars.value();
if (preferences_.javascript_enabled)
prefs->javascript_enabled = preferences_.javascript_enabled.value();
}
} // namespace chromecast
// 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 CHROMECAST_BROWSER_CAST_WEB_PREFERENCES_H_
#define CHROMECAST_BROWSER_CAST_WEB_PREFERENCES_H_
#include <base/optional.h>
#include <base/supports_user_data.h>
#include <content/public/common/web_preferences.h>
namespace chromecast {
// Stores user provided settings for a specific WebContents. These will be used
// to override default WebPreferences during the lifetime of the WebContents.
class CastWebPreferences : public base::SupportsUserData::Data {
public:
struct Preferences {
Preferences();
base::Optional<content::AutoplayPolicy> autoplay_policy;
base::Optional<bool> hide_scrollbars;
base::Optional<bool> javascript_enabled;
};
// Unique key used to identify CastWebPreferences in WebContents' user data.
static const void* kCastWebPreferencesDataKey;
CastWebPreferences();
CastWebPreferences(const CastWebPreferences&) = delete;
CastWebPreferences& operator=(CastWebPreferences&) = delete;
Preferences* preferences() { return &preferences_; }
// Overrides |prefs| with any locally stored preferences.
void Update(content::WebPreferences* prefs);
private:
Preferences preferences_;
};
} // namespace chromecast
#endif // CHROMECAST_BROWSER_CAST_WEB_PREFERENCES_H_
......@@ -21,7 +21,6 @@
#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/web_preferences.h"
#include "third_party/blink/public/common/input/web_touch_event.h"
#include "ui/aura/window.h"
#include "ui/aura/window_delegate.h"
......@@ -131,15 +130,6 @@ void WebContentController::ProcessRequest(
HandleGetTitle(request.id());
break;
case webview::WebviewRequest::kSetAutoMediaPlaybackPolicy:
if (request.has_set_auto_media_playback_policy()) {
HandleSetAutoMediaPlaybackPolicy(
request.set_auto_media_playback_policy());
} else {
client_->OnError("set_auto_media_playback_policy() not supplied");
}
break;
case webview::WebviewRequest::kResize:
if (request.has_resize()) {
HandleResize(
......@@ -417,16 +407,6 @@ void WebContentController::HandleGetTitle(int64_t id) {
client_->EnqueueSend(std::move(response));
}
void WebContentController::HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request) {
content::WebContents* contents = GetWebContents();
content::WebPreferences prefs = contents->GetOrCreateWebPreferences();
prefs.autoplay_policy = request.require_user_gesture()
? content::AutoplayPolicy::kUserGestureRequired
: content::AutoplayPolicy::kNoUserGestureRequired;
contents->SetWebPreferences(prefs);
}
void WebContentController::HandleResize(const gfx::Size& size) {
LOG(INFO) << "Sizing web content to " << size.ToString();
GetWebContents()->GetNativeView()->SetBounds(gfx::Rect(size));
......
......@@ -109,8 +109,6 @@ class WebContentController
void HandleClearCache();
void HandleClearCookies(int64_t id);
void HandleGetTitle(int64_t id);
void HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request);
void HandleResize(const gfx::Size& size);
viz::SurfaceId GetSurfaceId();
void ChannelModified(content::RenderFrameHost* frame,
......
......@@ -12,6 +12,7 @@
#include "base/strings/utf_string_conversions.h"
#include "chromecast/base/version.h"
#include "chromecast/browser/cast_web_contents_impl.h"
#include "chromecast/browser/cast_web_preferences.h"
#include "chromecast/browser/webview/proto/webview.pb.h"
#include "chromecast/browser/webview/webview_navigation_throttle.h"
#include "content/public/browser/browser_context.h"
......@@ -43,15 +44,16 @@ class WebviewUserData : public base::SupportsUserData::Data {
WebviewController* controller_;
};
void UpdateWebkitPreferences(content::RenderViewHost* render_view_host) {
content::WebPreferences prefs =
content::WebContents::FromRenderViewHost(render_view_host)
->GetOrCreateWebPreferences();
// Allow Webviews to show scrollbars. These are globally disabled since Cast
// Apps are not expected to be scrollable.
prefs.hide_scrollbars = false;
content::WebContents::FromRenderViewHost(render_view_host)
->SetWebPreferences(prefs);
CastWebPreferences* GetCastPreferencesFor(content::WebContents* web_contents) {
return static_cast<CastWebPreferences*>(web_contents->GetUserData(
CastWebPreferences::kCastWebPreferencesDataKey));
}
void UpdateWebkitPreferences(content::WebContents* web_contents,
CastWebPreferences* cast_prefs) {
content::WebPreferences prefs = web_contents->GetOrCreateWebPreferences();
cast_prefs->Update(&prefs);
web_contents->SetWebPreferences(prefs);
}
} // namespace
......@@ -64,6 +66,14 @@ WebviewController::WebviewController(content::BrowserContext* browser_context,
contents_ = content::WebContents::Create(create_params);
contents_->SetUserData(kWebviewResponseUserDataKey,
std::make_unique<WebviewUserData>(this));
contents_->SetUserData(CastWebPreferences::kCastWebPreferencesDataKey,
std::make_unique<CastWebPreferences>());
// Allow Webviews to show scrollbars. These are globally disabled since Cast
// Apps are not expected to be scrollable.
GetCastPreferencesFor(contents_.get())->preferences()->hide_scrollbars =
false;
CastWebContents::InitParams cast_contents_init;
cast_contents_init.is_root_window = true;
cast_contents_init.enabled_for_dev = enabled_for_dev;
......@@ -143,6 +153,15 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
}
break;
case webview::WebviewRequest::kSetAutoMediaPlaybackPolicy:
if (request.has_set_auto_media_playback_policy()) {
HandleSetAutoMediaPlaybackPolicy(
request.set_auto_media_playback_policy());
} else {
client_->OnError("set_auto_media_playback_policy() not supplied");
}
break;
default:
WebContentController::ProcessRequest(request);
break;
......@@ -152,9 +171,10 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
void WebviewController::HandleUpdateSettings(
const webview::UpdateSettingsRequest& request) {
content::WebContents* contents = GetWebContents();
content::WebPreferences prefs = contents->GetOrCreateWebPreferences();
prefs.javascript_enabled = request.javascript_enabled();
contents->SetWebPreferences(prefs);
CastWebPreferences* cast_prefs = GetCastPreferencesFor(contents);
cast_prefs->preferences()->javascript_enabled = request.javascript_enabled();
UpdateWebkitPreferences(contents, cast_prefs);
has_navigation_delegate_ = request.has_navigation_delegate();
......@@ -169,6 +189,18 @@ void WebviewController::HandleUpdateSettings(
}
}
void WebviewController::HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request) {
content::WebContents* contents = GetWebContents();
CastWebPreferences* cast_prefs = GetCastPreferencesFor(contents);
cast_prefs->preferences()->autoplay_policy =
request.require_user_gesture()
? content::AutoplayPolicy::kUserGestureRequired
: content::AutoplayPolicy::kNoUserGestureRequired;
UpdateWebkitPreferences(contents, cast_prefs);
}
void WebviewController::DidFirstVisuallyNonEmptyPaint() {
if (client_) {
std::unique_ptr<webview::WebviewResponse> response =
......@@ -181,12 +213,6 @@ void WebviewController::DidFirstVisuallyNonEmptyPaint() {
}
}
void WebviewController::RenderViewCreated(
content::RenderViewHost* render_view_host) {
WebContentController::RenderViewCreated(render_view_host);
UpdateWebkitPreferences(render_view_host);
}
void WebviewController::SendNavigationEvent(
WebviewNavigationThrottle* throttle,
content::NavigationHandle* navigation_handle) {
......
......@@ -66,6 +66,8 @@ class WebviewController : public CastWebContents::Delegate,
private:
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
void HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request);
webview::AsyncPageEvent_State current_state();
......@@ -80,9 +82,6 @@ class WebviewController : public CastWebContents::Delegate,
// content::WebContentsObserver
void DidFirstVisuallyNonEmptyPaint() override;
// WebContentController
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
const bool enabled_for_dev_;
std::unique_ptr<content::WebContents> contents_;
std::unique_ptr<CastWebContents> cast_web_contents_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment