Skip to content

Commit

Permalink
Add a middle preference between LCD text and compositing
Browse files Browse the repository at this point in the history
When the middle preference (LCDTextPreference::kGoodToHave) is used,
we will still prefer composited scrolling, but will try to preserve
LCD text when possible. In production, the preference comes from
WidgetBase::ComputeLCDTextPreference() (previous
ComputePreferCompositingToLCDText()).

For now the new preference value is the same as kIgnored and is not
used. It will be used in an experiment to pull solid opaque background
color from underlying layers to enable LCD text in layers with
transparent backgrounds.

In most tests the new value will be always the same as kIgnored, so
we keep Settings::SetPreferCompositingToLCDTextForTesting().

Bug: 1353921
Change-Id: I5ae4dc059f6ba99dd074272ff3eb44e88fd93938
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4337728
Reviewed-by: Philip Rogers <pdr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1117778}
  • Loading branch information
wangxianzhu authored and Chromium LUCI CQ committed Mar 15, 2023
1 parent e990959 commit d7eeab6
Show file tree
Hide file tree
Showing 54 changed files with 272 additions and 265 deletions.
9 changes: 8 additions & 1 deletion third_party/blink/common/features.cc
Expand Up @@ -859,7 +859,14 @@ const base::FeatureParam<CheckOfflineCapabilityMode>
// means losing lcd text.
BASE_FEATURE(kPreferCompositingToLCDText,
"PreferCompositingToLCDText",
base::FEATURE_DISABLED_BY_DEFAULT);
// On Android we never have LCD text. On Chrome OS we prefer composited
// scrolling for better scrolling performance.
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);

