Skip to content

Commit

Permalink
Add a flag for for controlling Canvas resource when its in background
Browse files Browse the repository at this point in the history
Adding a flag to control canvas resource management: when it's enabled,
the canvas context frees its resource to save memory when it's running
in the background; and it restores its resource when it is in focus
again.

Bug:1268146

Change-Id: Ie0e0094357412a73d0a2f96d953a474110153b58
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3268231
Commit-Queue: Yi Xu <yiyix@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: Juanmi Huertas <juanmihd@chromium.org>
Reviewed-by: Fernando Serboncini <fserb@chromium.org>
Cr-Commit-Position: refs/heads/main@{#940698}
  • Loading branch information
yiyix authored and Chromium LUCI CQ committed Nov 11, 2021
1 parent 10a610d commit bee4563
Show file tree
Hide file tree
Showing 17 changed files with 52 additions and 0 deletions.
5 changes: 5 additions & 0 deletions chrome/browser/about_flags.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6603,6 +6603,11 @@ const FeatureEntry kFeatureEntries[] = {
flag_descriptions::kCanvas2DLayersDescription, kOsAll,
SINGLE_VALUE_TYPE(switches::kEnableCanvas2DLayers)},

{"enable-canvas-context-lost-in-background",
flag_descriptions::kEnableCanvasContextLostInBackgroundName,
flag_descriptions::kEnableCanvasContextLostInBackgroundDescription, kOsAll,
SINGLE_VALUE_TYPE(switches::kEnableCanvasContextLostInBackground)},

{"new-canvas-2d-api", flag_descriptions::kNewCanvas2DAPIName,
flag_descriptions::kNewCanvas2DAPIDescription, kOsAll,
SINGLE_VALUE_TYPE(switches::kEnableNewCanvas2DAPI)},
Expand Down
5 changes: 5 additions & 0 deletions chrome/browser/flag-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -1505,6 +1505,11 @@
"owners": ["ydago"],
"expiry_milestone": 99
},
{
"name": "enable-canvas-context-lost-in-background",
"owners": [ "chrome-canvas@google.com" ],
"expiry_milestone": 100
},
{
"name": "enable-cascade-layers",
"owners": [ "xiaochengh" ],
Expand Down
5 changes: 5 additions & 0 deletions chrome/browser/flag_descriptions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,11 @@ const char kDownloadRangeName[] = "Enable download range support";
const char kDownloadRangeDescription[] =
"Enables arbitrary download range request support.";

const char kEnableCanvasContextLostInBackgroundName[] =
"Enable canvas context to be lost in background";
const char kEnableCanvasContextLostInBackgroundDescription[] =
"Enable canvas context to be cleared when it is running in background";

const char kEnableLayoutNGName[] = "Enable LayoutNG";
const char kEnableLayoutNGDescription[] =
"Enable Blink's next generation layout engine.";
Expand Down
3 changes: 3 additions & 0 deletions chrome/browser/flag_descriptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -630,6 +630,9 @@ extern const char kDownloadProgressMessageDescription[];
extern const char kDownloadRangeName[];
extern const char kDownloadRangeDescription[];

extern const char kEnableCanvasContextLostInBackgroundName[];
extern const char kEnableCanvasContextLostInBackgroundDescription[];

extern const char kEnableFencedFramesName[];
extern const char kEnableFencedFramesDescription[];

Expand Down
4 changes: 4 additions & 0 deletions content/browser/web_contents/web_contents_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2631,6 +2631,10 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences() {
prefs.canvas_2d_layers_enabled =
command_line.HasSwitch(switches::kEnableCanvas2DLayers) ||
base::FeatureList::IsEnabled(features::kEnableCanvas2DLayers);
prefs.canvas_context_lost_in_background_enabled =
command_line.HasSwitch(switches::kEnableCanvasContextLostInBackground) ||
base::FeatureList::IsEnabled(
features::kEnableCanvasContextLostInBackground);
prefs.new_canvas_2d_api_enabled =
command_line.HasSwitch(switches::kEnableNewCanvas2DAPI) ||
base::FeatureList::IsEnabled(features::kEnableNewCanvas2DAPI);
Expand Down
4 changes: 4 additions & 0 deletions content/public/common/content_features.cc
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,10 @@ const base::Feature kEmbeddingRequiresOptIn{"EmbeddingRequiresOptIn",
const base::Feature kEnableCanvas2DLayers{"EnableCanvas2DLayers",
base::FEATURE_DISABLED_BY_DEFAULT};

// Enables canvas context to clear context when it's running in background.
const base::Feature kEnableCanvasContextLostInBackground{
"EnableCanvasContextLostInBackground", base::FEATURE_DISABLED_BY_DEFAULT};

// Enables new canvas 2d api features. Enabled either with either
// enable-experimental-canvas-features or new-canvas-2d-api runtime flags
const base::Feature kEnableNewCanvas2DAPI{"EnableNewCanvas2DAPI",
Expand Down
1 change: 1 addition & 0 deletions content/public/common/content_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ CONTENT_EXPORT extern const base::Feature kDocumentPolicyNegotiation;
CONTENT_EXPORT extern const base::Feature kEarlyHintsPreloadForNavigation;
CONTENT_EXPORT extern const base::Feature kEmbeddingRequiresOptIn;
CONTENT_EXPORT extern const base::Feature kEnableCanvas2DLayers;
CONTENT_EXPORT extern const base::Feature kEnableCanvasContextLostInBackground;
CONTENT_EXPORT extern const base::Feature kEnableNewCanvas2DAPI;
CONTENT_EXPORT extern const base::Feature kEnumerateDevicesHideDeviceIDs;
CONTENT_EXPORT extern const base::Feature kExperimentalAccessibilityLabels;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ GetSwitchDependentFeatureOverrides(const base::CommandLine& command_line) {
{switches::kEnableExperimentalWebPlatformFeatures,
std::cref(features::kOriginIsolationHeader),
base::FeatureList::OVERRIDE_ENABLE_FEATURE},
{switches::kEnableExperimentalWebPlatformFeatures,
std::cref(features::kEnableCanvasContextLostInBackground),
base::FeatureList::OVERRIDE_ENABLE_FEATURE},
{switches::kEnableExperimentalWebPlatformFeatures,
std::cref(features::kEnableNewCanvas2DAPI),
base::FeatureList::OVERRIDE_ENABLE_FEATURE},
Expand Down
4 changes: 4 additions & 0 deletions content/public/common/content_switches.cc
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ const char kDisableAccelerated2dCanvas[] = "disable-accelerated-2d-canvas";
// Enable in-progress canvas 2d API methods BeginLayer and EndLayer.
const char kEnableCanvas2DLayers[] = "canvas-2d-layers";

// Enables canvas to clear its context when it is running in background.
const char kEnableCanvasContextLostInBackground[] =
"enable-canvas-context-lost-in-background";

// Enable in-progress canvas 2d API features.
const char kEnableNewCanvas2DAPI[] = "new-canvas-2d-api";

Expand Down
1 change: 1 addition & 0 deletions content/public/common/content_switches.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ CONTENT_EXPORT extern const char kEnableLCDText[];
CONTENT_EXPORT extern const char kEnableLogging[];
CONTENT_EXPORT extern const char kEnableNetworkInformationDownlinkMax[];
CONTENT_EXPORT extern const char kEnableCanvas2DLayers[];
CONTENT_EXPORT extern const char kEnableCanvasContextLostInBackground[];
CONTENT_EXPORT extern const char kEnableNewCanvas2DAPI[];
CONTENT_EXPORT extern const char kDisableNv12DxgiVideo[];
CONTENT_EXPORT extern const char kEnablePluginPlaceholderTesting[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ bool StructTraits<blink::mojom::WebPreferencesDataView,
out->accelerated_2d_canvas_enabled = data.accelerated_2d_canvas_enabled();
out->new_canvas_2d_api_enabled = data.new_canvas_2d_api_enabled();
out->canvas_2d_layers_enabled = data.canvas_2d_layers_enabled();
out->canvas_context_lost_in_background_enabled =
data.canvas_context_lost_in_background_enabled();
out->antialiased_2d_canvas_disabled = data.antialiased_2d_canvas_disabled();
out->antialiased_clips_2d_canvas_enabled =
data.antialiased_clips_2d_canvas_enabled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ struct BLINK_COMMON_EXPORT WebPreferences {
bool hide_scrollbars;
bool accelerated_2d_canvas_enabled;
bool canvas_2d_layers_enabled = false;
bool canvas_context_lost_in_background_enabled = false;
bool new_canvas_2d_api_enabled;
bool antialiased_2d_canvas_disabled;
bool antialiased_clips_2d_canvas_enabled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ struct BLINK_COMMON_EXPORT StructTraits<blink::mojom::WebPreferencesDataView,
return r.accelerated_2d_canvas_enabled;
}

static bool canvas_context_lost_in_background_enabled(
const blink::web_pref::WebPreferences& r) {
return r.canvas_context_lost_in_background_enabled;
}

static bool new_canvas_2d_api_enabled(
const blink::web_pref::WebPreferences& r) {
return r.new_canvas_2d_api_enabled;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ struct WebPreferences {
bool webgl_errors_to_console_enabled;
bool hide_scrollbars;
bool accelerated_2d_canvas_enabled;
bool canvas_context_lost_in_background_enabled;
bool new_canvas_2d_api_enabled;
bool canvas_2d_layers_enabled;
bool antialiased_2d_canvas_disabled;
Expand Down
4 changes: 4 additions & 0 deletions third_party/blink/renderer/core/exported/web_view_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1486,6 +1486,10 @@ void WebView::ApplyWebPreferences(const web_pref::WebPreferences& prefs,
RuntimeEnabledFeatures::SetAccelerated2dCanvasEnabled(
prefs.accelerated_2d_canvas_enabled);

// Enable canvas to clear its context when it is running in background.
RuntimeEnabledFeatures::SetCanvasContextLostInBackgroundEnabled(
prefs.canvas_context_lost_in_background_enabled);

// Enable new canvas 2d api features
RuntimeEnabledFeatures::SetNewCanvas2DAPIEnabled(
prefs.new_canvas_2d_api_enabled);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,9 @@
name: "CanvasColorManagementV2",
status: "experimental",
},
{
name: "CanvasContextLostInBackground",
},
{
name: "CanvasFormattedText",
status: "experimental",
Expand Down
1 change: 1 addition & 0 deletions tools/metrics/histograms/enums.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50663,6 +50663,7 @@ from previous Chrome versions.
<int value="-446220201" label="EnableIncognitoShortcutOnDesktop:enabled"/>
<int value="-444867364" label="Metal:enabled"/>
<int value="-442352394" label="IframeOneGoogleBar:disabled"/>
<int value="-441508443" label="enable-canvas-context-lost-in-background"/>
<int value="-438379844" label="SwapSideVolumeButtonsForOrientation:enabled"/>
<int value="-436470115" label="TouchpadAndWheelScrollLatching:enabled"/>
<int value="-435914745" label="ClipboardContentSetting:disabled"/>
Expand Down

0 comments on commit bee4563

Please sign in to comment.