From 24e310e8ae7b718c909cd073d3dc36f3cf3f2f03 Mon Sep 17 00:00:00 2001
From: salvadordf <briskbard@briskbard.com>
Date: Wed, 25 Jan 2023 18:06:32 +0100
Subject: [PATCH] Added 2 browser performance properties.

Added TChromiumCore,BatterySaverModeState
Added TChromiumCore,HighEfficiencyMode
---
 source/uCEFChromiumCore.pas | 32 ++++++++++++++++++++++++++++++++
 source/uCEFTypes.pas        | 10 ++++++++++
 update_CEF4Delphi.json      |  2 +-
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/source/uCEFChromiumCore.pas b/source/uCEFChromiumCore.pas
index 2e9dec98..9872828f 100644
--- a/source/uCEFChromiumCore.pas
+++ b/source/uCEFChromiumCore.pas
@@ -143,6 +143,8 @@ type
       FQuicAllowed              : boolean;
       FJavascriptEnabled        : boolean;
       FLoadImagesAutomatically  : boolean;
+      FBatterySaverModeState    : TCefBatterySaverModeState;
+      FHighEfficiencyMode       : TCefState;
 
       {$IFDEF LINUX}
       FXDisplay                 : PXDisplay;
@@ -430,6 +432,8 @@ type
       procedure SetQuicAllowed(aValue : boolean);
       procedure SetJavascriptEnabled(aValue : boolean);
       procedure SetLoadImagesAutomatically(aValue : boolean);
+      procedure SetBatterySaverModeState(aValue : TCefBatterySaverModeState);
+      procedure SetHighEfficiencyMode(aValue : TCefState);
       procedure SetDefaultUrl(const aValue : ustring);
 
       function  CreateBrowserHost(aWindowInfo : PCefWindowInfo; const aURL : ustring; const aSettings : PCefBrowserSettings; const aExtraInfo : ICefDictionaryValue; const aContext : ICefRequestContext): boolean;
@@ -965,6 +969,8 @@ type
       property  QuicAllowed                   : boolean                      read FQuicAllowed                 write SetQuicAllowed;
       property  JavascriptEnabled             : boolean                      read FJavascriptEnabled           write SetJavascriptEnabled;
       property  LoadImagesAutomatically       : boolean                      read FLoadImagesAutomatically     write SetLoadImagesAutomatically;
+      property  BatterySaverModeState         : TCefBatterySaverModeState    read FBatterySaverModeState       write SetBatterySaverModeState;
+      property  HighEfficiencyMode            : TCefState                    read FHighEfficiencyMode          write SetHighEfficiencyMode;
       {$IFDEF LINUX}
       property  XDisplay                      : PXDisplay                    read GetXDisplay;
       {$ENDIF}
@@ -1322,6 +1328,8 @@ begin
   FQuicAllowed             := True;
   FJavascriptEnabled       := True;
   FLoadImagesAutomatically := True;
+  FBatterySaverModeState   := bsmsDefault;
+  FHighEfficiencyMode      := STATE_DEFAULT;
   {$IFDEF LINUX}
   FXDisplay                := nil;
   {$ENDIF}
@@ -2891,6 +2899,24 @@ begin
     end;
 end;
 
+procedure TChromiumCore.SetBatterySaverModeState(aValue : TCefBatterySaverModeState);
+begin
+  if (FBatterySaverModeState <> aValue) then
+    begin
+      FBatterySaverModeState := aValue;
+      FUpdatePreferences     := True;
+    end;
+end;
+
+procedure TChromiumCore.SetHighEfficiencyMode(aValue : TCefState);
+begin
+  if (FHighEfficiencyMode <> aValue) then
+    begin
+      FHighEfficiencyMode := aValue;
+      FUpdatePreferences  := True;
+    end;
+end;
+
 procedure TChromiumCore.SetDefaultUrl(const aValue : ustring);
 begin
   FDefaultUrl := trim(aValue);
@@ -4119,6 +4145,12 @@ begin
   UpdatePreference(aBrowser, 'webkit.webprefs.javascript_enabled',         FJavascriptEnabled);
   UpdatePreference(aBrowser, 'webkit.webprefs.loads_images_automatically', FLoadImagesAutomatically);
 
+  if (FHighEfficiencyMode <> STATE_DEFAULT) then
+    UpdatePreference(aBrowser, 'performance_tuning.high_efficiency_mode.enabled', (FHighEfficiencyMode = STATE_ENABLED));
+
+  if (FBatterySaverModeState <> bsmsDefault) then
+    UpdatePreference(aBrowser, 'performance_tuning.battery_saver_mode.state', integer(FBatterySaverModeState));
+
   if assigned(FOnPrefsUpdated) then
     FOnPrefsUpdated(self);
 end;
diff --git a/source/uCEFTypes.pas b/source/uCEFTypes.pas
index b23880e2..3779d1f8 100644
--- a/source/uCEFTypes.pas
+++ b/source/uCEFTypes.pas
@@ -514,6 +514,16 @@ type
     nlcmEverything
   );
 
+  // Values used by the battery saver mode state preference
+  // https://source.chromium.org/chromium/chromium/src/+/main:components/performance_manager/public/user_tuning/prefs.h
+  TCefBatterySaverModeState = (
+    bsmsDisabled = 0,
+    bsmsEnabledBelowThreshold = 1,
+    bsmsEnabledOnBattery = 2,
+    bsmsEnabled = 3,
+    bsmsDefault = 4 // Custom value used to update the preferences only when there's a non-default value
+  );
+
   // Used by TCEFFileDialogInfo
   TCEFDialogType = (dtOpen, dtOpenMultiple, dtOpenFolder, dtSave);
 
diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json
index 561763f2..a9e8e71a 100644
--- a/update_CEF4Delphi.json
+++ b/update_CEF4Delphi.json
@@ -2,7 +2,7 @@
   "UpdateLazPackages" : [
     {
       "ForceNotify" : true,
-      "InternalVersion" : 457,
+      "InternalVersion" : 458,
       "Name" : "cef4delphi_lazarus.lpk",
       "Version" : "109.1.16"
     }