BASE_FEATURE(kLogUnexpectedIPCPostedToBackForwardCachedDocuments,
"LogUnexpectedIPCPostedToBackForwardCachedDocuments",
Expand Down
3 changes: 2 additions & 1 deletion third_party/blink/public/web/web_settings.h
Expand Up @@ -42,6 +42,7 @@

namespace blink {

enum class LCDTextPreference;
class WebString;

// WebSettings is owned by the WebView and allows code to modify the settings
Expand Down Expand Up @@ -91,7 +92,7 @@ class WebSettings {
virtual bool ShrinksViewportContentToFit() const = 0;
virtual bool ViewportEnabled() const = 0;
virtual void SetAccelerated2dCanvasMSAASampleCount(int) = 0;
virtual void SetPreferCompositingToLCDTextEnabled(bool) = 0;
virtual void SetLCDTextPreference(LCDTextPreference) = 0;
// Not implemented yet, see http://crbug.com/178119
virtual void SetAcceleratedCompositingForTransitionEnabled(bool) {}
// If set to true, allows frames with an https origin to display passive
Expand Down
Expand Up @@ -2256,7 +2256,7 @@ TEST_P(AnimationPendingAnimationsTest,

TEST_P(AnimationAnimationTestCompositing,
ScrollLinkedAnimationNotCompositedIfSourceIsNotComposited) {
GetDocument().GetSettings()->SetPreferCompositingToLCDTextEnabled(false);
SetPreferCompositingToLCDText(false);
SetBodyInnerHTML(R"HTML(
<style>
#scroller { overflow: scroll; width: 100px; height: 100px; }
Expand Down
4 changes: 2 additions & 2 deletions third_party/blink/renderer/core/exported/web_settings_impl.cc
Expand Up @@ -486,8 +486,8 @@ void WebSettingsImpl::SetAntialiasedClips2dCanvasEnabled(bool enabled) {
settings_->SetAntialiasedClips2dCanvasEnabled(enabled);
}

void WebSettingsImpl::SetPreferCompositingToLCDTextEnabled(bool enabled) {
dev_tools_emulator_->SetPreferCompositingToLCDTextEnabled(enabled);
void WebSettingsImpl::SetLCDTextPreference(LCDTextPreference preference) {
dev_tools_emulator_->SetLCDTextPreference(preference);
}

void WebSettingsImpl::SetHideDownloadUI(bool hide) {
Expand Down
Expand Up @@ -53,7 +53,7 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings {
bool ViewportEnabled() const override;
void SetAccelerated2dCanvasMSAASampleCount(int) override;
void SetAutoplayPolicy(mojom::blink::AutoplayPolicy) override;
void SetPreferCompositingToLCDTextEnabled(bool) override;
void SetLCDTextPreference(LCDTextPreference) override;
void SetAccessibilityPasswordValuesEnabled(bool) override;
void SetAllowFileAccessFromFileURLs(bool) override;
void SetAllowCustomScrollbarInMainFrame(bool) override;
Expand Down
10 changes: 4 additions & 6 deletions third_party/blink/renderer/core/exported/web_view_test.cc
Expand Up @@ -3656,14 +3656,12 @@ TEST_F(MiddleClickWebViewTest, MiddleClickAutoscrollCursor) {
web_view_helper_.Reset();
}

static void ConfigueCompositingWebView(WebSettings* settings) {
settings->SetPreferCompositingToLCDTextEnabled(true);
}

TEST_F(WebViewTest, ShowPressOnTransformedLink) {
frame_test_helpers::WebViewHelper web_view_helper;
WebViewImpl* web_view_impl =
web_view_helper.InitializeWithSettings(&ConfigueCompositingWebView);
WebViewImpl* web_view_impl = web_view_helper.Initialize();
web_view_impl->GetPage()
->GetSettings()
.SetPreferCompositingToLCDTextForTesting(true);

int page_width = 640;
int page_height = 480;
Expand Down
18 changes: 4 additions & 14 deletions third_party/blink/renderer/core/frame/browser_controls_test.cc
Expand Up @@ -104,12 +104,8 @@ class BrowserControlsTest : public testing::Test,

static void ConfigureSettings(WebSettings* settings) {
settings->SetJavaScriptEnabled(true);
settings->SetPreferCompositingToLCDTextEnabled(true);
// Android settings
settings->SetViewportEnabled(true);
settings->SetViewportMetaEnabled(true);
settings->SetShrinksViewportContentToFit(true);
settings->SetMainFrameResizesAreOrientationChanges(true);
frame_test_helpers::WebViewHelper::UpdateAndroidCompositingSettings(
settings);
}

void RegisterMockedHttpURLLoad(const std::string& file_name) {
Expand Down Expand Up @@ -196,14 +192,8 @@ class BrowserControlsSimTest : public SimTest {

void SetUp() override {
SimTest::SetUp();

// Use settings that resemble the Android configuration.
WebView().GetSettings()->SetViewportEnabled(true);
WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true);
WebView().GetSettings()->SetViewportMetaEnabled(true);
WebView().GetSettings()->SetViewportEnabled(true);
WebView().GetSettings()->SetMainFrameResizesAreOrientationChanges(true);
WebView().GetSettings()->SetShrinksViewportContentToFit(true);
frame_test_helpers::WebViewHelper::UpdateAndroidCompositingSettings(
WebView().GetSettings());
WebView().SetDefaultPageScaleLimits(0.25f, 5);
Compositor().LayerTreeHost()->UpdateBrowserControlsState(
cc::BrowserControlsState::kBoth, cc::BrowserControlsState::kShown,
Expand Down
9 changes: 9 additions & 0 deletions third_party/blink/renderer/core/frame/frame_test_helpers.cc
Expand Up @@ -474,6 +474,15 @@ WebViewImpl* WebViewHelper::InitializeWithSettings(
return InitializeWithOpener(nullptr, nullptr, nullptr, update_settings_func);
}

// static
void WebViewHelper::UpdateAndroidCompositingSettings(WebSettings* settings) {
settings->SetLCDTextPreference(LCDTextPreference::kIgnored);
settings->SetViewportMetaEnabled(true);
settings->SetViewportEnabled(true);
settings->SetMainFrameResizesAreOrientationChanges(true);
settings->SetShrinksViewportContentToFit(true);
}

WebViewImpl* WebViewHelper::InitializeAndLoad(
const std::string& url,
TestWebFrameClient* web_frame_client,
Expand Down
5 changes: 5 additions & 0 deletions third_party/blink/renderer/core/frame/frame_test_helpers.h
Expand Up @@ -352,6 +352,11 @@ class WebViewHelper : public ScopedMockOverlayScrollbars {
WebViewImpl* InitializeWithSettings(
void (*update_settings_func)(WebSettings*));

WebViewImpl* InitializeWithAndroidSettings() {
return InitializeWithSettings(&UpdateAndroidCompositingSettings);
}
static void UpdateAndroidCompositingSettings(WebSettings*);

// Same as Initialize() but also performs the initial load of the url. Only
// returns once the load is complete.
WebViewImpl* InitializeAndLoad(
Expand Down
4 changes: 2 additions & 2 deletions third_party/blink/renderer/core/frame/local_frame_view.cc
Expand Up @@ -3037,8 +3037,8 @@ void LocalFrameView::PushPaintArtifactToCompositor(bool repainted) {
paint_artifact_compositor_->RootLayer(), &GetFrame());
}

paint_artifact_compositor_->SetPrefersLCDText(
!page->GetSettings().GetPreferCompositingToLCDTextEnabled());
paint_artifact_compositor_->SetLCDTextPreference(
page->GetSettings().GetLCDTextPreference());

SCOPED_UMA_AND_UKM_TIMER(GetUkmAggregator(),
LocalFrameUkmAggregator::kCompositingCommit);
Expand Down
Expand Up @@ -208,8 +208,7 @@ TEST_F(LocalFrameViewTest, CanHaveScrollbarsIfScrollingAttrEqualsNoChanged) {

TEST_F(LocalFrameViewTest,
MainThreadScrollingForBackgroundFixedAttachmentWithCompositing) {
GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled(
true);
SetPreferCompositingToLCDText(true);

SetBodyInnerHTML(R"HTML(
<style>
Expand Down
5 changes: 5 additions & 0 deletions third_party/blink/renderer/core/frame/settings.cc
Expand Up @@ -118,4 +118,9 @@ void Settings::Invalidate(SettingsDelegate::ChangeType change_type) {
delegate_->SettingsChanged(change_type);
}

void Settings::SetPreferCompositingToLCDTextForTesting(bool enabled) {
SetLCDTextPreference(enabled ? LCDTextPreference::kIgnored
: LCDTextPreference::kStronglyPreferred);
}

} // namespace blink
3 changes: 3 additions & 0 deletions third_party/blink/renderer/core/frame/settings.h
Expand Up @@ -43,6 +43,7 @@
#include "third_party/blink/renderer/core/loader/frame_loader_types.h"
#include "third_party/blink/renderer/core/settings_macros.h"
#include "third_party/blink/renderer/platform/fonts/generic_font_family_settings.h"
#include "third_party/blink/renderer/platform/graphics/lcd_text_preference.h"
#include "third_party/blink/renderer/platform/timer.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "ui/base/pointer/pointer_device.h"
Expand All @@ -67,6 +68,8 @@ class CORE_EXPORT Settings {

SETTINGS_GETTERS_AND_SETTERS

void SetPreferCompositingToLCDTextForTesting(bool enabled);

void SetDelegate(SettingsDelegate*);

private:
Expand Down
5 changes: 3 additions & 2 deletions third_party/blink/renderer/core/frame/settings.json5
Expand Up @@ -165,8 +165,9 @@
},

{
name: "preferCompositingToLCDTextEnabled",
initial: false,
name: "LCDTextPreference",
type: "LCDTextPreference",
initial: "LCDTextPreference::kStronglyPreferred",
invalidate: ["AcceleratedCompositing"],
},

Expand Down
62 changes: 18 additions & 44 deletions third_party/blink/renderer/core/frame/visual_viewport_test.cc
Expand Up @@ -78,14 +78,6 @@ ::std::ostream& operator<<(::std::ostream& os, const ContextMenuData& data) {

namespace {

void ConfigureAndroidCompositing(WebSettings* settings) {
settings->SetPreferCompositingToLCDTextEnabled(true);
settings->SetViewportMetaEnabled(true);
settings->SetViewportEnabled(true);
settings->SetMainFrameResizesAreOrientationChanges(true);
settings->SetShrinksViewportContentToFit(true);
}

const cc::EffectNode* GetEffectNode(const cc::Layer* layer) {
return layer->layer_tree_host()->property_trees()->effect_tree().Node(
layer->effect_tree_index());
Expand All @@ -96,19 +88,16 @@ class VisualViewportTest : public testing::Test,
public:
VisualViewportTest() : base_url_("http://www.test.com/") {}

void InitializeWithDesktopSettings(
void (*override_settings_func)(WebSettings*) = nullptr) {
if (!override_settings_func)
override_settings_func = &ConfigureSettings;
helper_.Initialize(nullptr, nullptr, override_settings_func);
void InitializeWithDesktopSettings() {
helper_.InitializeWithSettings(&ConfigureSettings);
WebView()->SetDefaultPageScaleLimits(1, 4);
}

void InitializeWithAndroidSettings(
void (*override_settings_func)(WebSettings*) = nullptr) {
if (!override_settings_func)
override_settings_func = &ConfigureAndroidSettings;
helper_.Initialize(nullptr, nullptr, override_settings_func);
helper_.InitializeWithSettings(override_settings_func);
WebView()->SetDefaultPageScaleLimits(0.25f, 5);
}

Expand Down Expand Up @@ -159,15 +148,13 @@ class VisualViewportTest : public testing::Test,

static void ConfigureSettings(WebSettings* settings) {
settings->SetJavaScriptEnabled(true);
settings->SetPreferCompositingToLCDTextEnabled(true);
settings->SetLCDTextPreference(LCDTextPreference::kIgnored);
}

static void ConfigureAndroidSettings(WebSettings* settings) {
ConfigureSettings(settings);
settings->SetViewportEnabled(true);
settings->SetViewportMetaEnabled(true);
settings->SetShrinksViewportContentToFit(true);
settings->SetMainFrameResizesAreOrientationChanges(true);
frame_test_helpers::WebViewHelper::UpdateAndroidCompositingSettings(
settings);
}

const DisplayItemClient& ScrollingBackgroundClient(const Document* document) {
Expand Down Expand Up @@ -1592,7 +1579,7 @@ TEST_P(VisualViewportTest, TestTopControlHidingResizeDoesntClampMainFrame) {
EXPECT_EQ(500, frame_view.LayoutViewport()->GetScrollOffset().y());
}

static void configureHiddenScrollbarsSettings(WebSettings* settings) {
static void ConfigureHiddenScrollbarsSettings(WebSettings* settings) {
VisualViewportTest::ConfigureAndroidSettings(settings);
settings->SetHideScrollbars(true);
}
Expand All @@ -1601,7 +1588,7 @@ static void configureHiddenScrollbarsSettings(WebSettings* settings) {
// layer when hideScrollbars WebSetting is true.
TEST_P(VisualViewportTest,
TestScrollbarsNotAttachedWhenHideScrollbarsSettingIsTrue) {
InitializeWithAndroidSettings(configureHiddenScrollbarsSettings);
InitializeWithAndroidSettings(ConfigureHiddenScrollbarsSettings);
WebView()->MainFrameViewWidget()->Resize(gfx::Size(100, 150));
NavigateTo("about:blank");

Expand Down Expand Up @@ -1703,8 +1690,7 @@ TEST_P(VisualViewportTest, ElementBoundsInWidgetSpaceAccountsForViewport) {
// Test that the various window.scroll and document.body.scroll properties and
// methods don't change with the visual viewport.
TEST_P(VisualViewportTest, visualViewportIsInert) {
WebViewImpl* web_view_impl =
helper_.InitializeWithSettings(&ConfigureAndroidCompositing);
WebViewImpl* web_view_impl = helper_.InitializeWithAndroidSettings();

web_view_impl->MainFrameViewWidget()->Resize(gfx::Size(200, 300));

Expand Down Expand Up @@ -2023,8 +2009,7 @@ TEST_P(VisualViewportTest, ResizeWithScrollAnchoring) {
// Make sure a composited background-attachment:fixed background gets resized
// by browser controls.
TEST_P(VisualViewportTest, ResizeCompositedAndFixedBackground) {
WebViewImpl* web_view_impl =
helper_.InitializeWithSettings(&ConfigureAndroidCompositing);
WebViewImpl* web_view_impl = helper_.InitializeWithAndroidSettings();

int page_width = 640;
int page_height = 480;
Expand Down Expand Up @@ -2085,19 +2070,16 @@ TEST_P(VisualViewportTest, ResizeCompositedAndFixedBackground) {
EXPECT_EQ(page_height, background_layer->bounds().height());
}

static void ConfigureAndroidNonCompositing(WebSettings* settings) {
settings->SetPreferCompositingToLCDTextEnabled(false);
settings->SetViewportMetaEnabled(true);
settings->SetViewportEnabled(true);
settings->SetMainFrameResizesAreOrientationChanges(true);
settings->SetShrinksViewportContentToFit(true);
static void ConfigureViewportNonCompositing(WebSettings* settings) {
frame_test_helpers::WebViewHelper::UpdateAndroidCompositingSettings(settings);
settings->SetLCDTextPreference(LCDTextPreference::kStronglyPreferred);
}

// Make sure a non-composited background-attachment:fixed background gets
// resized by browser controls.
TEST_P(VisualViewportTest, ResizeNonCompositedAndFixedBackground) {
WebViewImpl* web_view_impl =
helper_.InitializeWithSettings(&ConfigureAndroidNonCompositing);
helper_.InitializeWithSettings(&ConfigureViewportNonCompositing);

int page_width = 640;
int page_height = 480;
Expand Down Expand Up @@ -2173,8 +2155,7 @@ TEST_P(VisualViewportTest, ResizeNonCompositedAndFixedBackground) {
// Make sure a browser control resize with background-attachment:not-fixed
// background doesn't cause invalidation or layout.
TEST_P(VisualViewportTest, ResizeNonFixedBackgroundNoLayoutOrInvalidation) {
WebViewImpl* web_view_impl =
helper_.InitializeWithSettings(&ConfigureAndroidCompositing);
WebViewImpl* web_view_impl = helper_.InitializeWithAndroidSettings();

int page_width = 640;
int page_height = 480;
Expand Down Expand Up @@ -2234,8 +2215,7 @@ TEST_P(VisualViewportTest, ResizeNonFixedBackgroundNoLayoutOrInvalidation) {
}

TEST_P(VisualViewportTest, InvalidateLayoutViewWhenDocumentSmallerThanView) {
WebViewImpl* web_view_impl =
helper_.InitializeWithSettings(&ConfigureAndroidCompositing);
WebViewImpl* web_view_impl = helper_.InitializeWithAndroidSettings();

int page_width = 320;
int page_height = 590;
Expand Down Expand Up @@ -2423,14 +2403,8 @@ class VisualViewportSimTest : public SimTest {

void SetUp() override {
SimTest::SetUp();

// Use settings that resemble the Android configuration.
WebView().GetSettings()->SetViewportEnabled(true);
WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true);
WebView().GetSettings()->SetViewportMetaEnabled(true);
WebView().GetSettings()->SetViewportEnabled(true);
WebView().GetSettings()->SetMainFrameResizesAreOrientationChanges(true);
WebView().GetSettings()->SetShrinksViewportContentToFit(true);
frame_test_helpers::WebViewHelper::UpdateAndroidCompositingSettings(
WebView().GetSettings());
WebView().SetDefaultPageScaleLimits(0.25f, 5);
}
};
Expand Down

0 comments on commit d7eeab6

Please sign in to comment.