Move blink::WebView::SetBaseBackgroundColor to content
There are various embedders that directly call WebView::SetBaseBackgroundColor for various purpose, which involves running their own IPC on top of content and has to deal with various lifetime complexities. Remove WebView::SetBaseBackgroundColor and add it to WebContents, and move embedders to call WebContents instead. Bug: 1138800, 1204793 Change-Id: I41f485ef653af8d47f73c76c0b3658b3dc9ceb37 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2695928 Reviewed-by: Devlin <rdevlin.cronin@chromium.org> Reviewed-by: danakj <danakj@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org> Reviewed-by: Tommy Li <tommycli@chromium.org> Reviewed-by: Alex Moshchuk <alexmos@chromium.org> Reviewed-by: Frank Liberato <liberato@chromium.org> Reviewed-by: Wez <wez@chromium.org> Reviewed-by: Daniel Cheng <dcheng@chromium.org> Reviewed-by: Sean Topping <seantopping@chromium.org> Commit-Queue: Bo <boliu@chromium.org> Cr-Commit-Position: refs/heads/master@{#891867}
This commit is contained in:
android_webview
browser
common
mojom
renderer
chromecast
components
content
browser
renderer_host
navigation_controller_impl_unittest.ccrender_view_host_delegate.ccrender_view_host_delegate.hrender_view_host_impl.cc
web_contents
common
public
browser
renderer
extensions/renderer
fuchsia/engine
media/blink
third_party/blink
public
renderer
core
exported
frame
layout
page
modules
peerconnection
weblayer/browser
@@ -1131,7 +1131,7 @@ void AwContents::SetBackgroundColor(JNIEnv* env,
|
|||||||
const JavaParamRef<jobject>& obj,
|
const JavaParamRef<jobject>& obj,
|
||||||
jint color) {
|
jint color) {
|
||||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||||
render_view_host_ext_->SetBackgroundColor(color);
|
web_contents_->SetPageBaseBackgroundColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AwContents::ZoomBy(JNIEnv* env,
|
void AwContents::ZoomBy(JNIEnv* env,
|
||||||
|
@@ -56,7 +56,6 @@ AwRenderViewHostExt::AwRenderViewHostExt(AwRenderViewHostExtClient* client,
|
|||||||
content::WebContents* contents)
|
content::WebContents* contents)
|
||||||
: content::WebContentsObserver(contents),
|
: content::WebContentsObserver(contents),
|
||||||
client_(client),
|
client_(client),
|
||||||
background_color_(SK_ColorWHITE),
|
|
||||||
has_new_hit_test_data_(false),
|
has_new_hit_test_data_(false),
|
||||||
frame_host_receivers_(contents, this) {
|
frame_host_receivers_(contents, this) {
|
||||||
DCHECK(client_);
|
DCHECK(client_);
|
||||||
@@ -124,15 +123,6 @@ void AwRenderViewHostExt::SetInitialPageScale(double page_scale_factor) {
|
|||||||
local_main_frame_remote_->SetInitialPageScale(page_scale_factor);
|
local_main_frame_remote_->SetInitialPageScale(page_scale_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AwRenderViewHostExt::SetBackgroundColor(SkColor c) {
|
|
||||||
if (background_color_ == c)
|
|
||||||
return;
|
|
||||||
background_color_ = c;
|
|
||||||
if (local_main_frame_remote_) {
|
|
||||||
local_main_frame_remote_->SetBackgroundColor(background_color_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AwRenderViewHostExt::SetWillSuppressErrorPage(bool suppress) {
|
void AwRenderViewHostExt::SetWillSuppressErrorPage(bool suppress) {
|
||||||
will_suppress_error_page_ = suppress;
|
will_suppress_error_page_ = suppress;
|
||||||
}
|
}
|
||||||
@@ -149,8 +139,6 @@ void AwRenderViewHostExt::ResetLocalMainFrameRemote(
|
|||||||
local_main_frame_remote_.reset();
|
local_main_frame_remote_.reset();
|
||||||
frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
|
frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
|
||||||
local_main_frame_remote_.BindNewEndpointAndPassReceiver());
|
local_main_frame_remote_.BindNewEndpointAndPassReceiver());
|
||||||
|
|
||||||
local_main_frame_remote_->SetBackgroundColor(background_color_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AwRenderViewHostExt::RenderFrameCreated(
|
void AwRenderViewHostExt::RenderFrameCreated(
|
||||||
|
@@ -70,7 +70,6 @@ class AwRenderViewHostExt : public content::WebContentsObserver,
|
|||||||
// Sets the initial page scale. This overrides initial scale set by
|
// Sets the initial page scale. This overrides initial scale set by
|
||||||
// the meta viewport tag.
|
// the meta viewport tag.
|
||||||
void SetInitialPageScale(double page_scale_factor);
|
void SetInitialPageScale(double page_scale_factor);
|
||||||
void SetBackgroundColor(SkColor c);
|
|
||||||
void SetWillSuppressErrorPage(bool suppress);
|
void SetWillSuppressErrorPage(bool suppress);
|
||||||
|
|
||||||
void SmoothScroll(int target_x, int target_y, base::TimeDelta duration);
|
void SmoothScroll(int target_x, int target_y, base::TimeDelta duration);
|
||||||
@@ -103,8 +102,6 @@ class AwRenderViewHostExt : public content::WebContentsObserver,
|
|||||||
|
|
||||||
AwRenderViewHostExtClient* client_;
|
AwRenderViewHostExtClient* client_;
|
||||||
|
|
||||||
SkColor background_color_;
|
|
||||||
|
|
||||||
// Authoritative copy of hit test data on the browser side. This is updated
|
// Authoritative copy of hit test data on the browser side. This is updated
|
||||||
// as a result of DoHitTest called explicitly or when the FocusedNodeChanged
|
// as a result of DoHitTest called explicitly or when the FocusedNodeChanged
|
||||||
// is called in AwRenderViewExt.
|
// is called in AwRenderViewExt.
|
||||||
|
@@ -79,9 +79,6 @@ struct HitTestData {
|
|||||||
// things that webview needs from the main frame.
|
// things that webview needs from the main frame.
|
||||||
interface LocalMainFrame {
|
interface LocalMainFrame {
|
||||||
|
|
||||||
// Sets the base background color for this view.
|
|
||||||
SetBackgroundColor(skia.mojom.SkColor color);
|
|
||||||
|
|
||||||
// Sets the initial page scale. This overrides initial scale set by
|
// Sets the initial page scale. This overrides initial scale set by
|
||||||
// the meta viewport tag.
|
// the meta viewport tag.
|
||||||
SetInitialPageScale(double page_scale_factor);
|
SetInitialPageScale(double page_scale_factor);
|
||||||
|
@@ -286,14 +286,6 @@ void AwRenderFrameExt::HitTest(const gfx::PointF& touch_center,
|
|||||||
GetFrameHost()->UpdateHitTestData(std::move(data));
|
GetFrameHost()->UpdateHitTestData(std::move(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AwRenderFrameExt::SetBackgroundColor(SkColor c) {
|
|
||||||
blink::WebView* webview = GetWebView();
|
|
||||||
if (!webview)
|
|
||||||
return;
|
|
||||||
|
|
||||||
webview->SetBaseBackgroundColor(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AwRenderFrameExt::SetInitialPageScale(double page_scale_factor) {
|
void AwRenderFrameExt::SetInitialPageScale(double page_scale_factor) {
|
||||||
blink::WebView* webview = GetWebView();
|
blink::WebView* webview = GetWebView();
|
||||||
if (!webview)
|
if (!webview)
|
||||||
|
@@ -48,7 +48,6 @@ class AwRenderFrameExt : public content::RenderFrameObserver,
|
|||||||
void OnDestruct() override;
|
void OnDestruct() override;
|
||||||
|
|
||||||
// mojom::LocalMainFrame overrides:
|
// mojom::LocalMainFrame overrides:
|
||||||
void SetBackgroundColor(SkColor c) override;
|
|
||||||
void SetInitialPageScale(double page_scale_factor) override;
|
void SetInitialPageScale(double page_scale_factor) override;
|
||||||
void SetTextZoomFactor(float zoom_factor) override;
|
void SetTextZoomFactor(float zoom_factor) override;
|
||||||
void HitTest(const gfx::PointF& touch_center,
|
void HitTest(const gfx::PointF& touch_center,
|
||||||
|
@@ -170,6 +170,9 @@ CastWebContentsImpl::CastWebContentsImpl(content::WebContents* web_contents,
|
|||||||
web_contents_->GetMutableRendererPrefs()
|
web_contents_->GetMutableRendererPrefs()
|
||||||
->webrtc_allow_legacy_tls_protocols = true;
|
->webrtc_allow_legacy_tls_protocols = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
web_contents_->SetPageBaseBackgroundColor(chromecast::GetSwitchValueColor(
|
||||||
|
switches::kCastAppBackgroundColor, SK_ColorBLACK));
|
||||||
}
|
}
|
||||||
|
|
||||||
CastWebContentsImpl::~CastWebContentsImpl() {
|
CastWebContentsImpl::~CastWebContentsImpl() {
|
||||||
|
@@ -163,8 +163,6 @@ void CastContentRendererClient::RenderThreadStarted() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CastContentRendererClient::WebViewCreated(blink::WebView* webview) {
|
void CastContentRendererClient::WebViewCreated(blink::WebView* webview) {
|
||||||
webview->SetBaseBackgroundColor(chromecast::GetSwitchValueColor(
|
|
||||||
switches::kCastAppBackgroundColor, SK_ColorBLACK));
|
|
||||||
// Disable application cache as Chromecast doesn't support off-line
|
// Disable application cache as Chromecast doesn't support off-line
|
||||||
// application running.
|
// application running.
|
||||||
webview->GetSettings()->SetOfflineWebApplicationCacheEnabled(false);
|
webview->GetSettings()->SetOfflineWebApplicationCacheEnabled(false);
|
||||||
|
@@ -274,7 +274,8 @@ WebViewPlugin::WebViewHelper::WebViewHelper(
|
|||||||
/*widgets_never_composited=*/false,
|
/*widgets_never_composited=*/false,
|
||||||
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
||||||
*agent_group_scheduler_,
|
*agent_group_scheduler_,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString());
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt);
|
||||||
// ApplyWebPreferences before making a WebLocalFrame so that the frame sees a
|
// ApplyWebPreferences before making a WebLocalFrame so that the frame sees a
|
||||||
// consistent view of our preferences.
|
// consistent view of our preferences.
|
||||||
blink::WebView::ApplyWebPreferences(parent_web_preferences, web_view_);
|
blink::WebView::ApplyWebPreferences(parent_web_preferences, web_view_);
|
||||||
|
@@ -672,7 +672,8 @@ void PrintRenderFrameHelper::PrintHeaderAndFooter(
|
|||||||
/*compositing_enabled=*/false, /*widgets_never_composited=*/false,
|
/*compositing_enabled=*/false, /*widgets_never_composited=*/false,
|
||||||
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
||||||
*source_frame.GetAgentGroupScheduler(),
|
*source_frame.GetAgentGroupScheduler(),
|
||||||
/*session_storage_namespace_id=*/base::EmptyString());
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt);
|
||||||
web_view->GetSettings()->SetJavaScriptEnabled(true);
|
web_view->GetSettings()->SetJavaScriptEnabled(true);
|
||||||
|
|
||||||
class HeaderAndFooterClient final : public blink::WebLocalFrameClient {
|
class HeaderAndFooterClient final : public blink::WebLocalFrameClient {
|
||||||
@@ -951,7 +952,8 @@ void PrepareFrameAndViewForPrint::CopySelection(
|
|||||||
/*widgets_never_composited=*/false,
|
/*widgets_never_composited=*/false,
|
||||||
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
||||||
agent_group_scheduler_,
|
agent_group_scheduler_,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString());
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt);
|
||||||
blink::WebView::ApplyWebPreferences(prefs, web_view);
|
blink::WebView::ApplyWebPreferences(prefs, web_view);
|
||||||
blink::WebLocalFrame* main_frame = blink::WebLocalFrame::CreateMainFrame(
|
blink::WebLocalFrame* main_frame = blink::WebLocalFrame::CreateMainFrame(
|
||||||
web_view, this, nullptr, blink::LocalFrameToken(), nullptr);
|
web_view, this, nullptr, blink::LocalFrameToken(), nullptr);
|
||||||
|
@@ -120,6 +120,10 @@ class MockPageBroadcast : public blink::mojom::PageBroadcast {
|
|||||||
SetHistoryOffsetAndLength,
|
SetHistoryOffsetAndLength,
|
||||||
(int32_t offset, int32_t length),
|
(int32_t offset, int32_t length),
|
||||||
(override));
|
(override));
|
||||||
|
MOCK_METHOD(void,
|
||||||
|
SetPageBaseBackgroundColor,
|
||||||
|
(absl::optional<SkColor> color),
|
||||||
|
(override));
|
||||||
|
|
||||||
mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() {
|
mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() {
|
||||||
return receiver_.BindNewEndpointAndPassDedicatedRemote();
|
return receiver_.BindNewEndpointAndPassDedicatedRemote();
|
||||||
|
@@ -39,4 +39,8 @@ bool RenderViewHostDelegate::IsPortal() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absl::optional<SkColor> RenderViewHostDelegate::GetBaseBackgroundColor() {
|
||||||
|
return absl::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace content
|
} // namespace content
|
||||||
|
@@ -13,6 +13,8 @@
|
|||||||
#include "content/common/content_export.h"
|
#include "content/common/content_export.h"
|
||||||
#include "mojo/public/cpp/bindings/pending_remote.h"
|
#include "mojo/public/cpp/bindings/pending_remote.h"
|
||||||
#include "net/base/load_states.h"
|
#include "net/base/load_states.h"
|
||||||
|
#include "third_party/abseil-cpp/absl/types/optional.h"
|
||||||
|
#include "third_party/skia/include/core/SkColor.h"
|
||||||
|
|
||||||
namespace blink {
|
namespace blink {
|
||||||
namespace web_pref {
|
namespace web_pref {
|
||||||
@@ -143,6 +145,11 @@ class CONTENT_EXPORT RenderViewHostDelegate {
|
|||||||
// changed.
|
// changed.
|
||||||
virtual void OnBackgroundColorChanged(RenderViewHostImpl* source) {}
|
virtual void OnBackgroundColorChanged(RenderViewHostImpl* source) {}
|
||||||
|
|
||||||
|
// Called on RenderView creation to get the initial base background color
|
||||||
|
// for this RenderView. Nullopt means a color is not set, and the blink
|
||||||
|
// default color should be used.
|
||||||
|
virtual absl::optional<SkColor> GetBaseBackgroundColor();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~RenderViewHostDelegate() {}
|
virtual ~RenderViewHostDelegate() {}
|
||||||
};
|
};
|
||||||
|
@@ -476,6 +476,7 @@ bool RenderViewHostImpl::CreateRenderView(
|
|||||||
params->hidden = frame_tree_->delegate()->IsHidden();
|
params->hidden = frame_tree_->delegate()->IsHidden();
|
||||||
params->never_composited = delegate_->IsNeverComposited();
|
params->never_composited = delegate_->IsNeverComposited();
|
||||||
params->window_was_created_with_opener = window_was_created_with_opener;
|
params->window_was_created_with_opener = window_was_created_with_opener;
|
||||||
|
params->base_background_color = delegate_->GetBaseBackgroundColor();
|
||||||
|
|
||||||
bool is_portal = delegate_->IsPortal();
|
bool is_portal = delegate_->IsPortal();
|
||||||
bool is_guest_view = delegate_->IsGuest();
|
bool is_guest_view = delegate_->IsGuest();
|
||||||
|
@@ -1502,6 +1502,21 @@ absl::optional<SkColor> WebContentsImpl::GetBackgroundColor() {
|
|||||||
return GetRenderViewHost()->background_color();
|
return GetRenderViewHost()->background_color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebContentsImpl::SetPageBaseBackgroundColor(
|
||||||
|
absl::optional<SkColor> color) {
|
||||||
|
if (page_base_background_color_ == color)
|
||||||
|
return;
|
||||||
|
page_base_background_color_ = color;
|
||||||
|
ExecutePageBroadcastMethod(base::BindRepeating(
|
||||||
|
[](absl::optional<SkColor> color, RenderViewHostImpl* rvh) {
|
||||||
|
// Null `broadcast` can happen before view is created on the renderer
|
||||||
|
// side, in which case this color will be sent in CreateView.
|
||||||
|
if (auto& broadcast = rvh->GetAssociatedPageBroadcast())
|
||||||
|
broadcast->SetPageBaseBackgroundColor(color);
|
||||||
|
},
|
||||||
|
page_base_background_color_));
|
||||||
|
}
|
||||||
|
|
||||||
void WebContentsImpl::SetAccessibilityMode(ui::AXMode mode) {
|
void WebContentsImpl::SetAccessibilityMode(ui::AXMode mode) {
|
||||||
OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::SetAccessibilityMode",
|
OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::SetAccessibilityMode",
|
||||||
"mode", mode.ToString(), "previous_mode",
|
"mode", mode.ToString(), "previous_mode",
|
||||||
@@ -5858,6 +5873,10 @@ void WebContentsImpl::RecomputeWebPreferencesSlow() {
|
|||||||
OnWebPreferencesChanged();
|
OnWebPreferencesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absl::optional<SkColor> WebContentsImpl::GetBaseBackgroundColor() {
|
||||||
|
return page_base_background_color_;
|
||||||
|
}
|
||||||
|
|
||||||
void WebContentsImpl::PrintCrossProcessSubframe(
|
void WebContentsImpl::PrintCrossProcessSubframe(
|
||||||
const gfx::Rect& rect,
|
const gfx::Rect& rect,
|
||||||
int document_cookie,
|
int document_cookie,
|
||||||
|
@@ -364,6 +364,7 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents,
|
|||||||
void ClosePage() override;
|
void ClosePage() override;
|
||||||
absl::optional<SkColor> GetThemeColor() override;
|
absl::optional<SkColor> GetThemeColor() override;
|
||||||
absl::optional<SkColor> GetBackgroundColor() override;
|
absl::optional<SkColor> GetBackgroundColor() override;
|
||||||
|
void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override;
|
||||||
WebUI* GetWebUI() override;
|
WebUI* GetWebUI() override;
|
||||||
WebUI* GetCommittedWebUI() override;
|
WebUI* GetCommittedWebUI() override;
|
||||||
void SetUserAgentOverride(const blink::UserAgentOverride& ua_override,
|
void SetUserAgentOverride(const blink::UserAgentOverride& ua_override,
|
||||||
@@ -858,6 +859,7 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents,
|
|||||||
void OnThemeColorChanged(RenderViewHostImpl* source) override;
|
void OnThemeColorChanged(RenderViewHostImpl* source) override;
|
||||||
void OnBackgroundColorChanged(RenderViewHostImpl* source) override;
|
void OnBackgroundColorChanged(RenderViewHostImpl* source) override;
|
||||||
void RecomputeWebPreferencesSlow() override;
|
void RecomputeWebPreferencesSlow() override;
|
||||||
|
absl::optional<SkColor> GetBaseBackgroundColor() override;
|
||||||
|
|
||||||
// NavigatorDelegate ---------------------------------------------------------
|
// NavigatorDelegate ---------------------------------------------------------
|
||||||
|
|
||||||
@@ -2208,6 +2210,12 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents,
|
|||||||
// information to apps that capture it.
|
// information to apps that capture it.
|
||||||
blink::mojom::CaptureHandleConfig capture_handle_config_;
|
blink::mojom::CaptureHandleConfig capture_handle_config_;
|
||||||
|
|
||||||
|
// Background color of the page set by the embedder to be passed to all
|
||||||
|
// renderers attached to this WebContents, for use in the main frame.
|
||||||
|
// It is used when the page has not loaded enough to know a background
|
||||||
|
// color or if the page does not set a background color.
|
||||||
|
absl::optional<SkColor> page_base_background_color_;
|
||||||
|
|
||||||
base::WeakPtrFactory<WebContentsImpl> loading_weak_factory_{this};
|
base::WeakPtrFactory<WebContentsImpl> loading_weak_factory_{this};
|
||||||
base::WeakPtrFactory<WebContentsImpl> weak_factory_{this};
|
base::WeakPtrFactory<WebContentsImpl> weak_factory_{this};
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@ import "mojo/public/mojom/base/string16.mojom";
|
|||||||
import "mojo/public/mojom/base/time.mojom";
|
import "mojo/public/mojom/base/time.mojom";
|
||||||
import "mojo/public/mojom/base/unguessable_token.mojom";
|
import "mojo/public/mojom/base/unguessable_token.mojom";
|
||||||
import "mojo/public/mojom/base/values.mojom";
|
import "mojo/public/mojom/base/values.mojom";
|
||||||
|
import "skia/public/mojom/skcolor.mojom";
|
||||||
import "services/network/public/mojom/content_security_policy.mojom";
|
import "services/network/public/mojom/content_security_policy.mojom";
|
||||||
import "services/network/public/mojom/url_loader.mojom";
|
import "services/network/public/mojom/url_loader.mojom";
|
||||||
import "services/network/public/mojom/url_loader_factory.mojom";
|
import "services/network/public/mojom/url_loader_factory.mojom";
|
||||||
@@ -127,6 +128,9 @@ struct CreateViewParams {
|
|||||||
|
|
||||||
// Endpoint for any messages that are broadcast to all views in a WebContents.
|
// Endpoint for any messages that are broadcast to all views in a WebContents.
|
||||||
pending_associated_receiver<blink.mojom.PageBroadcast> blink_page_broadcast;
|
pending_associated_receiver<blink.mojom.PageBroadcast> blink_page_broadcast;
|
||||||
|
|
||||||
|
// Base background color of this view. Only used by a local main frame.
|
||||||
|
skia.mojom.SkColor? base_background_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A union to distinguish between parameters specific to local main frame
|
// A union to distinguish between parameters specific to local main frame
|
||||||
|
@@ -413,6 +413,19 @@ class WebContents : public PageNavigator,
|
|||||||
// any.
|
// any.
|
||||||
virtual absl::optional<SkColor> GetBackgroundColor() = 0;
|
virtual absl::optional<SkColor> GetBackgroundColor() = 0;
|
||||||
|
|
||||||
|
// Sets the renderer-side default background color of the page. This is used
|
||||||
|
// when the page has not loaded enough to know a background color or if the
|
||||||
|
// page does not set a background color.
|
||||||
|
// Pass in nullopt to reset back to the default.
|
||||||
|
// Note there are situations where the base background color is not used, such
|
||||||
|
// as fullscreen.
|
||||||
|
// Note currently this is sent directly to the renderer, so does not interact
|
||||||
|
// directly with `RenderWidgetHostView::SetBackgroundColor`. There is pending
|
||||||
|
// refactor to remove `RenderWidgetHostView::SetBackgroundColor` and merge its
|
||||||
|
// functionality here, which will be more consistent and simpler to
|
||||||
|
// understand.
|
||||||
|
virtual void SetPageBaseBackgroundColor(absl::optional<SkColor> color) = 0;
|
||||||
|
|
||||||
// Returns the committed WebUI if one exists, otherwise the pending one.
|
// Returns the committed WebUI if one exists, otherwise the pending one.
|
||||||
virtual WebUI* GetWebUI() = 0;
|
virtual WebUI* GetWebUI() = 0;
|
||||||
virtual WebUI* GetCommittedWebUI() = 0;
|
virtual WebUI* GetCommittedWebUI() = 0;
|
||||||
|
@@ -120,7 +120,7 @@ void RenderViewImpl::Initialize(
|
|||||||
opener_frame ? opener_frame->View() : nullptr,
|
opener_frame ? opener_frame->View() : nullptr,
|
||||||
std::move(params->blink_page_broadcast),
|
std::move(params->blink_page_broadcast),
|
||||||
agent_scheduling_group_.agent_group_scheduler(),
|
agent_scheduling_group_.agent_group_scheduler(),
|
||||||
params->session_storage_namespace_id);
|
params->session_storage_namespace_id, params->base_background_color);
|
||||||
|
|
||||||
g_view_map.Get().insert(std::make_pair(GetWebView(), this));
|
g_view_map.Get().insert(std::make_pair(GetWebView(), this));
|
||||||
g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this));
|
g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this));
|
||||||
|
@@ -27,7 +27,8 @@ ScopedWebFrame::ScopedWebFrame()
|
|||||||
/*opener=*/nullptr,
|
/*opener=*/nullptr,
|
||||||
mojo::NullAssociatedReceiver(),
|
mojo::NullAssociatedReceiver(),
|
||||||
*agent_group_scheduler_,
|
*agent_group_scheduler_,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString())),
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt)),
|
||||||
frame_(blink::WebLocalFrame::CreateMainFrame(view_,
|
frame_(blink::WebLocalFrame::CreateMainFrame(view_,
|
||||||
&frame_client_,
|
&frame_client_,
|
||||||
nullptr,
|
nullptr,
|
||||||
|
@@ -293,6 +293,7 @@ FrameImpl::FrameImpl(std::unique_ptr<content::WebContents> web_contents,
|
|||||||
WebContentsToFrameImplMap()[web_contents_.get()] = this;
|
WebContentsToFrameImplMap()[web_contents_.get()] = this;
|
||||||
|
|
||||||
web_contents_->SetDelegate(this);
|
web_contents_->SetDelegate(this);
|
||||||
|
web_contents_->SetPageBaseBackgroundColor(SK_AlphaTRANSPARENT);
|
||||||
Observe(web_contents_.get());
|
Observe(web_contents_.get());
|
||||||
|
|
||||||
binding_.set_error_handler([this](zx_status_t status) {
|
binding_.set_error_handler([this](zx_status_t status) {
|
||||||
|
@@ -137,13 +137,6 @@ void WebEngineContentRendererClient::RenderThreadStarted() {
|
|||||||
|
|
||||||
void WebEngineContentRendererClient::RenderFrameCreated(
|
void WebEngineContentRendererClient::RenderFrameCreated(
|
||||||
content::RenderFrame* render_frame) {
|
content::RenderFrame* render_frame) {
|
||||||
// If this is a top-level frame then it should have a transparent background.
|
|
||||||
// Both the RenderView and WebView should be guaranteed to be non-null, since
|
|
||||||
// the |render_frame| was only just created.
|
|
||||||
if (render_frame->IsMainFrame()) {
|
|
||||||
render_frame->GetWebView()->SetBaseBackgroundColor(SK_AlphaTRANSPARENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add WebEngine services to the new RenderFrame.
|
// Add WebEngine services to the new RenderFrame.
|
||||||
// The objects' lifetimes are bound to the RenderFrame's lifetime.
|
// The objects' lifetimes are bound to the RenderFrame's lifetime.
|
||||||
new on_load_script_injector::OnLoadScriptInjector(render_frame);
|
new on_load_script_injector::OnLoadScriptInjector(render_frame);
|
||||||
|
@@ -326,7 +326,8 @@ class WebMediaPlayerImplTest
|
|||||||
/*opener=*/nullptr,
|
/*opener=*/nullptr,
|
||||||
mojo::NullAssociatedReceiver(),
|
mojo::NullAssociatedReceiver(),
|
||||||
*agent_group_scheduler,
|
*agent_group_scheduler,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString())),
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt)),
|
||||||
web_local_frame_(
|
web_local_frame_(
|
||||||
blink::WebLocalFrame::CreateMainFrame(web_view_,
|
blink::WebLocalFrame::CreateMainFrame(web_view_,
|
||||||
&web_frame_client_,
|
&web_frame_client_,
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
module blink.mojom;
|
module blink.mojom;
|
||||||
import "mojo/public/mojom/base/time.mojom";
|
import "mojo/public/mojom/base/time.mojom";
|
||||||
|
import "skia/public/mojom/skcolor.mojom";
|
||||||
import "third_party/blink/public/mojom/page/page_visibility_state.mojom";
|
import "third_party/blink/public/mojom/page/page_visibility_state.mojom";
|
||||||
import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom";
|
import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom";
|
||||||
import "third_party/blink/public/mojom/renderer_preferences.mojom";
|
import "third_party/blink/public/mojom/renderer_preferences.mojom";
|
||||||
@@ -73,4 +74,7 @@ interface PageBroadcast {
|
|||||||
|
|
||||||
// Set history offset and length.
|
// Set history offset and length.
|
||||||
SetHistoryOffsetAndLength(int32 offset, int32 length);
|
SetHistoryOffsetAndLength(int32 offset, int32 length);
|
||||||
|
|
||||||
|
// Sent to whole page, but should only be used by the main frame.
|
||||||
|
SetPageBaseBackgroundColor(skia.mojom.SkColor? color);
|
||||||
};
|
};
|
||||||
|
@@ -13,6 +13,7 @@ import "services/viz/public/mojom/compositing/compositor_frame_sink.mojom";
|
|||||||
import "services/viz/public/mojom/compositing/local_surface_id.mojom";
|
import "services/viz/public/mojom/compositing/local_surface_id.mojom";
|
||||||
import "services/viz/public/mojom/hit_test/input_target_client.mojom";
|
import "services/viz/public/mojom/hit_test/input_target_client.mojom";
|
||||||
import "skia/public/mojom/bitmap.mojom";
|
import "skia/public/mojom/bitmap.mojom";
|
||||||
|
import "skia/public/mojom/skcolor.mojom";
|
||||||
import "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom";
|
import "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom";
|
||||||
import "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom";
|
import "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom";
|
||||||
import "third_party/blink/public/mojom/input/input_handler.mojom";
|
import "third_party/blink/public/mojom/input/input_handler.mojom";
|
||||||
|
11
third_party/blink/public/web/web_view.h
vendored
11
third_party/blink/public/web/web_view.h
vendored
@@ -114,6 +114,9 @@ class WebView {
|
|||||||
// to inform blink it is in the foreground or background. Whereas this bit
|
// to inform blink it is in the foreground or background. Whereas this bit
|
||||||
// refers to user-visibility and whether the tab needs to produce pixels to
|
// refers to user-visibility and whether the tab needs to produce pixels to
|
||||||
// put on the screen at some point or not.
|
// put on the screen at some point or not.
|
||||||
|
// |page_base_background_color| initial base background color used by the main
|
||||||
|
// frame. Set on create to avoid races. Passing in nullopt indicates the
|
||||||
|
// default base background color should be used.
|
||||||
// TODO(yuzus): Remove |is_hidden| and start using |PageVisibilityState|.
|
// TODO(yuzus): Remove |is_hidden| and start using |PageVisibilityState|.
|
||||||
BLINK_EXPORT static WebView* Create(
|
BLINK_EXPORT static WebView* Create(
|
||||||
WebViewClient*,
|
WebViewClient*,
|
||||||
@@ -125,7 +128,8 @@ class WebView {
|
|||||||
CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase>
|
CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase>
|
||||||
page_handle,
|
page_handle,
|
||||||
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id);
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color);
|
||||||
|
|
||||||
// Destroys the WebView.
|
// Destroys the WebView.
|
||||||
virtual void Close() = 0;
|
virtual void Close() = 0;
|
||||||
@@ -353,11 +357,6 @@ class WebView {
|
|||||||
|
|
||||||
// Custom colors -------------------------------------------------------
|
// Custom colors -------------------------------------------------------
|
||||||
|
|
||||||
// Sets the default background color when the page has not loaded enough to
|
|
||||||
// know a background colour. This can be overridden by the methods below as
|
|
||||||
// well.
|
|
||||||
virtual void SetBaseBackgroundColor(SkColor) {}
|
|
||||||
|
|
||||||
virtual void SetDeviceColorSpaceForTesting(
|
virtual void SetDeviceColorSpaceForTesting(
|
||||||
const gfx::ColorSpace& color_space) = 0;
|
const gfx::ColorSpace& color_space) = 0;
|
||||||
|
|
||||||
|
@@ -464,14 +464,16 @@ WebView* WebView::Create(
|
|||||||
CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase>
|
CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase>
|
||||||
page_handle,
|
page_handle,
|
||||||
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id) {
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color) {
|
||||||
return WebViewImpl::Create(
|
return WebViewImpl::Create(
|
||||||
client,
|
client,
|
||||||
is_hidden ? mojom::blink::PageVisibilityState::kHidden
|
is_hidden ? mojom::blink::PageVisibilityState::kHidden
|
||||||
: mojom::blink::PageVisibilityState::kVisible,
|
: mojom::blink::PageVisibilityState::kVisible,
|
||||||
is_inside_portal, compositing_enabled, widgets_never_composited,
|
is_inside_portal, compositing_enabled, widgets_never_composited,
|
||||||
static_cast<WebViewImpl*>(opener), std::move(page_handle),
|
static_cast<WebViewImpl*>(opener), std::move(page_handle),
|
||||||
agent_group_scheduler, session_storage_namespace_id);
|
agent_group_scheduler, session_storage_namespace_id,
|
||||||
|
std::move(page_base_background_color));
|
||||||
}
|
}
|
||||||
|
|
||||||
WebViewImpl* WebViewImpl::Create(
|
WebViewImpl* WebViewImpl::Create(
|
||||||
@@ -483,13 +485,15 @@ WebViewImpl* WebViewImpl::Create(
|
|||||||
WebViewImpl* opener,
|
WebViewImpl* opener,
|
||||||
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
||||||
blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id) {
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color) {
|
||||||
// Take a self-reference for WebViewImpl that is released by calling Close(),
|
// Take a self-reference for WebViewImpl that is released by calling Close(),
|
||||||
// then return a raw pointer to the caller.
|
// then return a raw pointer to the caller.
|
||||||
auto web_view = base::AdoptRef(
|
auto web_view = base::AdoptRef(
|
||||||
new WebViewImpl(client, visibility, is_inside_portal, compositing_enabled,
|
new WebViewImpl(client, visibility, is_inside_portal, compositing_enabled,
|
||||||
widgets_never_composited, opener, std::move(page_handle),
|
widgets_never_composited, opener, std::move(page_handle),
|
||||||
agent_group_scheduler, session_storage_namespace_id));
|
agent_group_scheduler, session_storage_namespace_id,
|
||||||
|
std::move(page_base_background_color)));
|
||||||
web_view->AddRef();
|
web_view->AddRef();
|
||||||
return web_view.get();
|
return web_view.get();
|
||||||
}
|
}
|
||||||
@@ -553,7 +557,8 @@ WebViewImpl::WebViewImpl(
|
|||||||
WebViewImpl* opener,
|
WebViewImpl* opener,
|
||||||
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
||||||
blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id)
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color)
|
||||||
: widgets_never_composited_(widgets_never_composited),
|
: widgets_never_composited_(widgets_never_composited),
|
||||||
web_view_client_(client),
|
web_view_client_(client),
|
||||||
chrome_client_(MakeGarbageCollected<ChromeClientImpl>(this)),
|
chrome_client_(MakeGarbageCollected<ChromeClientImpl>(this)),
|
||||||
@@ -561,6 +566,8 @@ WebViewImpl::WebViewImpl(
|
|||||||
maximum_zoom_level_(PageZoomFactorToZoomLevel(kMaximumPageZoomFactor)),
|
maximum_zoom_level_(PageZoomFactorToZoomLevel(kMaximumPageZoomFactor)),
|
||||||
does_composite_(does_composite),
|
does_composite_(does_composite),
|
||||||
fullscreen_controller_(std::make_unique<FullscreenController>(this)),
|
fullscreen_controller_(std::make_unique<FullscreenController>(this)),
|
||||||
|
page_base_background_color_(
|
||||||
|
page_base_background_color.value_or(SK_ColorWHITE)),
|
||||||
receiver_(this,
|
receiver_(this,
|
||||||
std::move(page_handle),
|
std::move(page_handle),
|
||||||
agent_group_scheduler.DefaultTaskRunner()),
|
agent_group_scheduler.DefaultTaskRunner()),
|
||||||
@@ -3042,14 +3049,17 @@ Color WebViewImpl::BaseBackgroundColor() const {
|
|||||||
return SK_ColorTRANSPARENT;
|
return SK_ColorTRANSPARENT;
|
||||||
if (base_background_color_override_for_inspector_)
|
if (base_background_color_override_for_inspector_)
|
||||||
return base_background_color_override_for_inspector_.value();
|
return base_background_color_override_for_inspector_.value();
|
||||||
return base_background_color_;
|
// Use the page background color if this is the WebView of the main frame.
|
||||||
|
if (MainFrameImpl())
|
||||||
|
return page_base_background_color_;
|
||||||
|
return Color::kWhite;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebViewImpl::SetBaseBackgroundColor(SkColor color) {
|
void WebViewImpl::SetPageBaseBackgroundColor(absl::optional<SkColor> color) {
|
||||||
if (base_background_color_ == color)
|
SkColor new_color = color.value_or(SK_ColorWHITE);
|
||||||
|
if (page_base_background_color_ == new_color)
|
||||||
return;
|
return;
|
||||||
|
page_base_background_color_ = new_color;
|
||||||
base_background_color_ = color;
|
|
||||||
UpdateBaseBackgroundColor();
|
UpdateBaseBackgroundColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -120,7 +120,8 @@ class CORE_EXPORT WebViewImpl final : public WebView,
|
|||||||
WebViewImpl* opener,
|
WebViewImpl* opener,
|
||||||
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
||||||
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id);
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color);
|
||||||
|
|
||||||
// All calls to Create() should be balanced with a call to Close(). This
|
// All calls to Create() should be balanced with a call to Close(). This
|
||||||
// synchronously destroys the WebViewImpl.
|
// synchronously destroys the WebViewImpl.
|
||||||
@@ -198,7 +199,6 @@ class CORE_EXPORT WebViewImpl final : public WebView,
|
|||||||
WebPagePopupImpl* GetPagePopup() const override { return page_popup_.get(); }
|
WebPagePopupImpl* GetPagePopup() const override { return page_popup_.get(); }
|
||||||
void SetPageFrozen(bool frozen) override;
|
void SetPageFrozen(bool frozen) override;
|
||||||
WebFrameWidget* MainFrameWidget() override;
|
WebFrameWidget* MainFrameWidget() override;
|
||||||
void SetBaseBackgroundColor(SkColor) override;
|
|
||||||
void SetDeviceColorSpaceForTesting(
|
void SetDeviceColorSpaceForTesting(
|
||||||
const gfx::ColorSpace& color_space) override;
|
const gfx::ColorSpace& color_space) override;
|
||||||
void PaintContent(cc::PaintCanvas*, const gfx::Rect&) override;
|
void PaintContent(cc::PaintCanvas*, const gfx::Rect&) override;
|
||||||
@@ -284,6 +284,7 @@ class CORE_EXPORT WebViewImpl final : public WebView,
|
|||||||
const RendererPreferences& preferences) override;
|
const RendererPreferences& preferences) override;
|
||||||
void SetHistoryOffsetAndLength(int32_t history_offset,
|
void SetHistoryOffsetAndLength(int32_t history_offset,
|
||||||
int32_t history_length) override;
|
int32_t history_length) override;
|
||||||
|
void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override;
|
||||||
|
|
||||||
void DispatchPageshow(base::TimeTicks navigation_start);
|
void DispatchPageshow(base::TimeTicks navigation_start);
|
||||||
void DispatchPagehide(mojom::blink::PagehideDispatch pagehide_dispatch);
|
void DispatchPagehide(mojom::blink::PagehideDispatch pagehide_dispatch);
|
||||||
@@ -637,7 +638,8 @@ class CORE_EXPORT WebViewImpl final : public WebView,
|
|||||||
WebViewImpl* opener,
|
WebViewImpl* opener,
|
||||||
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle,
|
||||||
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
scheduler::WebAgentGroupScheduler& agent_group_scheduler,
|
||||||
const SessionStorageNamespaceId& session_storage_namespace_id);
|
const SessionStorageNamespaceId& session_storage_namespace_id,
|
||||||
|
absl::optional<SkColor> page_base_background_color);
|
||||||
~WebViewImpl() override;
|
~WebViewImpl() override;
|
||||||
|
|
||||||
void ConfigureAutoResizeMode();
|
void ConfigureAutoResizeMode();
|
||||||
@@ -825,7 +827,7 @@ class CORE_EXPORT WebViewImpl final : public WebView,
|
|||||||
absl::optional<SkColor> background_color_override_for_fullscreen_controller_;
|
absl::optional<SkColor> background_color_override_for_fullscreen_controller_;
|
||||||
bool override_base_background_color_to_transparent_ = false;
|
bool override_base_background_color_to_transparent_ = false;
|
||||||
absl::optional<SkColor> base_background_color_override_for_inspector_;
|
absl::optional<SkColor> base_background_color_override_for_inspector_;
|
||||||
SkColor base_background_color_ = Color::kWhite;
|
SkColor page_base_background_color_; // Only applies to main frame.
|
||||||
|
|
||||||
float zoom_factor_override_ = 0.f;
|
float zoom_factor_override_ = 0.f;
|
||||||
|
|
||||||
|
@@ -433,7 +433,7 @@ TEST_F(WebViewTest, SetBaseBackgroundColor) {
|
|||||||
WebViewImpl* web_view = web_view_helper_.Initialize();
|
WebViewImpl* web_view = web_view_helper_.Initialize();
|
||||||
EXPECT_EQ(SK_ColorWHITE, web_view->BackgroundColor());
|
EXPECT_EQ(SK_ColorWHITE, web_view->BackgroundColor());
|
||||||
|
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorBLUE);
|
web_view->SetPageBaseBackgroundColor(SK_ColorBLUE);
|
||||||
EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor());
|
EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor());
|
||||||
|
|
||||||
WebURL base_url = url_test_helpers::ToKURL("http://example.com/");
|
WebURL base_url = url_test_helpers::ToKURL("http://example.com/");
|
||||||
@@ -453,11 +453,11 @@ TEST_F(WebViewTest, SetBaseBackgroundColor) {
|
|||||||
// Expected: red (50% alpha) blended atop base of SK_ColorBLUE.
|
// Expected: red (50% alpha) blended atop base of SK_ColorBLUE.
|
||||||
EXPECT_EQ(0xFF80007F, web_view->BackgroundColor());
|
EXPECT_EQ(0xFF80007F, web_view->BackgroundColor());
|
||||||
|
|
||||||
web_view->SetBaseBackgroundColor(kTranslucentPutty);
|
web_view->SetPageBaseBackgroundColor(kTranslucentPutty);
|
||||||
// Expected: red (50% alpha) blended atop kTranslucentPutty. Note the alpha.
|
// Expected: red (50% alpha) blended atop kTranslucentPutty. Note the alpha.
|
||||||
EXPECT_EQ(0xBFE93A31, web_view->BackgroundColor());
|
EXPECT_EQ(0xBFE93A31, web_view->BackgroundColor());
|
||||||
|
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorTRANSPARENT);
|
web_view->SetPageBaseBackgroundColor(SK_ColorTRANSPARENT);
|
||||||
frame_test_helpers::LoadHTMLString(web_view->MainFrameImpl(),
|
frame_test_helpers::LoadHTMLString(web_view->MainFrameImpl(),
|
||||||
"<html><head><style>body "
|
"<html><head><style>body "
|
||||||
"{background-color:transparent}</style></"
|
"{background-color:transparent}</style></"
|
||||||
@@ -494,13 +494,15 @@ TEST_F(WebViewTest, SetBaseBackgroundColorBeforeMainFrame) {
|
|||||||
/*widgets_never_composited=*/false,
|
/*widgets_never_composited=*/false,
|
||||||
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
||||||
web_view_helper_.GetAgentGroupScheduler(),
|
web_view_helper_.GetAgentGroupScheduler(),
|
||||||
/*session_storage_namespace_id=*/base::EmptyString()));
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt));
|
||||||
|
|
||||||
EXPECT_NE(SK_ColorBLUE, web_view->BackgroundColor());
|
EXPECT_NE(SK_ColorBLUE, web_view->BackgroundColor());
|
||||||
// WebView does not have a frame yet, but we should still be able to set the
|
// WebView does not have a frame yet; while it's possible to set the page
|
||||||
// background color.
|
// background color, it won't have any effect until a local main frame is
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorBLUE);
|
// attached.
|
||||||
EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor());
|
web_view->SetPageBaseBackgroundColor(SK_ColorBLUE);
|
||||||
|
EXPECT_NE(SK_ColorBLUE, web_view->BackgroundColor());
|
||||||
|
|
||||||
frame_test_helpers::TestWebFrameClient web_frame_client;
|
frame_test_helpers::TestWebFrameClient web_frame_client;
|
||||||
WebLocalFrame* frame = WebLocalFrame::CreateMainFrame(
|
WebLocalFrame* frame = WebLocalFrame::CreateMainFrame(
|
||||||
@@ -528,7 +530,7 @@ TEST_F(WebViewTest, SetBaseBackgroundColorAndBlendWithExistingContent) {
|
|||||||
WebViewImpl* web_view = web_view_helper_.Initialize();
|
WebViewImpl* web_view = web_view_helper_.Initialize();
|
||||||
|
|
||||||
// Set WebView background to green with alpha.
|
// Set WebView background to green with alpha.
|
||||||
web_view->SetBaseBackgroundColor(kAlphaGreen);
|
web_view->SetPageBaseBackgroundColor(kAlphaGreen);
|
||||||
web_view->GetSettings()->SetShouldClearDocumentBackground(false);
|
web_view->GetSettings()->SetShouldClearDocumentBackground(false);
|
||||||
web_view->MainFrameViewWidget()->Resize(gfx::Size(kWidth, kHeight));
|
web_view->MainFrameViewWidget()->Resize(gfx::Size(kWidth, kHeight));
|
||||||
UpdateAllLifecyclePhases();
|
UpdateAllLifecyclePhases();
|
||||||
@@ -569,7 +571,7 @@ TEST_F(WebViewTest, SetBaseBackgroundColorWithColorScheme) {
|
|||||||
ColorSchemeHelper color_scheme_helper(*(web_view->GetPage()));
|
ColorSchemeHelper color_scheme_helper(*(web_view->GetPage()));
|
||||||
color_scheme_helper.SetPreferredColorScheme(
|
color_scheme_helper.SetPreferredColorScheme(
|
||||||
mojom::blink::PreferredColorScheme::kLight);
|
mojom::blink::PreferredColorScheme::kLight);
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorBLUE);
|
web_view->SetPageBaseBackgroundColor(SK_ColorBLUE);
|
||||||
|
|
||||||
WebURL base_url = url_test_helpers::ToKURL("http://example.com/");
|
WebURL base_url = url_test_helpers::ToKURL("http://example.com/");
|
||||||
frame_test_helpers::LoadHTMLString(
|
frame_test_helpers::LoadHTMLString(
|
||||||
@@ -586,9 +588,9 @@ TEST_F(WebViewTest, SetBaseBackgroundColorWithColorScheme) {
|
|||||||
EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor());
|
EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor());
|
||||||
|
|
||||||
// Don't let dark color-scheme override a transparent background.
|
// Don't let dark color-scheme override a transparent background.
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorTRANSPARENT);
|
web_view->SetPageBaseBackgroundColor(SK_ColorTRANSPARENT);
|
||||||
EXPECT_EQ(Color::kTransparent, frame_view->BaseBackgroundColor());
|
EXPECT_EQ(Color::kTransparent, frame_view->BaseBackgroundColor());
|
||||||
web_view->SetBaseBackgroundColor(SK_ColorBLUE);
|
web_view->SetPageBaseBackgroundColor(SK_ColorBLUE);
|
||||||
EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor());
|
EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor());
|
||||||
|
|
||||||
color_scheme_helper.SetForcedColors(*(web_view->GetPage()),
|
color_scheme_helper.SetForcedColors(*(web_view->GetPage()),
|
||||||
@@ -2740,7 +2742,8 @@ TEST_F(WebViewTest, ClientTapHandlingNullWebViewClient) {
|
|||||||
/*widgets_never_composited=*/false,
|
/*widgets_never_composited=*/false,
|
||||||
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
/*opener=*/nullptr, mojo::NullAssociatedReceiver(),
|
||||||
web_view_helper_.GetAgentGroupScheduler(),
|
web_view_helper_.GetAgentGroupScheduler(),
|
||||||
/*session_storage_namespace_id=*/base::EmptyString()));
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt));
|
||||||
frame_test_helpers::TestWebFrameClient web_frame_client;
|
frame_test_helpers::TestWebFrameClient web_frame_client;
|
||||||
WebLocalFrame* local_frame = WebLocalFrame::CreateMainFrame(
|
WebLocalFrame* local_frame = WebLocalFrame::CreateMainFrame(
|
||||||
web_view, &web_frame_client, nullptr, LocalFrameToken(), nullptr);
|
web_view, &web_frame_client, nullptr, LocalFrameToken(), nullptr);
|
||||||
|
@@ -620,7 +620,8 @@ void WebViewHelper::InitializeWebView(TestWebViewClient* web_view_client,
|
|||||||
/*widgets_never_composited=*/false,
|
/*widgets_never_composited=*/false,
|
||||||
/*opener=*/opener, mojo::NullAssociatedReceiver(),
|
/*opener=*/opener, mojo::NullAssociatedReceiver(),
|
||||||
*agent_group_scheduler_,
|
*agent_group_scheduler_,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString()));
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt));
|
||||||
// This property must be set at initialization time, it is not supported to be
|
// This property must be set at initialization time, it is not supported to be
|
||||||
// changed afterward, and does nothing.
|
// changed afterward, and does nothing.
|
||||||
web_view_->GetSettings()->SetViewportEnabled(viewport_enabled_);
|
web_view_->GetSettings()->SetViewportEnabled(viewport_enabled_);
|
||||||
|
@@ -449,7 +449,7 @@ TEST_P(ScrollbarsTest, TransparentBackgroundUsesDarkOverlayColorTheme) {
|
|||||||
ENABLE_OVERLAY_SCROLLBARS(true);
|
ENABLE_OVERLAY_SCROLLBARS(true);
|
||||||
|
|
||||||
WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600));
|
WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600));
|
||||||
WebView().SetBaseBackgroundColor(SK_ColorTRANSPARENT);
|
WebView().SetPageBaseBackgroundColor(SK_ColorTRANSPARENT);
|
||||||
SimRequest request("https://example.com/test.html", "text/html");
|
SimRequest request("https://example.com/test.html", "text/html");
|
||||||
LoadURL("https://example.com/test.html");
|
LoadURL("https://example.com/test.html");
|
||||||
request.Complete(R"HTML(
|
request.Complete(R"HTML(
|
||||||
|
@@ -26,7 +26,7 @@ class AutoscrollControllerTest : public SimTest {
|
|||||||
TEST_F(AutoscrollControllerTest,
|
TEST_F(AutoscrollControllerTest,
|
||||||
CrashWhenLayoutStopAnimationBeforeScheduleAnimation) {
|
CrashWhenLayoutStopAnimationBeforeScheduleAnimation) {
|
||||||
WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600));
|
WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600));
|
||||||
WebView().SetBaseBackgroundColor(SK_ColorTRANSPARENT);
|
WebView().SetPageBaseBackgroundColor(SK_ColorTRANSPARENT);
|
||||||
SimRequest request("https://example.com/test.html", "text/html");
|
SimRequest request("https://example.com/test.html", "text/html");
|
||||||
LoadURL("https://example.com/test.html");
|
LoadURL("https://example.com/test.html");
|
||||||
request.Complete(R"HTML(
|
request.Complete(R"HTML(
|
||||||
|
@@ -148,7 +148,8 @@ class MAYBE_WebRtcAudioRendererTest : public testing::Test {
|
|||||||
/*opener=*/nullptr,
|
/*opener=*/nullptr,
|
||||||
mojo::NullAssociatedReceiver(),
|
mojo::NullAssociatedReceiver(),
|
||||||
*agent_group_scheduler_,
|
*agent_group_scheduler_,
|
||||||
/*session_storage_namespace_id=*/base::EmptyString())),
|
/*session_storage_namespace_id=*/base::EmptyString(),
|
||||||
|
/*page_base_background_color=*/absl::nullopt)),
|
||||||
web_local_frame_(
|
web_local_frame_(
|
||||||
blink::WebLocalFrame::CreateMainFrame(web_view_,
|
blink::WebLocalFrame::CreateMainFrame(web_view_,
|
||||||
&web_local_frame_client_,
|
&web_local_frame_client_,
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "content/public/browser/web_contents_observer.h"
|
#include "content/public/browser/web_contents_observer.h"
|
||||||
#include "content/public/browser/web_contents_user_data.h"
|
#include "content/public/browser/web_contents_user_data.h"
|
||||||
|
#include "third_party/abseil-cpp/absl/types/optional.h"
|
||||||
#include "ui/android/resources/resource_manager.h"
|
#include "ui/android/resources/resource_manager.h"
|
||||||
#include "ui/android/view_android.h"
|
#include "ui/android/view_android.h"
|
||||||
#include "ui/android/window_android.h"
|
#include "ui/android/window_android.h"
|
||||||
@@ -36,67 +37,6 @@ using base::android::ScopedJavaLocalRef;
|
|||||||
|
|
||||||
namespace weblayer {
|
namespace weblayer {
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// Setting the page's various background color is convoluted and brittle and
|
|
||||||
// buggy. This is code inspired from chromeos views and should be considered
|
|
||||||
// temporary until content API can be fixed to be more robust. This is
|
|
||||||
// effectively only passing 1 bit of information, whether the background color
|
|
||||||
// is fully transparent or not, as the actual color isn't used by anything.
|
|
||||||
class WebContentsSetBackgroundColor
|
|
||||||
: public content::WebContentsObserver,
|
|
||||||
public content::WebContentsUserData<WebContentsSetBackgroundColor> {
|
|
||||||
public:
|
|
||||||
static void Set(content::WebContents* web_contents,
|
|
||||||
SkColor background_color) {
|
|
||||||
if (auto* set = FromWebContents(web_contents)) {
|
|
||||||
set->SetBackgroundColor(background_color);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SupportsUserData::Data takes ownership over the
|
|
||||||
// WebContentsSetBackgroundColor instance and will destroy it when the
|
|
||||||
// WebContents instance is destroyed.
|
|
||||||
web_contents->SetUserData(
|
|
||||||
UserDataKey(), base::WrapUnique(new WebContentsSetBackgroundColor(
|
|
||||||
web_contents, background_color)));
|
|
||||||
}
|
|
||||||
|
|
||||||
~WebContentsSetBackgroundColor() override = default;
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class content::WebContentsUserData<WebContentsSetBackgroundColor>;
|
|
||||||
WebContentsSetBackgroundColor(content::WebContents* web_contents,
|
|
||||||
SkColor color)
|
|
||||||
: content::WebContentsObserver(web_contents), color_(color) {}
|
|
||||||
|
|
||||||
// content::WebContentsObserver:
|
|
||||||
void RenderViewHostChanged(content::RenderViewHost* old_host,
|
|
||||||
content::RenderViewHost* new_host) override {
|
|
||||||
new_host->GetWidget()->GetView()->SetBackgroundColor(color_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetBackgroundColor(SkColor background_color) {
|
|
||||||
if (color_ == background_color)
|
|
||||||
return;
|
|
||||||
|
|
||||||
color_ = background_color;
|
|
||||||
web_contents()
|
|
||||||
->GetRenderViewHost()
|
|
||||||
->GetWidget()
|
|
||||||
->GetView()
|
|
||||||
->SetBackgroundColor(color_);
|
|
||||||
}
|
|
||||||
|
|
||||||
SkColor color_;
|
|
||||||
|
|
||||||
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
|
||||||
};
|
|
||||||
|
|
||||||
WEB_CONTENTS_USER_DATA_KEY_IMPL(WebContentsSetBackgroundColor)
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
ContentViewRenderView::ContentViewRenderView(JNIEnv* env,
|
ContentViewRenderView::ContentViewRenderView(JNIEnv* env,
|
||||||
jobject obj,
|
jobject obj,
|
||||||
gfx::NativeWindow root_window)
|
gfx::NativeWindow root_window)
|
||||||
@@ -136,11 +76,8 @@ void ContentViewRenderView::SetCurrentWebContents(
|
|||||||
InitCompositor();
|
InitCompositor();
|
||||||
content::WebContents* web_contents =
|
content::WebContents* web_contents =
|
||||||
content::WebContents::FromJavaWebContents(jweb_contents);
|
content::WebContents::FromJavaWebContents(jweb_contents);
|
||||||
if (web_contents_) {
|
if (web_contents_)
|
||||||
WebContentsSetBackgroundColor::Set(
|
web_contents_->SetPageBaseBackgroundColor(absl::nullopt);
|
||||||
web_contents_,
|
|
||||||
Java_ContentViewRenderView_getBackgroundColor(env, java_obj_));
|
|
||||||
}
|
|
||||||
if (web_contents_layer_)
|
if (web_contents_layer_)
|
||||||
web_contents_layer_->RemoveFromParent();
|
web_contents_layer_->RemoveFromParent();
|
||||||
|
|
||||||
@@ -271,12 +208,9 @@ void ContentViewRenderView::InitCompositor() {
|
|||||||
void ContentViewRenderView::UpdateWebContentsBaseBackgroundColor() {
|
void ContentViewRenderView::UpdateWebContentsBaseBackgroundColor() {
|
||||||
if (!web_contents_)
|
if (!web_contents_)
|
||||||
return;
|
return;
|
||||||
JNIEnv* env = base::android::AttachCurrentThread();
|
web_contents_->SetPageBaseBackgroundColor(
|
||||||
WebContentsSetBackgroundColor::Set(
|
use_transparent_background_ ? absl::make_optional(SK_ColorTRANSPARENT)
|
||||||
web_contents_,
|
: absl::nullopt);
|
||||||
use_transparent_background_
|
|
||||||
? SK_ColorTRANSPARENT
|
|
||||||
: Java_ContentViewRenderView_getBackgroundColor(env, java_obj_));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace weblayer
|
} // namespace weblayer
|
||||||
|
Reference in New Issue
Block a user