diff --git a/DEPS b/DEPS
index 1dbaa8c..8685304e 100644
--- a/DEPS
+++ b/DEPS
@@ -269,15 +269,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '0d8b218f8a386d24d3d201a9ae777b3fc084db38',
+  'skia_revision': 'ade84dfd2ba50aa910795a31950a42cefe4a7714',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '781bcedfd4ee8c4a4bd4833cb75978d95ed94111',
+  'v8_revision': 'cec7cfa9ac675ef3c86296896674570dd816c41f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '7c83a3635d623f090b94b6bdaaad9152fede12f3',
+  'angle_revision': '0b808c746bea851ad019ef8d7fd7aa34ce2b2f62',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -296,7 +296,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:8.20220520.3.1',
+  'fuchsia_version': 'version:8.20220521.2.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -348,7 +348,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'a5ce614e758c3118066c897ddfae0edbecbc24f4',
+  'devtools_frontend_revision': '4b7f2a3663c47280daf44e4d60e3c3a172613d36',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -384,7 +384,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'a526167e33e6fdf20b3f9be0d13174b865920896',
+  'dawn_revision': '5f61c95432f21dcf99dc59ad77630ea64efe2834',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -835,7 +835,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': '79ZN8L75FFIYtiTYJz0ilae5dAq_Km48MVsmKgXPY-sC',
+          'version': 'byW5IwCA9MZn7u59y_fcNqsTMpbPHUKhxL2CcolMhywC',
         },
       ],
       'dep_type': 'cipd',
@@ -846,7 +846,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'ta6nxI3qrfAk25FIVNsQrXPCjISppdZFQfrGFxnz2-0C',
+          'version': 'WLcaYvLH15S4FYVyzBLSE7TjQEkoJHrwpcnkz8M3DWgC',
         },
       ],
       'dep_type': 'cipd',
@@ -857,7 +857,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': '6TtNEdyDje9URyPKgFrc6HoKgvyx5VKqQfyhnZY2zdMC',
+          'version': 'y_dYgAtQXtgp8OHN_Pwz84lSnT55UbBwnSXXWeWUO_sC',
         },
       ],
       'dep_type': 'cipd',
@@ -914,7 +914,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'RB0mb2ryaZJKy878dbB61Agwpxw3Qbz87u7kfIPB1oQC',
+          'version': 'JVe-7SbZN2lqYNmr2LZ9NtrPjnRVHj0HCbGLNQi6tswC',
       },
     ],
     'condition': 'checkout_android',
@@ -1133,7 +1133,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0e9a7d264340ded17db0c991d27da74d78a0719f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2f988479fb9e31a59f935054d5f230748ed526f4',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1666,7 +1666,7 @@
       'condition': 'checkout_android',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@aef219516acf143e0c3c91f1bd660c0ce19962be',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@82a65519c521de4851dd8ba67e202cd11b4061e0',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1699,13 +1699,13 @@
     Var('chromium_git') + '/external/github.com/SeleniumHQ/selenium/py.git' + '@' + 'd0045ec570c1a77612db35d1e92f05e1d27b4d53',
 
   'src/third_party/webgl/src':
-    Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'd4d598789af1e73a1bdd6c9eec246e75ff43551a',
+    Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'bb289ce3cb15bbabd42fdcb01439367846d9069d',
 
   'src/third_party/webgpu-cts/src':
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9618103c4aa25ea342ddad65848ff8bb0c1cee9a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fc412ed8535079b65168dc9f1dbc3dbf9fccd161',
+    Var('webrtc_git') + '/src.git' + '@' + '3f6c634394d8f5422342cc1bdd23ab5a540fc42a',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1778,7 +1778,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@dba172f98a44c007e565ccb1f719a639090448a1',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@471a977d1cc353c0c93a15b7f300e6955cadcc3b',
     'condition': 'checkout_src_internal',
   },
 
@@ -1797,7 +1797,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'WFd9ZH0_iotkBxugQh6X3U2S45uwq2RycsFybZZzMZwC',
+        'version': 'TtVR9w4q1StI4bDWt2rovosY0257oWZl9HZ_IuCX7DQC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1808,7 +1808,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'tAdKB7k3kYR1v0dSeQld_Ny08e-NxIwvpRHyhEvn9GgC',
+        'version': 'no6mHC3AL1t_HyZ3lNr95bTa4ef88VuCGWt0b3BxszYC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
index 88eb8fa..6a593836 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
@@ -7146,8 +7146,10 @@
     attribute WAIT_FAILED
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method beginQuery
@@ -7373,6 +7375,8 @@
     method vertexAttribPointer
     method viewport
     method waitSync
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLActiveInfo
     attribute @@toStringTag
     getter name
@@ -7697,8 +7701,10 @@
     attribute VIEWPORT
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method bindAttribLocation
@@ -7836,6 +7842,8 @@
     method vertexAttrib4fv
     method vertexAttribPointer
     method viewport
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLSampler
     attribute @@toStringTag
     method constructor
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 56a747a16..99c9424 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1312,6 +1312,16 @@
 const base::Feature kShelfParty{"ShelfParty",
                                 base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables Shelf Palm Rejection in tablet mode by defining a pixel offset for
+// the swipe gesture to show the extended hotseat.
+const base::Feature kShelfPalmRejectionSwipeOffset{
+    "ShelfPalmRejectionSwipeOffset", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Enables Shelf Palm Rejection in tablet mode by defining a touch area for the
+// swipe gesture to show the extended hotseat.
+const base::Feature kShelfPalmRejectionTouchArea{
+    "ShelfPalmRejectionTouchArea", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables the new shimless rma flow.
 const base::Feature kShimlessRMAFlow{"ShimlessRMAFlow",
                                      base::FEATURE_DISABLED_BY_DEFAULT};
@@ -2192,6 +2202,14 @@
          base::FeatureList::IsEnabled(kShelfLauncherNudge);
 }
 
+bool IsShelfPalmRejectionSwipeOffsetEnabled() {
+  return base::FeatureList::IsEnabled(kShelfPalmRejectionSwipeOffset);
+}
+
+bool IsShelfPalmRejectionTouchAreaEnabled() {
+  return base::FeatureList::IsEnabled(kShelfPalmRejectionTouchArea);
+}
+
 bool IsShimlessRMAFlowEnabled() {
   return base::FeatureList::IsEnabled(kShimlessRMAFlow);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 72111cd..2223936c 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -516,6 +516,10 @@
 extern const base::Feature kShelfGesturesWithVirtualKeyboard;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kShelfLauncherNudge;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kShelfParty;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kShelfPalmRejectionSwipeOffset;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kShelfPalmRejectionTouchArea;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kShimlessRMAFlow;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kShimlessRMAEnableStandalone;
@@ -771,6 +775,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsSettingsAppThemeChangeAnimationEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShelfLauncherNudgeEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShelfPalmRejectionSwipeOffsetEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShelfPalmRejectionTouchAreaEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSimLockPolicyEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShimlessRMAFlowEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShimlessRMAStandaloneAppEnabled();
diff --git a/ash/shelf/hotseat_widget.cc b/ash/shelf/hotseat_widget.cc
index 399a3d3..95fbb71 100644
--- a/ash/shelf/hotseat_widget.cc
+++ b/ash/shelf/hotseat_widget.cc
@@ -1269,4 +1269,26 @@
   SetBounds(target_bounds);
 }
 
+bool HotseatWidget::IsPointWithinGestureTouchArea(
+    const gfx::Point& screen_location) {
+  if (!features::IsShelfPalmRejectionTouchAreaEnabled())
+    return true;
+
+  const int touch_area_width = base::GetFieldTrialParamByFeatureAsInt(
+      features::kShelfPalmRejectionTouchArea, "shelf_touch_area", 100);
+
+  gfx::Rect hotseat_bounds = GetWindowBoundsInScreen();
+
+  if (hotseat_bounds.width() < touch_area_width)
+    return true;
+
+  hotseat_bounds.ClampToCenteredSize(
+      gfx::Size(touch_area_width, hotseat_bounds.height()));
+
+  const int min_x =
+      (hotseat_bounds.width() - touch_area_width) / 2 + hotseat_bounds.x();
+  const int max_x = min_x + touch_area_width;
+  return screen_location.x() >= min_x && screen_location.x() <= max_x;
+}
+
 }  // namespace ash
diff --git a/ash/shelf/hotseat_widget.h b/ash/shelf/hotseat_widget.h
index 121b158..72039ac 100644
--- a/ash/shelf/hotseat_widget.h
+++ b/ash/shelf/hotseat_widget.h
@@ -158,6 +158,11 @@
 
   metrics_util::ReportCallback GetTranslucentBackgroundReportCallback();
 
+  // Verifies if `screen_location` falls within the hotseat widget bounds' touch
+  // area. `screen_location` is expected to be in screen bounds. The hotseat
+  // touch area is the area of the widget that allows to trigger gesture events.
+  bool IsPointWithinGestureTouchArea(const gfx::Point& screen_location);
+
   void SetState(HotseatState state);
   HotseatState state() const { return state_; }
 
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 5f595056..1143944 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -272,6 +272,14 @@
   return active_window && active_window->IsInImmersiveFullscreen();
 }
 
+int GetShelfSwipeOffset() {
+  if (!features::IsShelfPalmRejectionSwipeOffsetEnabled())
+    return 0;
+
+  return base::GetFieldTrialParamByFeatureAsInt(
+      ash::features::kShelfPalmRejectionSwipeOffset, "shelf_swipe_offset", 0);
+}
+
 // Forwards gesture events to ShelfLayoutManager to hide the hotseat
 // when it is kExtended.
 class HotseatEventHandler : public ui::EventHandler,
@@ -2409,6 +2417,12 @@
     return false;
   }
 
+  if (is_tablet_mode &&
+      !shelf_->hotseat_widget()->IsPointWithinGestureTouchArea(
+          event_in_screen.location())) {
+    return false;
+  }
+
   drag_status_ = kDragInProgress;
   drag_auto_hide_state_ =
       (!Shell::Get()->overview_controller()->InOverviewSession() &&
@@ -2434,7 +2448,10 @@
     drag_amount_ = -(shelf_->hotseat_widget()->GetHotseatSize() +
                      ShelfConfig::Get()->hotseat_bottom_padding());
   } else {
-    drag_amount_ = 0.f;
+    // For tablet mode, we allow a certain offset between the drag event offset
+    // and the hotseat location to avoid accidentally extendeing the hotseat in
+    // certain conditions.
+    drag_amount_ = is_tablet_mode ? GetShelfSwipeOffset() : 0;
   }
 
   // If the start location is above the shelf (e.g., on the extended hotseat),
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb
index 08eb20c8..4b6253ef3 100644
--- a/ash/strings/ash_strings_af.xtb
+++ b/ash/strings/ash_strings_af.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Gee tans krag aan <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Spoor foon op</translation>
+<translation id="1287002645302686982">’n Gestoorde lessenaar met die naam <ph name="DESK_TEMPLATE_NAME" /> bestaan reeds</translation>
 <translation id="1289185460362160437">Kom <ph name="COME_BACK_DAY_OF_WEEK" /> om <ph name="COME_BACK_TIME" /> terug.</translation>
 <translation id="1290331692326790741">Swak sein</translation>
 <translation id="1290982764014248209">Skuif <ph name="DRAGGED_APP" /> na vouer <ph name="FOLDER_NAME" />.</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610">Druk Ctrl + W om met <ph name="DESK_NAME" /> te kombineer. Druk Ctrl + Shift + W om lessenaar en vensters toe te maak.</translation>
 <translation id="2595239820337756193">5K in myl</translation>
 <translation id="2596078834055697711">Neem vensterskermkiekie</translation>
+<translation id="2598725286293895280">Ongesteunde programme in lessenaar</translation>
 <translation id="2607678425161541573">Aanlyn aanmelding word vereis</translation>
 <translation id="2620016719323068571">Deursoek jou <ph name="CATEGORY" />, lêers, programme en meer …</translation>
 <translation id="2620436844016719705">Stelsel</translation>
@@ -645,6 +647,7 @@
 <translation id="4734965478015604180">Horisontaal</translation>
 <translation id="4735498845456076464">Die kortpadsleutel <ph name="LAUNCHER_KEY_NAME" /> + syfer het verander. Om funksiesleutels te gebruik, moet jy die <ph name="LAUNCHER_KEY_NAME" />-sleutel + 'n sleutel in die boonste ry druk.</translation>
 <translation id="473775607612524610">Dateer op</translation>
+<translation id="4740516757091333363">Vee gestoorde lessenaar uit?</translation>
 <translation id="4752784485658729358">Net 6 gestoorde lessenaars word toegelaat. Verwyder 'n lessenaar om 'n nuwe een te stoor.</translation>
 <translation id="4759238208242260848">Aflaaie</translation>
 <translation id="4774338217796918551">Kom môre om <ph name="COME_BACK_TIME" /> terug.</translation>
@@ -742,6 +745,7 @@
 <translation id="5352250171825660495">Donkertema is aan</translation>
 <translation id="5356963482258194581">Wissel tussen donker- en ligtema. Regsklik op die werkskerm en kies Muurpapier en Styl.</translation>
 <translation id="5379115545237091094">Te veel pogings</translation>
+<translation id="5391307769715781764">Vervang gestoorde lessenaar?</translation>
 <translation id="5393156353051693207">Raak en hou op enige plek om jou programme te herrangskik</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> bo-oor <ph name="IN_PLACE_APP" />; laat los om vouer te skep.</translation>
 <translation id="5397578532367286026">Gebruiker se gebruik en geskiedenis kan op chrome.com deur die bestuurder (<ph name="MANAGER_EMAIL" />) nagegaan word.</translation>
@@ -975,6 +979,7 @@
 <translation id="6790428901817661496">Speel</translation>
 <translation id="6801878137098616817">Dit is onlangs gewysig</translation>
 <translation id="6803622936009808957">Kon nie skerms weerspieël nie, omdat daar geen gesteunde resolusies gevind kon word nie. Het eerder by uitgebreide skerm ingegaan.</translation>
+<translation id="6812232930908427253">Kon nie lessenaar stoor nie. Te veel vensters of oortjies.</translation>
 <translation id="6818242057446442178">Terug per woord</translation>
 <translation id="6819327813400217281">Kamera is geglip na hoek onder links</translation>
 <translation id="6820676911989879663">Geniet 'n blaaskans!</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index fd8c809..f32853b 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -62,6 +62,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" />ን በማጎላበት ላይ</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">ስልኩን ያግኙ</translation>
+<translation id="1287002645302686982"><ph name="DESK_TEMPLATE_NAME" /> ተብሎ የተሰየመ የተቀመጠ ዴስክ አስቀድሞ አለ</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" /> <ph name="COME_BACK_TIME" /> ላይ ተመልሰው ይምጡ።</translation>
 <translation id="1290331692326790741">ደካማ ሲግናል</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />ን ወደ አቃፊ <ph name="FOLDER_NAME" /> ይውሰዱ።</translation>
@@ -266,6 +267,7 @@
 <translation id="2586561057878260610">ከ<ph name="DESK_NAME" /> ጋር ለማዋሃድ Ctrl + Wን ይጫኑ። ዴስክን እና መስኮቶችን ለመዝጋት Ctrl + Shift + Wን ይጫኑ።</translation>
 <translation id="2595239820337756193">5 ሺሕ በማይሎች</translation>
 <translation id="2596078834055697711">የመስኮት ቅጽበታዊ ገጽ እይታን ያንሱ</translation>
+<translation id="2598725286293895280">በዴስክ ውስጥ የማይደገፉ መተግበሪያዎች</translation>
 <translation id="2607678425161541573">በመስመር ላይ መግባት ያስፈልጋል</translation>
 <translation id="2620016719323068571">የእርስዎን <ph name="CATEGORY" />፣ ፋይሎች፣ መተግበሪያዎች እና ሌሎችን ይፈልጉ...</translation>
 <translation id="2620436844016719705">ስርዓት</translation>
@@ -641,6 +643,7 @@
 <translation id="4734965478015604180">አግድማዊ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + የቁጥር የቁልፍ ሰሌዳ አቋራጭ ተለውጧል። የተግባር ቁልፎችን ለመጠቀም በላይኛው ረድፍ ላይ የ<ph name="LAUNCHER_KEY_NAME" /> ቁልፍ + አንድ ቁልፍ ይጫኑ።</translation>
 <translation id="473775607612524610">አዘምን</translation>
+<translation id="4740516757091333363">የተቀመጠ ዴስክ ይሰረዝ?</translation>
 <translation id="4752784485658729358">የተፈቀደው 6 የተቀመጡ ዴስኮች ብቻ ነው። አዲሱን ለማስቀመጥ አንድ ዴስክ ያስወግዱ።</translation>
 <translation id="4759238208242260848">የወረዱ</translation>
 <translation id="4774338217796918551">ነገ <ph name="COME_BACK_TIME" /> ላይ ተመልሰው ይምጡ።</translation>
@@ -738,6 +741,7 @@
 <translation id="5352250171825660495">ጠቆር ያለ ገጽታ በርቷል</translation>
 <translation id="5356963482258194581">ጠቆር ያለ እና ነጣ ያለ ገጽታ ይቀያይሩ። በዴስክቶፕ ላይ የቀኝ ጠቅታ ያድርጉ ከዚያም ልጣፍ እና ቅጥን ይምረጡ።</translation>
 <translation id="5379115545237091094">በጣም ብዙ ሙከራዎች</translation>
+<translation id="5391307769715781764">የተቀመጠ ዴስክ ይተካ?</translation>
 <translation id="5393156353051693207">መተግበሪያዎችዎን እንደገና ለመደርደር የትኛውም ቦታ ላይ ይንኩ እና ይያዙ</translation>
 <translation id="5395308026110844773">በ<ph name="IN_PLACE_APP" /> ላይ <ph name="DRAGGED_APP_NAME" />፣ አቃፊ ለመፍጠር ይልቀቁት።</translation>
 <translation id="5397578532367286026">የዚህ ተጠቃሚ አጠቃቀም እና ታሪክ በchrome.com ላይ በአስተዳዳሪ (<ph name="MANAGER_EMAIL" />) ሊገመገም ይችላል።</translation>
@@ -971,6 +975,7 @@
 <translation id="6790428901817661496">አጫውት</translation>
 <translation id="6801878137098616817">በቅርቡ አርትዖት የተደረገበት</translation>
 <translation id="6803622936009808957">ምንም የሚደገፉ ጥራቶች ስላልተገኙ ማሳያዎችን ማሳየት አልተቻለም። ይልቁንስ ወደ የተስፋፋ ዴስክቶፕ ሁነታ ተገብቷል።</translation>
+<translation id="6812232930908427253">ዴስክን ማስቀመጥ አልተቻለም። በጣም ብዙ መስኮቶች ወይም ትሮች።</translation>
 <translation id="6818242057446442178">በቃል ይመለሱ</translation>
 <translation id="6819327813400217281">ካሜራ ታችኛው ግራ ጥግ ላይ ገጥሟል</translation>
 <translation id="6820676911989879663">እረፍት ይውሰዱ!</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index da029afd..2ff03a6 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">আপোনাৰ <ph name="DEVICE_TYPE" />ত আপোনাৰ ফ’নৰ শেহতীয়া ফট’ আৰু মিডিয়া চাওক</translation>
 <translation id="1426410128494586442">হয়</translation>
 <translation id="1438357537418863713">এতিয়া এপ্‌ ষ্ট্ৰীমিং ছেট আপ কৰা হৈছে। আপুনি আৰম্ভ কৰাৰ পাছত, শেহতীয়াকৈ লঞ্চ কৰা এপ্‌সমূহ ইয়াত প্ৰদৰ্শিত হ’ব।</translation>
+<translation id="1447641497144572814">স্ক্ৰীন ছেভাৰ আৰম্ভ হয়</translation>
 <translation id="1455242230282523554">ভাষাৰ ছেটিংসমূহ দেখুৱাওক</translation>
 <translation id="1460620680449458626">ভলিউম মিউট কৰা আছে।</translation>
 <translation id="1467432559032391204">বাওঁফালে</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb
index 33c564c..7ab5867 100644
--- a/ash/strings/ash_strings_be.xtb
+++ b/ash/strings/ash_strings_be.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Не паказваць праграмы на паліцы</translation>
 <translation id="2079545284768500474">Адрабіць</translation>
 <translation id="2083190527011054446">Добрай ночы, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">гульні</translation>
 <translation id="209965399369889474">Няма падключэння да сеткі</translation>
 <translation id="2107914222138020205">Ваш кабель USB-C не падыходзіць для выкарыстання з Thunderbolt. Прадукцыйнасць прылады можа быць абмежавана.</translation>
 <translation id="2108303511227308752">Змянілася прызначэнне спалучэння клавіш Alt + Backspace. Каб выканаць дзеянне клавішы Delete, націсніце <ph name="LAUNCHER_KEY_NAME" /> + Backspace.</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 42c90cc..ab4a96192 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Napajanje uređaja <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Lociranje telefona</translation>
+<translation id="1287002645302686982">Već postoji spremljena radna površina pod nazivom <ph name="DESK_TEMPLATE_NAME" /></translation>
 <translation id="1289185460362160437">Vratite se na dan: <ph name="COME_BACK_DAY_OF_WEEK" /> u <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Slab signal</translation>
 <translation id="1290982764014248209">Premjesti aplikaciju <ph name="DRAGGED_APP" /> u folder <ph name="FOLDER_NAME" />.</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610">Pritisnite Ctrl + W da kombinirate s radnom površinom <ph name="DESK_NAME" />. Pritisnite Ctrl + Shift + W da zatvorite radnu površinu i prozore.</translation>
 <translation id="2595239820337756193">5 km u miljama</translation>
 <translation id="2596078834055697711">Napravite snimak ekrana prozora</translation>
+<translation id="2598725286293895280">Nepodržane aplikacije na radnoj površini</translation>
 <translation id="2607678425161541573">Potrebna je online prijava</translation>
 <translation id="2620016719323068571">Pretražite kategoriju <ph name="CATEGORY" />, fajlove, aplikacije i drugo...</translation>
 <translation id="2620436844016719705">Sistem</translation>
@@ -644,6 +646,7 @@
 <translation id="4734965478015604180">Horizontalno</translation>
 <translation id="4735498845456076464">Prečica na tastaturi <ph name="LAUNCHER_KEY_NAME" /> + broj je promijenjena. Da koristite funkcijske tipke, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation>
 <translation id="473775607612524610">Ažuriraj</translation>
+<translation id="4740516757091333363">Želite li izbrisati spremljenu radnu površinu?</translation>
 <translation id="4752784485658729358">Dozvoljeno je samo 6 radnih površina. Uklonite jednu radnu površinu da sačuvate novu.</translation>
 <translation id="4759238208242260848">Preuzimanja</translation>
 <translation id="4774338217796918551">Vratite se sutra u <ph name="COME_BACK_TIME" />.</translation>
@@ -741,6 +744,7 @@
 <translation id="5352250171825660495">Tamna tema je uključena</translation>
 <translation id="5356963482258194581">Prebacite se između tamne i svijetle teme. Kliknite desnim klikom na radnoj površini i odaberite pozadinsku sliku i stil.</translation>
 <translation id="5379115545237091094">Previše pokušaja</translation>
+<translation id="5391307769715781764">Želite li zamijeniti spremljenu radnu površinu?</translation>
 <translation id="5393156353051693207">Dodirnite i zadržite bilo gdje da promijenite redoslijed aplikacija</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> prekriva aplikaciju <ph name="IN_PLACE_APP" />. Pustite da kreirate folder.</translation>
 <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) može pregledavati upotrebu i povijest tog korisnika na web-lokaciji chrome.com.</translation>
@@ -974,6 +978,7 @@
 <translation id="6790428901817661496">Pokreni</translation>
 <translation id="6801878137098616817">Nedavno uređeno</translation>
 <translation id="6803622936009808957">Preslikavanje ekrana nije moguće jer nisu pronađene podržane rezolucije. Umjesto toga, prikazuje se proširena radna površina.</translation>
+<translation id="6812232930908427253">Spremanje radne površine nije uspjelo. Previše prozora ili kartica.</translation>
 <translation id="6818242057446442178">Riječ unazad</translation>
 <translation id="6819327813400217281">Kamera se uklopila u donji lijevi ugao</translation>
 <translation id="6820676911989879663">Odmori se!</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb
index 30a1f95..db02e9d 100644
--- a/ash/strings/ash_strings_cy.xtb
+++ b/ash/strings/ash_strings_cy.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Cuddio apiau yn y silff</translation>
 <translation id="2079545284768500474">Dadwneud</translation>
 <translation id="2083190527011054446">Nos da <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">gemau</translation>
 <translation id="209965399369889474">Heb ei gysylltu â rhwydwaith</translation>
 <translation id="2107914222138020205">Nid yw eich cebl USB-C yn cefnogi Thunderbolt. Mae'n bosib y bydd perfformiad y ddyfais yn gyfyngedig.</translation>
 <translation id="2108303511227308752">Mae'r llwybr byr bysellfwrdd Alt + Backspace wedi newid. I ddefnyddio'r fysell Delete, pwyswch y fysell <ph name="LAUNCHER_KEY_NAME" /> + Backspace.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 4205bc5..ab7fc36 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Skjul apps på hylden</translation>
 <translation id="2079545284768500474">Fortryd</translation>
 <translation id="2083190527011054446">Hej <ph name="GIVEN_NAME" /></translation>
+<translation id="2088116547584365419">spil</translation>
 <translation id="209965399369889474">Der er ingen netværksforbindelse</translation>
 <translation id="2107914222138020205">Dit USB-C-kabel understøtter ikke Thunderbolt. Enhedens ydeevne kan være begrænset.</translation>
 <translation id="2108303511227308752">Tastaturgenvejen Alt+Backspace er blevet ændret. Hvis du vil bruge Delete-knappen, skal du trykke på tasten <ph name="LAUNCHER_KEY_NAME" />+Backspace.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index f4a3690..d2ad515 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Ενεργοποίηση <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Εντοπισμός τηλεφώνου</translation>
+<translation id="1287002645302686982">Υπάρχει ήδη ένα γραφείο με την ονομασία <ph name="DESK_TEMPLATE_NAME" /></translation>
 <translation id="1289185460362160437">Επιστρέψτε ξανά το/τη(ν) <ph name="COME_BACK_DAY_OF_WEEK" /> στις <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Ασθενές σήμα</translation>
 <translation id="1290982764014248209">Μεταφορά της εφαρμογής <ph name="DRAGGED_APP" /> στον φάκελο <ph name="FOLDER_NAME" />.</translation>
@@ -196,6 +197,7 @@
 <translation id="2079504693865562705">Απόκρυψη εφαρμογών στο ράφι</translation>
 <translation id="2079545284768500474">Αναίρεση</translation>
 <translation id="2083190527011054446">Καληνύχτα <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">παιχνίδια</translation>
 <translation id="209965399369889474">Δεν υπάρχει σύνδεση στο δίκτυο</translation>
 <translation id="2107914222138020205">Το καλώδιο USB-C που έχετε δεν υποστηρίζει συσκευές Thunderbolt. Η απόδοση της συσκευής ενδέχεται να είναι περιορισμένη.</translation>
 <translation id="2108303511227308752">Η συντόμευση πληκτρολογίου Alt + Backspace άλλαξε. Για να χρησιμοποιήσετε το πλήκτρο Delete, πατήστε το πλήκτρο <ph name="LAUNCHER_KEY_NAME" /> + backspace.</translation>
@@ -268,6 +270,7 @@
 <translation id="2586561057878260610">Πατήστε Ctrl + W για συνδυασμό με <ph name="DESK_NAME" />. Πατήστε Ctrl + Shift + W για κλείσιμο γραφείου και παραθύρων.</translation>
 <translation id="2595239820337756193">5 χλμ. σε μίλια</translation>
 <translation id="2596078834055697711">Λήψη στιγμιότυπου οθόνης παραθύρου</translation>
+<translation id="2598725286293895280">Μη υποστηριζόμενες εφαρμογές στο γραφείο</translation>
 <translation id="2607678425161541573">Απαιτείται σύνδεση στο διαδίκτυο</translation>
 <translation id="2620016719323068571">Αναζητήστε <ph name="CATEGORY" />, αρχεία, εφαρμογές και άλλα…</translation>
 <translation id="2620436844016719705">Σύστημα</translation>
@@ -643,6 +646,7 @@
 <translation id="4734965478015604180">Οριζόντια περιστροφή</translation>
 <translation id="4735498845456076464">Η συντόμευση πληκτρολογίου <ph name="LAUNCHER_KEY_NAME" /> + Αριθμός άλλαξε. Για να χρησιμοποιήσετε τα πλήκτρα λειτουργιών, πατήστε το πλήκτρο <ph name="LAUNCHER_KEY_NAME" /> + ένα πλήκτρο στην επάνω σειρά.</translation>
 <translation id="473775607612524610">Ενημέρωση</translation>
+<translation id="4740516757091333363">Διαγραφή αποθηκευμένου γραφείου;</translation>
 <translation id="4752784485658729358">Επιτρέπονται μόνο 6 αποθηκευμένα γραφεία. Αφαιρέστε ένα γραφείο για να αποθηκεύσετε ένα νέο.</translation>
 <translation id="4759238208242260848">Λήψεις</translation>
 <translation id="4774338217796918551">Επιστρέψτε ξανά αύριο στις <ph name="COME_BACK_TIME" />.</translation>
@@ -740,6 +744,7 @@
 <translation id="5352250171825660495">Το Σκούρο θέμα είναι ενεργοποιημένο.</translation>
 <translation id="5356963482258194581">Εναλλαγή μεταξύ Σκούρου και Φωτεινού θέματος. Κάντε δεξί κλικ στην επιφάνεια εργασίας και επιλέξτε Ταπετσαρία και στιλ.</translation>
 <translation id="5379115545237091094">Πάρα πολλές προσπάθειες</translation>
+<translation id="5391307769715781764">Αντικατάσταση αποθηκευμένου γραφείου;</translation>
 <translation id="5393156353051693207">Αγγίξτε παρατεταμένα οπουδήποτε για να αναδιατάξετε τις εφαρμογές σας</translation>
 <translation id="5395308026110844773">Η εφαρμογή <ph name="DRAGGED_APP_NAME" /> πάνω από την εφαρμογή <ph name="IN_PLACE_APP" />, αφήστε για να δημιουργήσετε φάκελο.</translation>
 <translation id="5397578532367286026">Ο διαχειριστής (<ph name="MANAGER_EMAIL" />) μπορεί να ελέγξει τη χρήση και το ιστορικό αυτού του χρήστη στη διεύθυνση chrome.com.</translation>
@@ -973,6 +978,7 @@
 <translation id="6790428901817661496">Αναπαραγωγή</translation>
 <translation id="6801878137098616817">Έγινε επεξεργασία πρόσφατα</translation>
 <translation id="6803622936009808957">Δεν ήταν δυνατός ο αντικατοπτρισμός των οθονών καθώς δεν βρέθηκαν υποστηριζόμενες αναλύσεις. Έχει ενεργοποιηθεί εναλλακτικά η εκτεταμένη επιφάνεια εργασίας.</translation>
+<translation id="6812232930908427253">Δεν ήταν δυνατή η αποθήκευση του γραφείου. Πάρα πολλά παράθυρα ή καρτέλες.</translation>
 <translation id="6818242057446442178">Πίσω ανά λέξη</translation>
 <translation id="6819327813400217281">Η προεπισκόπηση κάμερας τοποθετήθηκε στην κάτω αριστερή γωνία</translation>
 <translation id="6820676911989879663">Κάντε ένα διάλειμμα!</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 443455d8..566b05b 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -24,6 +24,7 @@
 <translation id="109942774857561566">I'm bored</translation>
 <translation id="1104084341931202936">Show accessibility settings</translation>
 <translation id="1104621072296271835">Your devices work even better together</translation>
+<translation id="1111021433905331574">You can change the colour of your keyboard backlight in Settings &gt; <ph name="APP_TITLE" /></translation>
 <translation id="112308213915226829">Autohide shelf</translation>
 <translation id="1142002900084379065">Recent photos</translation>
 <translation id="1148499908455722006">Open info dialogue for <ph name="USER_NAME" /></translation>
@@ -96,6 +97,7 @@
 <translation id="1420732223884894666">View your phone's recent photos and media on your <ph name="DEVICE_TYPE" /></translation>
 <translation id="1426410128494586442">Yes</translation>
 <translation id="1438357537418863713">App streaming is now set up. Once you get started, recently launched apps will appear here.</translation>
+<translation id="1447641497144572814">Screen saver starts</translation>
 <translation id="1455242230282523554">Show language settings</translation>
 <translation id="1460620680449458626">Volume is muted.</translation>
 <translation id="1467432559032391204">Left</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 0bc028e..c8210661 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Peida riiulil olevad rakendused</translation>
 <translation id="2079545284768500474">Võta tagasi</translation>
 <translation id="2083190527011054446">Head ööd, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">mänge</translation>
 <translation id="209965399369889474">Pole võrguga ühendatud</translation>
 <translation id="2107914222138020205">Teie USB-C-kaabel ei toeta Thunderbolti. Seadme toimivus võib olla piiratud.</translation>
 <translation id="2108303511227308752">Klaviatuuri otseteed Alt + tagasilükkeklahv on muudetud. Kustutusklahvi kasutamiseks vajutage klahvi <ph name="LAUNCHER_KEY_NAME" /> + tagasilükkeklahvi.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 62d5e9e..5d2e563b 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">پنهان کردن برنامه‌ها در قفسه</translation>
 <translation id="2079545284768500474">لغو</translation>
 <translation id="2083190527011054446">شب‌به‌خیر <ph name="GIVEN_NAME" />،</translation>
+<translation id="2088116547584365419">بازی‌ها</translation>
 <translation id="209965399369889474">به شبکه متصل نیست</translation>
 <translation id="2107914222138020205">‏کابل USB-C شما از Thunderbolt پشتیبانی نمی‌کند. ممکن است عملکرد دستگاه محدود شود.</translation>
 <translation id="2108303511227308752">میان‌بر صفحه‌کلید «دگرساز + پس‌بَر» تغییر کرده است. برای استفاده از کلید «حذف»، کلید «<ph name="LAUNCHER_KEY_NAME" /> + پس‌بَر» را فشار دهید.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index a0d4d3d..d81c8dd 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -195,6 +195,7 @@
 <translation id="2079504693865562705">Piilota sovellukset hyllystä</translation>
 <translation id="2079545284768500474">Kumoa</translation>
 <translation id="2083190527011054446">Hyvää yötä <ph name="GIVEN_NAME" /></translation>
+<translation id="2088116547584365419">pelejä</translation>
 <translation id="209965399369889474">Ei verkkoyhteyttä</translation>
 <translation id="2107914222138020205">USB-C-johto ei tue Thunderboltia. Laitteen toiminta voi olla rajoitettua.</translation>
 <translation id="2108303511227308752">Pikanäppäinyhdistelmä Alt + askelpalautin on muuttunut. Jos haluat käyttää Delete-näppäintä, paina <ph name="LAUNCHER_KEY_NAME" /> + askelpalautin.</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb
index 7c36654..d28c99c 100644
--- a/ash/strings/ash_strings_fr-CA.xtb
+++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -195,6 +195,7 @@
 <translation id="2079504693865562705">Masquer les applications sur l'étagère</translation>
 <translation id="2079545284768500474">Annuler</translation>
 <translation id="2083190527011054446">Bonne nuit <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">jeux</translation>
 <translation id="209965399369889474">Aucune connexion réseau</translation>
 <translation id="2107914222138020205">Votre câble USB-C ne prend pas en charge la norme Thunderbolt. La performance de l'appareil peut être limitée.</translation>
 <translation id="2108303511227308752">Le raccourci-clavier Alt+Retour arrière a changé. Pour utiliser la touche Suppression, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" />+Retour arrière.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index b056695..dad29c0 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Masquer les applis sur l'étagère</translation>
 <translation id="2079545284768500474">Annuler</translation>
 <translation id="2083190527011054446">Bonsoir <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">jeux</translation>
 <translation id="209965399369889474">Aucune connexion réseau</translation>
 <translation id="2107914222138020205">Votre câble USB-C n'est pas compatible Thunderbolt. Cela peut limiter les performances de l'appareil.</translation>
 <translation id="2108303511227308752">Le raccourci clavier Alt+Retour arrière a été modifié. Pour utiliser la touche Supprimer, appuyez sur la touche du <ph name="LAUNCHER_KEY_NAME" />+Retour arrière.</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb
index eb87e81..79705c1 100644
--- a/ash/strings/ash_strings_gl.xtb
+++ b/ash/strings/ash_strings_gl.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Ocultar as aplicacións do estante</translation>
 <translation id="2079545284768500474">Desfacer</translation>
 <translation id="2083190527011054446">Boas noites, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">xogos</translation>
 <translation id="209965399369889474">Non hai conexión á rede</translation>
 <translation id="2107914222138020205">O teu cable USB-C non é compatible con Thunderbolt. O rendemento do dispositivo podería verse limitado.</translation>
 <translation id="2108303511227308752">O atallo de teclado Alt + Retroceso cambiou. Para usar a tecla Suprimir, preme <ph name="LAUNCHER_KEY_NAME" /> + Retroceso.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 534bf89..642a14a 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" />ને પાવર સપ્લાય આપી રહ્યું છે</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">ફોન શોધો</translation>
+<translation id="1287002645302686982"><ph name="DESK_TEMPLATE_NAME" /> નામની સાચવેલી ડેસ્ક પહેલેથી અસ્તિત્વ ધરાવે છે</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" />ના દિવસે <ph name="COME_BACK_TIME" /> વાગ્યે પાછા આવજો.</translation>
 <translation id="1290331692326790741">નબળું સિગ્નલ</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />ને <ph name="FOLDER_NAME" /> ફોલ્ડરમાં ખસેડો.</translation>
@@ -196,6 +197,7 @@
 <translation id="2079504693865562705">શેલ્ફમાં ઍપ છુપાવો</translation>
 <translation id="2079545284768500474">છેલ્લો ફેરફાર રદ કરો</translation>
 <translation id="2083190527011054446">ગુડ નાઇટ <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">ગેમ</translation>
 <translation id="209965399369889474">નેટવર્કથી કનેક્ટ કરેલું નથી</translation>
 <translation id="2107914222138020205">તમારો USB-C કેબલ Thunderboltને સપોર્ટ આપતો નથી. ડિવાઇસનું કાર્યપ્રદર્શન મર્યાદિત હોઈ શકે છે.</translation>
 <translation id="2108303511227308752">Alt કી + Backspace કી કીબોર્ડ શૉર્ટકટ બદલવામાં આવ્યો છે. Delete કીનો ઉપયોગ કરવા માટે <ph name="LAUNCHER_KEY_NAME" /> કી + backspace કી દબાવો.</translation>
@@ -268,6 +270,7 @@
 <translation id="2586561057878260610"><ph name="DESK_NAME" /> સાથે ભેગું કરવા માટે Ctrl + W દબાવો. ડેસ્ક અને વિન્ડો બંધ કરવા માટે Ctrl + Shift + W દબાવો.</translation>
 <translation id="2595239820337756193">5,000 કિલોમીટર એટલે કેટલા માઇલ?</translation>
 <translation id="2596078834055697711">વિંડો સ્ક્રીનશૉટ લો</translation>
+<translation id="2598725286293895280">ડેસ્કમાં અનસપોર્ટેડ ઍપ</translation>
 <translation id="2607678425161541573">ઑનલાઇન સાઇન-ઇન કરવું આવશ્યક છે</translation>
 <translation id="2620016719323068571">તમારી <ph name="CATEGORY" />, ફાઇલો, ઍપ અને બીજું ઘણું શોધો…</translation>
 <translation id="2620436844016719705">સિસ્ટમ</translation>
@@ -643,6 +646,7 @@
 <translation id="4734965478015604180">હોરિઝોન્ટલ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number કીબોર્ડ શૉર્ટકટ બદલવામાં આવ્યો છે. ફંક્શન કીનો ઉપયોગ કરવા માટે, <ph name="LAUNCHER_KEY_NAME" /> કી + ઉપરની પંક્તિ પરની કોઈ એક કી દબાવો.</translation>
 <translation id="473775607612524610">અપડેટ કરો</translation>
+<translation id="4740516757091333363">શું સાચવેલી ડેસ્ક ડિલીટ કરીએ?</translation>
 <translation id="4752784485658729358">માત્ર 6 ડેસ્ક સાચવવાની મંજૂરી છે. કોઈ નવી ડેસ્ક સાચવવા માટે, કોઈ એક ડેસ્ક કાઢી નાખો.</translation>
 <translation id="4759238208242260848">ડાઉનલોડ્સ</translation>
 <translation id="4774338217796918551">આવતી કાલે <ph name="COME_BACK_TIME" /> વાગ્યે પાછા આવજો.</translation>
@@ -740,6 +744,7 @@
 <translation id="5352250171825660495">ઘેરી થીમ ચાલુ છે</translation>
 <translation id="5356963482258194581">ઘેરી અને ઝાંખી થીમ વચ્ચે સ્વિચ કરો. ડેસ્કટૉપ આઇકન પર રાઇટ ક્લિક કરો અને વૉલપેપર અને સ્ટાઇલ પસંદ કરો.</translation>
 <translation id="5379115545237091094">ઘણા બધા પ્રયાસો</translation>
+<translation id="5391307769715781764">શું સાચવેલી ડેસ્ક બદલવી છે?</translation>
 <translation id="5393156353051693207">તમારી ઍપનો ક્રમ બદલવા માટે ગમે ત્યાં ટચ કરીને થોડીવાર દબાવી રાખો</translation>
 <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ની સૌથી ઉપર <ph name="DRAGGED_APP_NAME" /> પર, ફોલ્ડર બનાવવા માટે રિલીઝ કરો.</translation>
 <translation id="5397578532367286026">આ વપરાશકર્તાના ઉપયોગ અને ઇતિહાસની chrome.com પર સંચાલક (<ph name="MANAGER_EMAIL" />) દ્વારા સમીક્ષા કરવામાં આવી શકે છે.</translation>
@@ -973,6 +978,7 @@
 <translation id="6790428901817661496">ચલાવો</translation>
 <translation id="6801878137098616817">તાજેતરમાં ફેરફાર કરવામાં આવ્યો હતો</translation>
 <translation id="6803622936009808957">કોઈ સમર્થિત રિઝોલ્યૂશન મળ્યું ન હોવાથી, પ્રદર્શનોને પ્રતિબિંબિત કરી શકાયા નથી. તેને બદલે વિસ્તૃત ડેસ્કટૉપ દાખલ કર્યું.</translation>
+<translation id="6812232930908427253">ડેસ્ક સાચવી શકાઈ નથી. ઘણી વધુ વિન્ડો કે ટૅબ છે.</translation>
 <translation id="6818242057446442178">એક શબ્દ પાછળ જાઓ</translation>
 <translation id="6819327813400217281">કૅમેરાને નીચેના ડાબા ખૂણામાં સ્નેપ કર્યો</translation>
 <translation id="6820676911989879663">વિરામ લો!</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index dd53ea8..3d345d73 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">अपने फ़ोन में मौजूद हाल ही की फ़ोटो और मीडिया <ph name="DEVICE_TYPE" /> पर देखें</translation>
 <translation id="1426410128494586442">हां</translation>
 <translation id="1438357537418863713">ऐप्लिकेशन स्ट्रीमिंग की सुविधा सेट अप हो गई है. इसे शुरू करने के बाद, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन यहां दिखेंगे.</translation>
+<translation id="1447641497144572814">स्क्रीन सेवर चालू हो रहा है</translation>
 <translation id="1455242230282523554">भाषा सेटिंग दिखाएं</translation>
 <translation id="1460620680449458626">आवाज़ को म्यूट किया गया है.</translation>
 <translation id="1467432559032391204">बाएं</translation>
@@ -197,6 +198,7 @@
 <translation id="2079504693865562705">शेल्फ़ में मौजूद ऐप्लिकेशन छिपाएं</translation>
 <translation id="2079545284768500474">पहले जैसा करें</translation>
 <translation id="2083190527011054446">गुड नाइट <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">गेम</translation>
 <translation id="209965399369889474">नेटवर्क से जुड़ा हुआ नहीं है</translation>
 <translation id="2107914222138020205">आपकी यूएसबी-सी केबल Thunderbolt पर काम नहीं करती है. डिवाइस की परफ़ॉर्मेंस पर बुरा असर पड़ सकता है.</translation>
 <translation id="2108303511227308752">Alt + Backspace कीबोर्ड शॉर्टकट बदल गया है. Delete बटन का इस्तेमाल करने के लिए, <ph name="LAUNCHER_KEY_NAME" /> बटन + backspace दबाएं.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 94acffb..04994f6d 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Napaja <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Lociranje telefona</translation>
+<translation id="1287002645302686982">Već postoji spremljena radna površina pod nazivom <ph name="DESK_TEMPLATE_NAME" /></translation>
 <translation id="1289185460362160437">Vrati se u <ph name="COME_BACK_DAY_OF_WEEK" /> u <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Slab signal</translation>
 <translation id="1290982764014248209">Premjesti aplikaciju <ph name="DRAGGED_APP" /> u mapu <ph name="FOLDER_NAME" />.</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610">Pritisnite Ctrl + W u kombinaciji s radnom površinom <ph name="DESK_NAME" />. Pritisnite Ctrl + Shift + W da biste zatvorili radnu površinu i prozore.</translation>
 <translation id="2595239820337756193">5 km u miljama</translation>
 <translation id="2596078834055697711">Snimanje snimke zaslona prozora</translation>
+<translation id="2598725286293895280">Nepodržane aplikacije na radnoj površini</translation>
 <translation id="2607678425161541573">Potrebna je online prijava</translation>
 <translation id="2620016719323068571">Pretražujte svoje <ph name="CATEGORY" />, datoteke, aplikacije i ostalo...</translation>
 <translation id="2620436844016719705">Sustav</translation>
@@ -644,6 +646,7 @@
 <translation id="4734965478015604180">Vodoravno</translation>
 <translation id="4735498845456076464">Promijenjen je tipkovni prečac <ph name="LAUNCHER_KEY_NAME" /> + broj. Da biste upotrijebili tipke funkcija, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation>
 <translation id="473775607612524610">Ažuriraj</translation>
+<translation id="4740516757091333363">Želite li izbrisati spremljenu radnu površinu?</translation>
 <translation id="4752784485658729358">Dopušteno je samo 6 spremljenih radnih površina. Uklonite jednu radnu površinu da biste spremili novu.</translation>
 <translation id="4759238208242260848">Preuzimanje</translation>
 <translation id="4774338217796918551">Vrati se sutra u <ph name="COME_BACK_TIME" />.</translation>
@@ -741,6 +744,7 @@
 <translation id="5352250171825660495">Tamna tema je uključena</translation>
 <translation id="5356963482258194581">Prebacite se na tamnu ili svijetlu temu. Desnim klikom kliknite radnu površinu i odaberite stavku Pozadine i stilovi.</translation>
 <translation id="5379115545237091094">Previše pokušaja</translation>
+<translation id="5391307769715781764">Želite li zamijeniti spremljenu radnu površinu?</translation>
 <translation id="5393156353051693207">Dodirnite i držite bilo gdje da biste promijenili redoslijed svojih aplikacija</translation>
 <translation id="5395308026110844773">Aplikacija <ph name="DRAGGED_APP_NAME" /> povučena je iznad aplikacije <ph name="IN_PLACE_APP" />. Pustite je da biste izradili mapu.</translation>
 <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) može pregledavati upotrebu i povijest tog korisnika na web-lokaciji chrome.com.</translation>
@@ -974,6 +978,7 @@
 <translation id="6790428901817661496">Reproduciraj</translation>
 <translation id="6801878137098616817">Nedavno uređivano</translation>
 <translation id="6803622936009808957">Nije bilo moguće zrcaliti zaslone jer nije pronađena nijedna podržana razlučivost. Umjesto toga proširena je radna površina.</translation>
+<translation id="6812232930908427253">Spremanje radne površine nije uspjelo. Previše prozora ili kartica.</translation>
 <translation id="6818242057446442178">Riječ unatrag</translation>
 <translation id="6819327813400217281">Kamera je poravnata s donjim lijevim kutom</translation>
 <translation id="6820676911989879663">Odmorite se!</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index 2da6b7cf..25d49b4 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Fela forrit á hillu</translation>
 <translation id="2079545284768500474">Afturkalla</translation>
 <translation id="2083190527011054446">Góða nótt <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">leikjum</translation>
 <translation id="209965399369889474">Engin nettenging</translation>
 <translation id="2107914222138020205">USB-C-snúran styður ekki Thunderbolt. Afköst tækisins kunna að vera takmörkuð.</translation>
 <translation id="2108303511227308752">Flýtilyklinum „Alt + bakklykill“ hefur verið breytt. Ýttu á <ph name="LAUNCHER_KEY_NAME" />-lykilinn + bakklykilinn til að nota Delete-lykilinn.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index ac431aa..92c21c93 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -194,6 +194,7 @@
 <translation id="2079504693865562705">Nascondi app nella barra delle app</translation>
 <translation id="2079545284768500474">Annulla</translation>
 <translation id="2083190527011054446">Buonanotte <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">giochi</translation>
 <translation id="209965399369889474">Nessuna connessione alla rete</translation>
 <translation id="2107914222138020205">Il cavo USB-C non supporta Thunderbolt. Le prestazioni del dispositivo potrebbero essere limitate.</translation>
 <translation id="2108303511227308752">La scorciatoia da tastiera Alt + Backspace è cambiata. Per usare il tasto Canc, premi il tasto <ph name="LAUNCHER_KEY_NAME" /> + Backspace.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index d3bca552..55a8869 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" />を充電中</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">スマートフォンを探す</translation>
+<translation id="1287002645302686982">「<ph name="DESK_TEMPLATE_NAME" />」という名前の保存済みのデスクがすでに存在します</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" />の <ph name="COME_BACK_TIME" /> になったら利用を再開できます。</translation>
 <translation id="1290331692326790741">電波: 弱い</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />をフォルダ<ph name="FOLDER_NAME" />に移動します。</translation>
@@ -270,6 +271,7 @@
 <translation id="2586561057878260610">Ctrl+W キーを押して、<ph name="DESK_NAME" /> と結合します。Ctrl+Shift+W キーを押して、デスクとウィンドウを閉じます。</translation>
 <translation id="2595239820337756193">5 km は何マイル</translation>
 <translation id="2596078834055697711">ウィンドウのスクリーンショットを撮影する</translation>
+<translation id="2598725286293895280">サポートされていないアプリがデスクにあります</translation>
 <translation id="2607678425161541573">オンライン ログインが必要です</translation>
 <translation id="2620016719323068571"><ph name="CATEGORY" />、ファイル、アプリなどを検索...</translation>
 <translation id="2620436844016719705">システム</translation>
@@ -645,6 +647,7 @@
 <translation id="4734965478015604180">横</translation>
 <translation id="4735498845456076464">キーボード ショートカット「<ph name="LAUNCHER_KEY_NAME" />+数字」が変更されました。ファンクション キーを使用するには、<ph name="LAUNCHER_KEY_NAME" />+最上列のキーを押してください。</translation>
 <translation id="473775607612524610">更新</translation>
+<translation id="4740516757091333363">保存済みのデスクを削除しますか?</translation>
 <translation id="4752784485658729358">保存できるデスクは 6 つまでです。新しいデスクを保存するには、デスクを削除してください。</translation>
 <translation id="4759238208242260848">ダウンロード</translation>
 <translation id="4774338217796918551">明日の <ph name="COME_BACK_TIME" /> になったら利用を再開できます。</translation>
@@ -742,6 +745,7 @@
 <translation id="5352250171825660495">ダークモードはオンになっています</translation>
 <translation id="5356963482258194581">ダークモードとライトモードを切り替えます。デスクトップを右クリックして、[壁紙とスタイル] を選択します。</translation>
 <translation id="5379115545237091094">試行回数が上限を超えました</translation>
+<translation id="5391307769715781764">保存済みのデスクを置き換えますか?</translation>
 <translation id="5393156353051693207">任意の場所を長押ししてアプリを並べ替えられます</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" />を<ph name="IN_PLACE_APP" />の上にドラッグしました。指を離すとフォルダが作成されます。</translation>
 <translation id="5397578532367286026">このユーザーの利用状況や履歴は、chrome.com で管理者(<ph name="MANAGER_EMAIL" />)によって確認されます。</translation>
@@ -975,6 +979,7 @@
 <translation id="6790428901817661496">再生</translation>
 <translation id="6801878137098616817">最近編集したファイル</translation>
 <translation id="6803622936009808957">サポートされている解像度が見つからなかったため、ディスプレイをミラーリングできませんでした。代わりに拡張デスクトップ モードに切り替えました。</translation>
+<translation id="6812232930908427253">デスクを保存できませんでした。ウィンドウまたはタブの数が多すぎます。</translation>
 <translation id="6818242057446442178">1 語戻る</translation>
 <translation id="6819327813400217281">カメラは左下にスナップされています</translation>
 <translation id="6820676911989879663">休憩の時間です!</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index 34648622..04baed9 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -198,6 +198,7 @@
 <translation id="2079504693865562705">თაროზე აპების დამალვა</translation>
 <translation id="2079545284768500474">მოქმედების გაუქმება</translation>
 <translation id="2083190527011054446">ღამე მშვიდობის, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">თამაშები</translation>
 <translation id="209965399369889474">ქსელთან კავშირი არ არის</translation>
 <translation id="2107914222138020205">თქვენს USB-C კაბელს არ აქვს Thunderbolt-ის მხარდაჭერა. მოწყობილობის ეფექტურობა შეიძლება შეიზღუდოს.</translation>
 <translation id="2108303511227308752">კლავიატურის მალსახმობი Alt + Backspace შეიცვალა. წაშლის კლავიშით სარგებლობისთვის გამოიყენეთ კლავიშთა კომბინაცია <ph name="LAUNCHER_KEY_NAME" /> + backspace.</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 61db579..5baa92a 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Сөредегі қолданбаларды жасыру</translation>
 <translation id="2079545284768500474">Қайтару</translation>
 <translation id="2083190527011054446">Қайырлы түн, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">ойындар</translation>
 <translation id="209965399369889474">Желіге жалғанбаған.</translation>
 <translation id="2107914222138020205">USB-C кабелі Thunderbolt стандартын қолдамайды. Құрылғының өнімділігі шектелуі мүмкін.</translation>
 <translation id="2108303511227308752">Alt + Backspace пернелер тіркесімінің функциясы өзгерді. Delete пернесінің әрекетін орындау үшін <ph name="LAUNCHER_KEY_NAME" /> пернесі + Backspace пернесі тіркесімін басыңыз.</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index 44bbb4a5..e3e6dcc 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">មើលរូបថត និងមេឌៀថ្មីៗរបស់ទូរសព្ទអ្នកនៅលើ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation>
 <translation id="1426410128494586442">បាទ/ចាស</translation>
 <translation id="1438357537418863713">ឥឡូវនេះ ការផ្សាយកម្មវិធីត្រូវបានរៀបចំហើយ។ នៅពេលអ្នកចាប់ផ្ដើម កម្មវិធីដែលបានចាប់ផ្ដើមថ្មីៗនឹងបង្ហាញនៅទីនេះ។</translation>
+<translation id="1447641497144572814">ធាតុរក្សាអេក្រង់ចាប់ផ្ដើម</translation>
 <translation id="1455242230282523554">បង្ហាញ​ការកំណត់ភាសា</translation>
 <translation id="1460620680449458626">កម្រិតសំឡេង​ត្រូវបានបិទ។</translation>
 <translation id="1467432559032391204">ឆ្វេង</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index ece31a3d..1eb1612 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" /> ಅನ್ನು ಚಾರ್ಜ್ ಮಾಡುತ್ತಿದೆ</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">ಫೋನ್ ಅನ್ನು ಪತ್ತೆ ಹಚ್ಚಿ</translation>
+<translation id="1287002645302686982"><ph name="DESK_TEMPLATE_NAME" /> ಹೆಸರಿನ ಉಳಿಸಿದ ಡೆಸ್ಕ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" /> ರಂದು <ph name="COME_BACK_TIME" /> ಸಮಯಕ್ಕೆ ಹಿಂತಿರುಗಿ.</translation>
 <translation id="1290331692326790741">ದುರ್ಬಲ ಸಿಗ್ನಲ್</translation>
 <translation id="1290982764014248209"><ph name="FOLDER_NAME" /> ಫೋಲ್ಡರ್‌ಗೆ <ph name="DRAGGED_APP" /> ಅನ್ನು ಸರಿಸಿ.</translation>
@@ -196,6 +197,7 @@
 <translation id="2079504693865562705">ಶೆಲ್ಫ್‌ನಲ್ಲಿ ಆ್ಯಪ್‌ಗಳನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="2079545284768500474">ರದ್ದುಮಾಡಿ</translation>
 <translation id="2083190527011054446">ಶುಭ ರಾತ್ರಿ <ph name="GIVEN_NAME" /> ಅವರೇ,</translation>
+<translation id="2088116547584365419">ಗೇಮ್‌ಗಳು</translation>
 <translation id="209965399369889474">ನೆಟ್‌ವರ್ಕ್‌‍ಗೆ ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ</translation>
 <translation id="2107914222138020205">ನಿಮ್ಮ USB-C, Thunderbolt ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಸೀಮಿತವಾಗಿರಬಹುದು.</translation>
 <translation id="2108303511227308752">Alt + Backspace ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ. Delete ಕೀ ಬಳಸಲು, <ph name="LAUNCHER_KEY_NAME" /> ಕೀ + ಬ್ಯಾಕ್‍‍ಸ್ಪೇಸ್ ಅನ್ನು ಒತ್ತಿ.</translation>
@@ -268,6 +270,7 @@
 <translation id="2586561057878260610"><ph name="DESK_NAME" /> ಜೊತೆಗೆ ಸಂಯೋಜಿಸಲು Ctrl + W ಒತ್ತಿರಿ. ಡೆಸ್ಕ್ ಮತ್ತು ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಲು Ctrl + Shift + W ಒತ್ತಿರಿ.</translation>
 <translation id="2595239820337756193">5 ಕಿ.ಮೀ. ಅನ್ನು ಮೈಲಿಗಳಲ್ಲಿ</translation>
 <translation id="2596078834055697711">ವಿಂಡೋ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ</translation>
+<translation id="2598725286293895280">ಡೆಸ್ಕ್‌ನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲದ ಆ್ಯಪ್‌ಗಳಿವೆ</translation>
 <translation id="2607678425161541573">ಆನ್‌ಲೈನ್ ಸೈನ್ ಇನ್‌ನ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="2620016719323068571">ನಿಮ್ಮ <ph name="CATEGORY" />, ಫೈಲ್‌ಗಳು, ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಹುಡುಕಿ...</translation>
 <translation id="2620436844016719705">ಸಿಸ್ಟಂ</translation>
@@ -643,6 +646,7 @@
 <translation id="4734965478015604180">ಅಡ್ಡ</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ಸಂಖ್ಯೆ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಬದಲಿಸಲಾಗಿದೆ. ಫಂಕ್ಷನ್-ಕೀಗಳನ್ನು ಬಳಸಲು, <ph name="LAUNCHER_KEY_NAME" /> ಕೀ + ಮೇಲಿನ ಸಾಲಿನಲ್ಲಿರುವ ಒಂದು ಕೀ ಅನ್ನು ಒತ್ತಿ.</translation>
 <translation id="473775607612524610">ಅಪ್‌ಡೇಟ್‌‌</translation>
+<translation id="4740516757091333363">ಉಳಿಸಿದ ಡೆಸ್ಕ್ ಅನ್ನು ಅಳಿಸಬೇಕೇ?</translation>
 <translation id="4752784485658729358">6 ಉಳಿಸಿದ ಡೆಸ್ಕ್‌ಗಳನ್ನು ಮಾತ್ರ ಅನುಮತಿಸಲಾಗಿದೆ. ಹೊಸದನ್ನು ಉಳಿಸಲು ಡೆಸ್ಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ.</translation>
 <translation id="4759238208242260848">ಡೌನ್‌ಲೋಡ್‌ಗಳು</translation>
 <translation id="4774338217796918551">ನಾಳೆ <ph name="COME_BACK_TIME" /> ಸಮಯಕ್ಕೆ ಹಿಂತಿರುಗಿ.</translation>
@@ -740,6 +744,7 @@
 <translation id="5352250171825660495">ಡಾರ್ಕ್‌ ಥೀಮ್ ಆನ್ ಆಗಿದೆ</translation>
 <translation id="5356963482258194581">ಡಾರ್ಕ್ ಮತ್ತು ಲೈಟ್ ಥೀಮ್‌ಗಳ ನಡುವೆ ಬದಲಿಸಿ. ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ವಾಲ್‌ಪೇಪರ್ &amp; ಸ್ಟೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
 <translation id="5379115545237091094">ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ</translation>
+<translation id="5391307769715781764">ಉಳಿಸಿದ ಡೆಸ್ಕ್ ಅನ್ನು ಬದಲಿಸಬೇಕೇ?</translation>
 <translation id="5393156353051693207">ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳನ್ನು ಮರುಕ್ರಮಗೊಳಿಸಲು ಎಲ್ಲಿಯಾದರೂ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ</translation>
 <translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ <ph name="DRAGGED_APP_NAME" />, ಫೋಲ್ಡರ್ ರಚಿಸಲು ಬಿಡುಗಡೆ ಮಾಡಿ.</translation>
 <translation id="5397578532367286026">ಈ ಬಳಕೆದಾರರ ಬಳಕೆ ಮತ್ತು ಇತಿಹಾಸವನ್ನು chrome.com ನಲ್ಲಿ ನಿರ್ವಾಹಕರು (<ph name="MANAGER_EMAIL" />) ಪರಿಶೀಲಿಸಬಹುದು.</translation>
@@ -974,6 +979,7 @@
 <translation id="6790428901817661496">ಪ್ಲೇ ಮಾಡು</translation>
 <translation id="6801878137098616817">ಇತ್ತೀಚೆಗೆ ಎಡಿಟ್ ಮಾಡಿದ್ದೀರಿ</translation>
 <translation id="6803622936009808957">ಯಾವುದೇ ಬೆಂಬಲಿತ ಪರಿಹಾರಗಳು ಕಂಡುಬರದ ಕಾರಣ ಪ್ರದರ್ಶನಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಲಾಗಲಿಲ್ಲ. ಬದಲಿಗೆ ವಿಸ್ತರಿತ ಡೆಸ್ಕ್‌ಟಾಪ್ ಅನ್ನು ನಮೂದಿಸಲಾಗಿದೆ.</translation>
+<translation id="6812232930908427253">ಡೆಸ್ಕ್ ಅನ್ನು ಉಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಹಲವಾರು ವಿಂಡೋಗಳು ಅಥವಾ ಟ್ಯಾಬ್‌ಗಳು ತೆರೆದುಕೊಂಡಿವೆ.</translation>
 <translation id="6818242057446442178">ಒಂದು ಪದದಷ್ಟು ಹಿಂದಕ್ಕೆ ಹೋಗಿ</translation>
 <translation id="6819327813400217281">ಕ್ಯಾಮರಾವನ್ನು ಕೆಳಗಿನ ಎಡ ಮೂಲೆಯಲ್ಲಿ ಸ್ನ್ಯಾಪ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6820676911989879663">ವಿರಾಮ ತೆಗೆದುಕೊಳ್ಳಿ!</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 75dd66d..83f23dd 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">실행기에서 앱 숨기기</translation>
 <translation id="2079545284768500474">실행취소</translation>
 <translation id="2083190527011054446">편안한 밤 보내세요, <ph name="GIVEN_NAME" />님</translation>
+<translation id="2088116547584365419">게임</translation>
 <translation id="209965399369889474">네트워크에 연결되어 있지 않음</translation>
 <translation id="2107914222138020205">사용 중인 USB-C 케이블은 Thunderbolt를 지원하지 않습니다. 기기 성능이 제한될 수 있습니다.</translation>
 <translation id="2108303511227308752">Alt + Backspace 단축키가 변경되었습니다. Delete 키를 사용하려면 <ph name="LAUNCHER_KEY_NAME" /> 키 + backspace 키를 누르세요.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index e11b522..9f62960 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Текчедеги колдонмолорду жашыруу</translation>
 <translation id="2079545284768500474">Кайтаруу</translation>
 <translation id="2083190527011054446">Түнүңүз бейпил болсун, <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">оюндар</translation>
 <translation id="209965399369889474">Тармакка туташпай турат</translation>
 <translation id="2107914222138020205">USB-C кабелиңиз Thunderbolt түзмөгүн колдоого албайт. Түзмөктүн майнаптуулугу чектелиши мүмкүн.</translation>
 <translation id="2108303511227308752">Alt + Backspace ыкчам баскычы өзгөртүлдү. Delete баскычын колдонуу үчүн <ph name="LAUNCHER_KEY_NAME" /> + backspace баскычтарын басыңыз.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 75d8a36..59934c7 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Slėpti programas lentynoje</translation>
 <translation id="2079545284768500474">Anuliuoti</translation>
 <translation id="2083190527011054446">Labanakt, <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">žaidimai</translation>
 <translation id="209965399369889474">Neprisijungta prie tinklo</translation>
 <translation id="2107914222138020205">USB-C laidas nepalaiko „Thunderbolt“. Įrenginio našumas gali būti apribotas.</translation>
 <translation id="2108303511227308752">Pakeistas spartusis klavišas „Alt“ + naikinimo klavišas. Jei norite naudoti klavišą „Delete“, paspauskite <ph name="LAUNCHER_KEY_NAME" /> klavišą + naikinimo klavišą.</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 6fbfbe6..e39f89f97 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Paslēpt lietotņu joslu</translation>
 <translation id="2079545284768500474">Atsaukt</translation>
 <translation id="2083190527011054446">Arlabunakti, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">spēles</translation>
 <translation id="209965399369889474">Nav savienojuma ar tīklu</translation>
 <translation id="2107914222138020205">Jūsu USB-C vads neatbalsta Thunderbolt. Ierīces veiktspēja var būt ierobežota.</translation>
 <translation id="2108303511227308752">Šie īsinājumtaustiņi ir mainījušies: Alt + atkāpšanās taustiņš. Lai izmantotu dzēšanas taustiņu, nospiediet šos taustiņus: <ph name="LAUNCHER_KEY_NAME" /> + atkāpšanās taustiņš.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb
index f7288af..9edcbb3 100644
--- a/ash/strings/ash_strings_mk.xtb
+++ b/ash/strings/ash_strings_mk.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">Прегледувајте ги неодамнешните фотографии и аудиовизуелни содржини од телефонот на вашиот <ph name="DEVICE_TYPE" /></translation>
 <translation id="1426410128494586442">Да</translation>
 <translation id="1438357537418863713">Стримингот на апликации е поставен. Штом ќе започнете, неодамна отворените апликации ќе се појавуваат тука.</translation>
+<translation id="1447641497144572814">Заштитникот на екран започнува</translation>
 <translation id="1455242230282523554">Прикажи ги поставките за јазикот</translation>
 <translation id="1460620680449458626">Звукот е исклучен.</translation>
 <translation id="1467432559032391204">Лево</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 8ed8c0eb..0418041 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666"><ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ നിങ്ങളുടെ ഫോണിന്റെ പുതിയ ഫോട്ടോകളും മീഡിയയും കാണുക</translation>
 <translation id="1426410128494586442">അതെ</translation>
 <translation id="1438357537418863713">ഇപ്പോൾ ആപ്പ് സ്ട്രീമിംഗ് സജ്ജീകരിച്ചിരിക്കുന്നു. നിങ്ങൾ ആരംഭിച്ചാൽ, അടുത്തിടെ ലോഞ്ച് ചെയ്ത ആപ്പുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
+<translation id="1447641497144572814">സ്ക്രീൻ സേവർ ആരംഭിക്കുന്നു</translation>
 <translation id="1455242230282523554">ഭാഷാ ക്രമീകരണം കാണിക്കുക</translation>
 <translation id="1460620680449458626">വോളിയം മ്യൂട്ട് ചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="1467432559032391204">ഇടത്</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index 79c4e5c..b2659470 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" />-г цэнэглэж байна</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Утасны байршил тогтоох</translation>
+<translation id="1287002645302686982"><ph name="DESK_TEMPLATE_NAME" /> нэртэй хадгалсан дэлгэц аль хэдийн байна</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" />-н <ph name="COME_BACK_TIME" />-д буцаж ирнэ үү.</translation>
 <translation id="1290331692326790741">Муу дохио</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />-г <ph name="FOLDER_NAME" /> фолдерт зөөнө.</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610"><ph name="DESK_NAME" />-тай нэгтгэхийн тулд Ctrl + W дээр дарна уу. Дэлгэц болон цонхыг хаахын тулд Ctrl + Shift + W дээр дарна уу.</translation>
 <translation id="2595239820337756193">5 км милиэр</translation>
 <translation id="2596078834055697711">Цонхны дэлгэцийн зургийг дарах</translation>
+<translation id="2598725286293895280">Дэлгэц дээрх дэмжигдээгүй аппууд</translation>
 <translation id="2607678425161541573">Онлайнаар нэвтрэх шаардлагатай</translation>
 <translation id="2620016719323068571"><ph name="CATEGORY" />, файлууд, аппууд болон бусад зүйлээ хайгаарай...</translation>
 <translation id="2620436844016719705">Систем</translation>
@@ -645,6 +647,7 @@
 <translation id="4734965478015604180">Хөндлөн</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Тоон товчлуурын шууд холбоосыг өөрчилсөн байна. Функцийн товчлууруудыг ашиглахын тулд <ph name="LAUNCHER_KEY_NAME" /> товчлуур + дээд мөрд байх товчлуурыг дарна уу.</translation>
 <translation id="473775607612524610">Шинэчлэх</translation>
+<translation id="4740516757091333363">Хадгалсан дэлгэцийг устгах уу?</translation>
 <translation id="4752784485658729358">Зөвхөн 6 хадгалсан дэлгэц боломжтой. Шинэ дэлгэц хадгалахын тулд аль нэгийг нь хасна уу.</translation>
 <translation id="4759238208242260848">Таталтууд:</translation>
 <translation id="4774338217796918551">Маргааш <ph name="COME_BACK_TIME" />-д буцаж ирнэ үү.</translation>
@@ -742,6 +745,7 @@
 <translation id="5352250171825660495">Бараан загвар асаалттай байна</translation>
 <translation id="5356963482258194581">Бараан болон цайвар загварын хооронд сэлгэнэ үү. Дэлгэц дээр баруун талыг товшиж, Дэлгэцийн зураг &amp; стилийг сонгоно уу.</translation>
 <translation id="5379115545237091094">Хэт олон удаа оролдлоо</translation>
+<translation id="5391307769715781764">Хадгалсан дэлгэцээ өөрчлөх үү?</translation>
 <translation id="5393156353051693207">Аппуудаа дахин эрэмбэлэхийн тулд хүссэн газраа удаан дарна уу</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" />-г <ph name="IN_PLACE_APP" /> дээр тавьсан байна. Фолдер үүсгэхийн тулд чөлөөлнө үү.</translation>
 <translation id="5397578532367286026">chrome.com дээр (<ph name="MANAGER_EMAIL" />) удирдагч энэ хэрэглэгчийн хэрэглээ болон түүхийг үзэх боломжтой.</translation>
@@ -975,6 +979,7 @@
 <translation id="6790428901817661496">Тоглуулах</translation>
 <translation id="6801878137098616817">Саяхан зассан</translation>
 <translation id="6803622936009808957">Ямар нэг холбогдох шийдэл олдоогүй учраас дэлгэцүүдийг ойлгож чадахгүй байна. Оронд нь сунгасан десктопыг орууллаа.</translation>
+<translation id="6812232930908427253">Дэлгэцийг хадгалж чадсангүй. Хэт олон цонх эсвэл таб байна.</translation>
 <translation id="6818242057446442178">Нэг үгээр буцаах</translation>
 <translation id="6819327813400217281">Камерыг зүүн доод булан руу зэрэгцүүлсэн</translation>
 <translation id="6820676911989879663">Завсарлага аваарай!</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 585310fc..647a49f 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717"><ph name="POWER_SOURCE" /> चार्ज करत आहे</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">फोन शोधा</translation>
+<translation id="1287002645302686982"><ph name="DESK_TEMPLATE_NAME" /> या नावाचे सेव्ह केलेले डेस्क आधीच अस्तित्वात आहे</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" /> <ph name="COME_BACK_TIME" /> वाजता परत या.</translation>
 <translation id="1290331692326790741">खराब सिग्नल</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" /> फोल्डर <ph name="FOLDER_NAME" /> वर हलवा.</translation>
@@ -196,6 +197,7 @@
 <translation id="2079504693865562705">शेल्फमधील अ‍ॅप्स लपवा</translation>
 <translation id="2079545284768500474">पहिल्यासारखे करा</translation>
 <translation id="2083190527011054446">शुभ रात्री <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">गेम</translation>
 <translation id="209965399369889474">नेटवर्कशी कनेक्ट केलेले नाही</translation>
 <translation id="2107914222138020205">तुमची USB-C केबल ही थंडरबोल्टला सपोर्ट करत नाही. डिव्हाइसचा परफॉर्मन्स मर्यादित असू शकतो.</translation>
 <translation id="2108303511227308752">Alt + Backspace कीबोर्ड शॉर्टकट बदलला आहे. डिलीट की वापरण्यासाठी, <ph name="LAUNCHER_KEY_NAME" /> की + Backspace दाबा.</translation>
@@ -268,6 +270,7 @@
 <translation id="2586561057878260610"><ph name="DESK_NAME" /> सोबत एकत्रित करण्यासाठी Ctrl + W दाबा. डेस्क आणि विंडो बंद करण्यासाठी Ctrl + Shift + W दाबा.</translation>
 <translation id="2595239820337756193">५००० मैल</translation>
 <translation id="2596078834055697711">विंडो स्क्रीनशॉट घ्या</translation>
+<translation id="2598725286293895280">डेस्‍कमधील सपोर्ट नसलेली अ‍ॅप्स</translation>
 <translation id="2607678425161541573">ऑनलाइन साइन इन करणे आवश्यक आहे</translation>
 <translation id="2620016719323068571">तुमचे <ph name="CATEGORY" />, फाइल, अ‍ॅप्स आणि आणखी बरेच काही शोधा...</translation>
 <translation id="2620436844016719705">सिस्टम</translation>
@@ -643,6 +646,7 @@
 <translation id="4734965478015604180">आडवा</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + नंबर कीबोर्ड शॉर्टकट बदलला आहे. फंक्शन की वापरण्यासाठी, <ph name="LAUNCHER_KEY_NAME" /> की + सर्वात वरच्या पंक्तीमधील की दाबा.</translation>
 <translation id="473775607612524610">अपडेट करा</translation>
+<translation id="4740516757091333363">सेव्ह केलेले डेस्क हटवायचे आहे का?</translation>
 <translation id="4752784485658729358">फक्त सहा सेव्ह केलेल्या डेस्कना अनुमती आहे. नवीन डेस्‍क सेव्ह करण्यासाठी एखादा डेस्क काढून टाका.</translation>
 <translation id="4759238208242260848">डाउनलोड</translation>
 <translation id="4774338217796918551"><ph name="COME_BACK_TIME" /> वाजता परत या.</translation>
@@ -740,6 +744,7 @@
 <translation id="5352250171825660495">गडद थीम सुरू आहे</translation>
 <translation id="5356963482258194581">गडद आणि फिकट थीमदरम्यान स्विच करा. डेस्कटॉपवर राइट-क्लिक करा आणि वॉलपेपर आणि स्टाइल निवडा.</translation>
 <translation id="5379115545237091094">खूप जास्त प्रयत्न</translation>
+<translation id="5391307769715781764">सेव्ह केलेले डेस्क बदलायचे आहे का?</translation>
 <translation id="5393156353051693207">तुमची ॲप्स पुन्हा क्रमाने लावण्यासाठी कुठेही स्पर्श करा आणि धरून ठेवा</translation>
 <translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> च्या वर <ph name="DRAGGED_APP_NAME" />, फोल्डर तयार करण्यासाठी रिलीझ करा.</translation>
 <translation id="5397578532367286026">या वापरकर्त्याच्या वापर आणि इतिहासाचे chrome.com वरील व्यवस्थापकाद्वारे (<ph name="MANAGER_EMAIL" />) पुनरावलोकन केले जाऊ शकते.</translation>
@@ -973,6 +978,7 @@
 <translation id="6790428901817661496">प्ले करा</translation>
 <translation id="6801878137098616817">अलीकडे संपादित केलेली</translation>
 <translation id="6803622936009808957">समर्थित रिजोल्यूशन न आढळल्यामुळे प्रदर्शने मिरर करू शकली नाहीत. त्याऐवजी विस्तारित डेस्कटॉप एंटर केला.</translation>
+<translation id="6812232930908427253">डेस्क सेव्ह करता आले नाही. खूप जास्त विंडो किंवा टॅब आहेत.</translation>
 <translation id="6818242057446442178">एक शब्द मागे जा</translation>
 <translation id="6819327813400217281">कॅमेरा सर्वात खालच्या डाव्या कोपऱ्यात स्नॅप केला आहे</translation>
 <translation id="6820676911989879663">ब्रेक घ्या!</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index 1b91a0ac..77262ad 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">सेल्फमा एपहरू लुकाउनुहोस्</translation>
 <translation id="2079545284768500474">अन्डू गर्नुहोस्</translation>
 <translation id="2083190527011054446">नमस्ते <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">गेमहरू</translation>
 <translation id="209965399369889474">नेटवर्कमा जोडिएको छैन</translation>
 <translation id="2107914222138020205">तपाईंको USB-C केबल Thunderbolt मा जोड्न मिल्दैन। डिभाइस राम्ररी नचल्न सक्छ।</translation>
 <translation id="2108303511227308752">Alt + Backspace किबोर्ड सर्टकट परिवर्तन गरिएको छ। Delete की प्रयोग गर्न <ph name="LAUNCHER_KEY_NAME" /> की + Backspace थिच्नुहोस्।</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index a1692b5..9862e75 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Gir strøm til <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Finn telefonen</translation>
+<translation id="1287002645302686982">Det finnes allerede et lagret skrivebord med navnet <ph name="DESK_TEMPLATE_NAME" /></translation>
 <translation id="1289185460362160437">Kom tilbake <ph name="COME_BACK_DAY_OF_WEEK" /> <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Svakt signal</translation>
 <translation id="1290982764014248209">Flytter <ph name="DRAGGED_APP" /> til mappen <ph name="FOLDER_NAME" />.</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610">Trykk på Ctrl + W for å kombinere med <ph name="DESK_NAME" />. Trykk på Ctrl + Shift + W for å lukke skrivebordet og vinduene.</translation>
 <translation id="2595239820337756193">5 km i miles</translation>
 <translation id="2596078834055697711">Ta en skjermdump av vinduet</translation>
+<translation id="2598725286293895280">Skrivebordet inneholder apper som ikke støttes</translation>
 <translation id="2607678425161541573">Nettbasert pålogging kreves</translation>
 <translation id="2620016719323068571">Søk i <ph name="CATEGORY" />, filer, apper med mer …</translation>
 <translation id="2620436844016719705">System</translation>
@@ -644,6 +646,7 @@
 <translation id="4734965478015604180">Horisontal</translation>
 <translation id="4735498845456076464">Hurtigtasten <ph name="LAUNCHER_KEY_NAME" /> + tall er endret. For å bruke funksjonstastene, trykk på <ph name="LAUNCHER_KEY_NAME" />-tasten + en tast på øverste rad.</translation>
 <translation id="473775607612524610">Oppdater</translation>
+<translation id="4740516757091333363">Vil du slette det lagrede skrivebordet?</translation>
 <translation id="4752784485658729358">Kun 6 lagrede skrivebord er tillatt. Fjern et skrivebord for å lagre et nytt.</translation>
 <translation id="4759238208242260848">Nedlastinger</translation>
 <translation id="4774338217796918551">Kom tilbake i morgen <ph name="COME_BACK_TIME" />.</translation>
@@ -741,6 +744,7 @@
 <translation id="5352250171825660495">Mørkt tema er på</translation>
 <translation id="5356963482258194581">Bytt mellom mørkt og lyst tema. Høyreklikk på skrivebordet, og velg Bakgrunn og stil.</translation>
 <translation id="5379115545237091094">For mange forsøk</translation>
+<translation id="5391307769715781764">Vil du erstatte det lagrede skrivebordet?</translation>
 <translation id="5393156353051693207">Trykk og hold hvor som helst for å endre rekkefølge på appene</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> oppå <ph name="IN_PLACE_APP" /> – slipp for å opprette en mappe.</translation>
 <translation id="5397578532367286026">Bruken og loggen for denne brukeren kan gjennomgås av administratoren (<ph name="MANAGER_EMAIL" />) på chrome.com</translation>
@@ -974,6 +978,7 @@
 <translation id="6790428901817661496">Spill av</translation>
 <translation id="6801878137098616817">Redigert nylig</translation>
 <translation id="6803622936009808957">Kunne ikke speile skjermene fordi ingen støttede oppløsninger ble funnet. Utvidet skrivebord ble brukt i stedet.</translation>
+<translation id="6812232930908427253">Kunne ikke lagre skrivebordet. For mange vinduer eller faner.</translation>
 <translation id="6818242057446442178">Ett ord tilbake</translation>
 <translation id="6819327813400217281">Kameraet er festet til nedre venstre hjørne</translation>
 <translation id="6820676911989879663">Ta en pause!</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index a94281f..09d1afd 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">ଚାଲୁ କରୁଛି <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">ଫୋନର ଅବସ୍ଥାନ ନିରୂପଣ କରନ୍ତୁ</translation>
+<translation id="1287002645302686982">ପୂର୍ବରୁ <ph name="DESK_TEMPLATE_NAME" /> ନାମରେ ସେଭ କରାଯାଇଥିବା ଏକ ଡେସ୍କ ଅଛି</translation>
 <translation id="1289185460362160437"><ph name="COME_BACK_DAY_OF_WEEK" /> <ph name="COME_BACK_TIME" />ବେଳେ ପୁଣି ଆସନ୍ତୁ।</translation>
 <translation id="1290331692326790741">ଦୁର୍ବଳ ସିଗ୍‌‌‌‌‌‌‌ନାଲ୍</translation>
 <translation id="1290982764014248209"><ph name="DRAGGED_APP" />କୁ <ph name="FOLDER_NAME" /> ଫୋଲ୍ଡର୍‍କୁ ନେଇଯାଆନ୍ତୁ।</translation>
@@ -269,6 +270,7 @@
 <translation id="2586561057878260610"><ph name="DESK_NAME" /> ସହ ଏକତ୍ରିତ କରିବାକୁ Ctrl + W ଦବାନ୍ତୁ। ଡେସ୍କ ଏବଂ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ବନ୍ଦ କରିବା ପାଇଁ Ctrl + Shift + W ଦବାନ୍ତୁ।</translation>
 <translation id="2595239820337756193">5K ମାଇଲରେ</translation>
 <translation id="2596078834055697711">ୱିଣ୍ଡୋ ସ୍କ୍ରିନ୍‌ସଟ୍ ନିଅନ୍ତୁ</translation>
+<translation id="2598725286293895280">ଡେସ୍କରେ ଅସମର୍ଥିତ ଆପ୍ସ ଅଛି</translation>
 <translation id="2607678425161541573">ଅନଲାଇନ୍ ସାଇନ୍ ଇନ୍ କରିବା ଆବଶ୍ୟକ</translation>
 <translation id="2620016719323068571">ଆପଣଙ୍କ <ph name="CATEGORY" />, ଫାଇଲ, ଆପ୍ସ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ସନ୍ଧାନ କରନ୍ତୁ...</translation>
 <translation id="2620436844016719705">ସିଷ୍ଟମ୍‌</translation>
@@ -644,6 +646,7 @@
 <translation id="4734965478015604180">ଭୂସମାନ୍ତର</translation>
 <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number କୀବୋର୍ଡ ସର୍ଟକଟ୍ ବଦଳି ଯାଇଛି। ଫଙ୍କସନ୍ କୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବା ପାଇଁ, <ph name="LAUNCHER_KEY_NAME" /> କୀ + ଶୀର୍ଷ ଧାଡ଼ିରେ ଥିବା ଏକ କୀକୁ ଦବାନ୍ତୁ।</translation>
 <translation id="473775607612524610">ଅପ୍‍‍ଡେଟ୍</translation>
+<translation id="4740516757091333363">ସେଭ ହୋଇଥିବା ଡେସ୍କକୁ ଡିଲିଟ କରିବେ?</translation>
 <translation id="4752784485658729358">କେବଳ 6ଟି ସେଭ କରାଯାଇଥିବା ଡେସ୍କକୁ ଅନୁମତି ଦିଆଯାଇଛି। ଏକ ନୂଆ ଡେସ୍କ ସେଭ କରିବା ପାଇଁ ଗୋଟିଏ ଡେସ୍କ କାଢ଼ି ଦିଅନ୍ତୁ।</translation>
 <translation id="4759238208242260848">ଡାଉନଲୋଡସମୂହ</translation>
 <translation id="4774338217796918551">ଆସନ୍ତାକାଲି <ph name="COME_BACK_TIME" />ରେ ପୁଣି ଆସନ୍ତୁ।</translation>
@@ -741,6 +744,7 @@
 <translation id="5352250171825660495">ଗାଢ଼ ଥିମ୍ ଚାଲୁ ଅଛି</translation>
 <translation id="5356963482258194581">ଗାଢ଼ା ଏବଂ ହାଲୁକା ଥିମ ମଧ୍ୟରେ ସ୍ୱିଚ କରନ୍ତୁ। ଡେସ୍କଟପରେ ଡାହାଣ-କ୍ଲିକ କରି ୱାଲପେପର ଏବଂ ଷ୍ଟାଇଲକୁ ଚୟନ କରନ୍ତୁ।</translation>
 <translation id="5379115545237091094">ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା</translation>
+<translation id="5391307769715781764">ସେଭ ହୋଇଥିବା ଡେସ୍କକୁ ପରିବର୍ତ୍ତନ କରିବେ?</translation>
 <translation id="5393156353051693207">ଆପଣଙ୍କ ଆପଗୁଡ଼ିକୁ ପୁଣି କ୍ରମରେ ରଖିବା ପାଇଁ ଯେ କୌଣସି ସ୍ଥାନରେ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ</translation>
 <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ର ଶୀର୍ଷରେ <ph name="DRAGGED_APP_NAME" />କୁ, ଫୋଲ୍ଡର୍ ତିଆରି କରିବା ପାଇଁ ରିଲିଜ୍ କରନ୍ତୁ।</translation>
 <translation id="5397578532367286026">chrome.com ରେ ପରିଚାଳକ (<ph name="MANAGER_EMAIL" />) ଙ୍କ ଦ୍ଵାରା ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ବ୍ୟବହାର ପ୍ରଣାଳୀ ଓ ଇତିବୃତ୍ତିର ସମୀକ୍ଷା କରାଯାଇପାରିବ।</translation>
@@ -973,6 +977,7 @@
 <translation id="6790428901817661496">ଚଲାନ୍ତୁ</translation>
 <translation id="6801878137098616817">ବର୍ତ୍ତମାନ ଏଡିଟ କରାଯାଇଛି</translation>
 <translation id="6803622936009808957">ଏକାପରି ଡିସ୍‌ପ୍ଲେ କରାଯାଇପାରିଲା ନାହିଁ କାରଣ ସମର୍ଥିତ ରିଜୋଲ୍ୟୁଶନ୍ ମିଳିଲା ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ବିସ୍ତାରିତ ଡେସ୍କଟପ୍‍ ଲେଖାଯାଇଛି।</translation>
+<translation id="6812232930908427253">ଡେସ୍କକୁ ସେଭ କରାଯାଇପାରିଲା ନାହିଁ। ଅନେକଗୁଡ଼ିଏ ୱିଣ୍ଡୋ କିମ୍ବା ଟାବ।</translation>
 <translation id="6818242057446442178">ଗୋଟିଏ ଶବ୍ଦ ପଛକୁ ଫେରନ୍ତୁ</translation>
 <translation id="6819327813400217281">କ୍ୟାମେରାକୁ ନିମ୍ନ ବାମପାର୍ଶ୍ୱ କୋଣକୁ ସ୍ନାପ କରାଯାଇଛି</translation>
 <translation id="6820676911989879663">ଏକ ବିରତି ନିଅନ୍ତୁ!</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index c21c826..ea0cdd0 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -95,6 +95,7 @@
 <translation id="1420732223884894666">ਆਪਣੇ <ph name="DEVICE_TYPE" /> 'ਤੇ ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਹਾਲੀਆ ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਦੇਖੋ</translation>
 <translation id="1426410128494586442">ਹਾਂ</translation>
 <translation id="1438357537418863713">ਹੁਣ ਐਪ ਸਟ੍ਰੀਮਿੰਗ ਦਾ ਸੈੱਟਅੱਪ ਹੋ ਗਿਆ ਹੈ। ਸ਼ੁਰੂਆਤ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਹਾਲ ਹੀ ਵਿੱਚ ਲਾਂਚ ਕੀਤੀਆਂ ਐਪਾਂ ਇੱਥੇ ਦਿਸਣਗੀਆਂ।</translation>
+<translation id="1447641497144572814">ਸਕ੍ਰੀਨ ਸੇਵਰ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ</translation>
 <translation id="1455242230282523554">ਭਾਸ਼ਾ ਸੈਟਿੰਗਾਂ ਦਿਖਾਓ</translation>
 <translation id="1460620680449458626">ਅਵਾਜ਼ ਨੂੰ ਮਿਊਟ ਕੀਤਾ ਹੋਇਆ ਹੈ।</translation>
 <translation id="1467432559032391204">ਖੱਬੇ ਪਾਸੇ</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 59b9a23..4f3b4b72 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -659,7 +659,7 @@
 <translation id="4814539958450445987">Ecrã de início de sessão</translation>
 <translation id="4831034276697007977">Tem a certeza de que pretende desativar os cliques automáticos?</translation>
 <translation id="4849058404725798627">Realçar objeto com foco do teclado</translation>
-<translation id="485592688953820832">Nenhuma ação (colocar em pausa)</translation>
+<translation id="485592688953820832">Nenhuma ação (pausar)</translation>
 <translation id="485634149294284819">Aceder ao menu do teclado</translation>
 <translation id="4860284199500934869">Verifique a sua ligação de rede para transferir o ficheiro <ph name="FILENAME" /></translation>
 <translation id="486056901304535126">Tentar-se-á a transferência mais tarde. A voz será enviada para a Google para processamento até à conclusão da transferência.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 4c18586..477d7c4 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -65,6 +65,7 @@
 <translation id="1275285675049378717">Se încarcă <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">Găsește telefonul</translation>
+<translation id="1287002645302686982">Există deja un desktop salvat denumit <ph name="DESK_TEMPLATE_NAME" /></translation>
 <translation id="1289185460362160437">Revino <ph name="COME_BACK_DAY_OF_WEEK" /> la <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Semnal slab</translation>
 <translation id="1290982764014248209">Mută <ph name="DRAGGED_APP" /> în dosarul <ph name="FOLDER_NAME" />.</translation>
@@ -196,6 +197,7 @@
 <translation id="2079504693865562705">Ascunde aplicațiile din raft</translation>
 <translation id="2079545284768500474">Anulează</translation>
 <translation id="2083190527011054446">Bună seara, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">jocuri</translation>
 <translation id="209965399369889474">Fără conexiune la rețea</translation>
 <translation id="2107914222138020205">Cablul USB-C nu acceptă Thunderbolt. Este posibil ca performanța dispozitivului să fie limitată.</translation>
 <translation id="2108303511227308752">Comanda rapidă de la tastatură Alt + Backspace s-a schimbat. Pentru a folosi tasta Delete, apasă tasta <ph name="LAUNCHER_KEY_NAME" /> + backspace.</translation>
@@ -268,6 +270,7 @@
 <translation id="2586561057878260610">Apasă Ctrl + W ca să combini cu <ph name="DESK_NAME" />. Apasă Ctrl + Shift + W ca să închizi desktopul și ferestrele.</translation>
 <translation id="2595239820337756193">5 km în mile</translation>
 <translation id="2596078834055697711">Realizează o captură de ecran a ferestrei</translation>
+<translation id="2598725286293895280">Aplicații neacceptate pe desktop</translation>
 <translation id="2607678425161541573">Este necesară conectarea online</translation>
 <translation id="2620016719323068571">Caută în <ph name="CATEGORY" />, fișiere, aplicații și altele…</translation>
 <translation id="2620436844016719705">Sistem</translation>
@@ -643,6 +646,7 @@
 <translation id="4734965478015604180">Orizontal</translation>
 <translation id="4735498845456076464">Comanda rapidă de la tastatură <ph name="LAUNCHER_KEY_NAME" /> + număr s-a schimbat. Pentru a folosi tastele pentru funcții, apasă tasta <ph name="LAUNCHER_KEY_NAME" /> + o tastă de pe rândul de sus.</translation>
 <translation id="473775607612524610">Actualizează</translation>
+<translation id="4740516757091333363">Ștergi desktopul salvat?</translation>
 <translation id="4752784485658729358">Sunt permise numai șase desktopuri salvate. Elimină un desktop pentru a salva altul nou.</translation>
 <translation id="4759238208242260848">Descărcări</translation>
 <translation id="4774338217796918551">Revino mâine la <ph name="COME_BACK_TIME" />.</translation>
@@ -740,6 +744,7 @@
 <translation id="5352250171825660495">Tema întunecată este activată</translation>
 <translation id="5356963482258194581">Comută între tema luminoasă și cea întunecată Dă clic dreapta pe desktop și selectează Stil și imagine de fundal.</translation>
 <translation id="5379115545237091094">Prea multe încercări</translation>
+<translation id="5391307769715781764">Înlocuiești desktopul salvat?</translation>
 <translation id="5393156353051693207">Atinge lung oriunde ca să-ți reordonezi aplicațiile</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> deasupra <ph name="IN_PLACE_APP" />, eliberează pentru a crea un dosar.</translation>
 <translation id="5397578532367286026">Datele privind utilizarea și istoricul ale acestui utilizator pot fi examinate de administrator (<ph name="MANAGER_EMAIL" />) pe chrome.com.</translation>
@@ -973,6 +978,7 @@
 <translation id="6790428901817661496">Redă</translation>
 <translation id="6801878137098616817">Editat recent</translation>
 <translation id="6803622936009808957">Afișajele nu au putut fi oglindite, deoarece nu au fost găsite rezoluții acceptate. Ați intrat, în schimb, în modul monitor extins.</translation>
+<translation id="6812232930908427253">Nu s-a putut salva desktopul. Prea multe ferestre sau file.</translation>
 <translation id="6818242057446442178">Înapoi cu un cuvânt</translation>
 <translation id="6819327813400217281">Camera foto este aliniată cu colțul din stânga jos</translation>
 <translation id="6820676911989879663">Fă o pauză!</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index bae2ff7..eb86c18 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Скрыть приложения на панели запуска</translation>
 <translation id="2079545284768500474">Отмена</translation>
 <translation id="2083190527011054446">Доброй ночи, <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">игры</translation>
 <translation id="209965399369889474">Нет подключения к сети</translation>
 <translation id="2107914222138020205">Кабель USB-C не поддерживает интерфейс Thunderbolt. Производительность устройства может быть ограничена.</translation>
 <translation id="2108303511227308752">Функция сочетания клавиш Alt + Backspace изменилась. Чтобы выполнить действие клавиши Delete, нажмите <ph name="LAUNCHER_KEY_NAME" /> + Backspace.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index e0c0ec75..33e9957 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">Zobrazte si v zariadení <ph name="DEVICE_TYPE" /> najnovšie fotky a médiá zo svojho telefónu</translation>
 <translation id="1426410128494586442">Áno</translation>
 <translation id="1438357537418863713">Streamovanie aplikácií je nastavené. Keď začnete, tu sa budú zobrazovať nedávno spustené aplikácie.</translation>
+<translation id="1447641497144572814">Spúšťa sa šetrič obrazovky</translation>
 <translation id="1455242230282523554">Zobraziť nastavenia jazyka</translation>
 <translation id="1460620680449458626">Zvuk je vypnutý.</translation>
 <translation id="1467432559032391204">Doľava</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 158c636..1c6e3e8 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Skrivanje aplikacij na polici</translation>
 <translation id="2079545284768500474">Razveljavi</translation>
 <translation id="2083190527011054446">Lahko noč, <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">tekme</translation>
 <translation id="209965399369889474">Ni povezave z omrežjem</translation>
 <translation id="2107914222138020205">Kabel USB-C ne podpira protokola Thunderbolt. Delovanje naprave bo morda omejeno.</translation>
 <translation id="2108303511227308752">Bližnjica na tipkovnici alt + preslednica je spremenjena. Če želite uporabiti tipko za brisanje, pritisnite tipko za <ph name="LAUNCHER_KEY_NAME" /> in vračalko.</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb
index 8815dce..840618f 100644
--- a/ash/strings/ash_strings_sq.xtb
+++ b/ash/strings/ash_strings_sq.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Fshih aplikacionet në raft</translation>
 <translation id="2079545284768500474">Zhbëj</translation>
 <translation id="2083190527011054446">Natën e mirë <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">lojërat</translation>
 <translation id="209965399369889474">Nuk është lidhur në rrjet</translation>
 <translation id="2107914222138020205">Kablloja jote USB-C nuk mbështet Thunderbolt. Cilësia e funksionimit të pajisjes mund të jetë e kufizuar.</translation>
 <translation id="2108303511227308752">Shkurtorja për Alt + Backspace është ndryshuar. Për të përdorur tastin Delete, shtyp tastin <ph name="LAUNCHER_KEY_NAME" /> key + Backspace.</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index b9637a2..977a8556 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Dölj appar på hyllan</translation>
 <translation id="2079545284768500474">Ångra</translation>
 <translation id="2083190527011054446">Hej <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">spel</translation>
 <translation id="209965399369889474">Ingen nätverksanslutning</translation>
 <translation id="2107914222138020205">USB-C-kabeln har inte stöd för Thunderbolt. Enhetens prestanda kan försämras.</translation>
 <translation id="2108303511227308752">Kortkommandot Alt + backsteg har ändrats. Tryck på <ph name="LAUNCHER_KEY_NAME" />-tangenten + backsteg för att använda Delete-tangenten.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 8976907..8707465 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Ficha programu kwenye rafu</translation>
 <translation id="2079545284768500474">Tendua</translation>
 <translation id="2083190527011054446">Usiku mwema <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">michezo</translation>
 <translation id="209965399369889474">Haijaunganishwa kwenye mtandao</translation>
 <translation id="2107914222138020205">Kebo yako ya USB-C haioani na Thunderbolt. Huenda utendaji kazi wa kifaa usiwe mzuri.</translation>
 <translation id="2108303511227308752">Mikato ya kibodi ya Alt + Backspace imebadilika. Ili utumie kitufe cha Kufuta, bonyeza kitufe cha <ph name="LAUNCHER_KEY_NAME" /> pamoja na kitufe cha backspace.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 67825bc..3142679 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">మీ ఫోన్‌లోని తాజా ఫోటోలు, మీడియాను మీ <ph name="DEVICE_TYPE" />లో చూడండి</translation>
 <translation id="1426410128494586442">అవును</translation>
 <translation id="1438357537418863713">యాప్ స్ట్రీమింగ్ ఇప్పుడు సెటప్ చేయబడింది. మీరు ప్రారంభించిన తర్వాత, ఇటీవల లాంచ్ చేయబడిన యాప్‌లు ఇక్కడ కనిపిస్తాయి.</translation>
+<translation id="1447641497144572814">స్క్రీన్ సేవర్ ప్రారంభమవుతోంది</translation>
 <translation id="1455242230282523554">భాష సెట్టింగ్‌లను చూపుతుంది</translation>
 <translation id="1460620680449458626">వాల్యూమ్ మ్యూట్ చేయబడింది.</translation>
 <translation id="1467432559032391204">ఎడమ</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 7a009bc..2351c8f3 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -62,6 +62,7 @@
 <translation id="1275285675049378717">การชาร์จไฟ <ph name="POWER_SOURCE" /></translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1285992161347843613">ระบุตำแหน่งของโทรศัพท์</translation>
+<translation id="1287002645302686982">มีเดสก์ชื่อ <ph name="DESK_TEMPLATE_NAME" /> ที่บันทึกไว้อยู่แล้ว</translation>
 <translation id="1289185460362160437">ใช้ได้อีกครั้ง<ph name="COME_BACK_DAY_OF_WEEK" /> เวลา <ph name="COME_BACK_TIME" /></translation>
 <translation id="1290331692326790741">สัญญาณไม่ดี</translation>
 <translation id="1290982764014248209">ย้าย <ph name="DRAGGED_APP" /> ไปที่โฟลเดอร์ <ph name="FOLDER_NAME" /></translation>
@@ -266,6 +267,7 @@
 <translation id="2586561057878260610">กด Ctrl + W เพื่อรวมเข้ากับ <ph name="DESK_NAME" /> กด Ctrl + Shift + W เพื่อปิดเดสก์และหน้าต่าง</translation>
 <translation id="2595239820337756193">5 กม. เท่ากับกี่ไมล์</translation>
 <translation id="2596078834055697711">ถ่ายภาพหน้าจอของหน้าต่าง</translation>
+<translation id="2598725286293895280">แอปที่ไม่รองรับในเดสก์</translation>
 <translation id="2607678425161541573">ต้องลงชื่อเข้าใช้ออนไลน์</translation>
 <translation id="2620016719323068571">ค้นหา<ph name="CATEGORY" /> ไฟล์ แอป และอื่นๆ...</translation>
 <translation id="2620436844016719705">ระบบ</translation>
@@ -641,6 +643,7 @@
 <translation id="4734965478015604180">แนวนอน</translation>
 <translation id="4735498845456076464">มีการเปลี่ยนแปลงแป้นพิมพ์ลัด <ph name="LAUNCHER_KEY_NAME" /> + ตัวเลข หากต้องการใช้แป้นฟังก์ชัน ให้กดแป้น <ph name="LAUNCHER_KEY_NAME" /> + แป้นแถวบนสุด</translation>
 <translation id="473775607612524610">อัปเดต</translation>
+<translation id="4740516757091333363">ลบเดสก์ที่บันทึกไว้ใช่ไหม</translation>
 <translation id="4752784485658729358">อนุญาตให้บันทึกเพียง 6 เดสก์ นำออกเพื่อบันทึกเดสก์ใหม่</translation>
 <translation id="4759238208242260848">ดาวน์โหลด</translation>
 <translation id="4774338217796918551">ใช้ได้อีกครั้งพรุ่งนี้ เวลา <ph name="COME_BACK_TIME" /></translation>
@@ -738,6 +741,7 @@
 <translation id="5352250171825660495">ธีมมืดเปิดอยู่</translation>
 <translation id="5356963482258194581">สลับระหว่างธีมมืดและธีมสว่าง คลิกขวาที่เดสก์ท็อป แล้วเลือก "วอลเปเปอร์และสไตล์"</translation>
 <translation id="5379115545237091094">ลองหลายครั้งเกินไป</translation>
+<translation id="5391307769715781764">แทนที่เดสก์ที่บันทึกไว้ใช่ไหม</translation>
 <translation id="5393156353051693207">แตะที่ใดก็ได้ค้างไว้เพื่อเรียงลำดับแอปใหม่</translation>
 <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> อยู่เหนือ <ph name="IN_PLACE_APP" /> ปล่อยเพื่อสร้างโฟลเดอร์</translation>
 <translation id="5397578532367286026">การใช้งานและประวัติของผู้ใช้รายนี้อาจถูกตรวจสอบโดยผู้จัดการ (<ph name="MANAGER_EMAIL" />) บน chrome.com</translation>
@@ -971,6 +975,7 @@
 <translation id="6790428901817661496">เล่น</translation>
 <translation id="6801878137098616817">แก้ไขเมื่อเร็วๆ นี้</translation>
 <translation id="6803622936009808957">ไม่สามารถแสดงผลคู่ขนานได้เนื่องจากไม่พบความละเอียดที่สนับสนุน เข้าสู่เดสก์ท็อปแบบขยายแทน</translation>
+<translation id="6812232930908427253">บันทึกเดสก์ไม่ได้ มีหน้าต่างหรือแท็บมากเกินไป</translation>
 <translation id="6818242057446442178">ถอยกลับทีละคำ</translation>
 <translation id="6819327813400217281">จัดกล้องพอดีกับมุมซ้ายล่างแล้ว</translation>
 <translation id="6820676911989879663">พักสายตาหน่อย</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index 327c508..7dae6d5 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Raftaki uygulamaları gizle</translation>
 <translation id="2079545284768500474">Geri al</translation>
 <translation id="2083190527011054446">İyi geceler <ph name="GIVEN_NAME" />,</translation>
+<translation id="2088116547584365419">oyunlar</translation>
 <translation id="209965399369889474">Ağa bağlı değilsiniz</translation>
 <translation id="2107914222138020205">USB-C kablonuz Thunderbolt'u desteklemiyor. Cihaz performansı sınırlı olabilir.</translation>
 <translation id="2108303511227308752">Alt + Geri tuşu klavye kısayolu değişti. Delete tuşunu kullanmak için <ph name="LAUNCHER_KEY_NAME" /> + geri tuşlarına basın.</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index 49e38ad..973e211 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">شیلف میں ایپس چھپائیں</translation>
 <translation id="2079545284768500474">کالعدم کریں</translation>
 <translation id="2083190527011054446">شب بخیر <ph name="GIVEN_NAME" />،</translation>
+<translation id="2088116547584365419">گیمز</translation>
 <translation id="209965399369889474">نیٹ ورک سے منسلک نہیں ہے</translation>
 <translation id="2107914222138020205">‏آپ کی USB-C کیبل Thunderbolt کو سپورٹ نہیں کرتی ہے۔ آلے کی کارکردگی محدود ہو سکتی ہے۔</translation>
 <translation id="2108303511227308752">‏Alt + Backspace کی بورڈ شارٹ کٹ تبدیل ہو گیا ہے۔ Delete کلید کا استعمال کرنے کیلئے <ph name="LAUNCHER_KEY_NAME" /> کلید + بیک اسپیس کو دبائیں۔</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 0c80601f..fa7e2a8e 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -196,6 +196,7 @@
 <translation id="2079504693865562705">Ẩn các ứng dụng trên kệ</translation>
 <translation id="2079545284768500474">Hoàn tác</translation>
 <translation id="2083190527011054446">Xin chào <ph name="GIVEN_NAME" />!</translation>
+<translation id="2088116547584365419">trò chơi</translation>
 <translation id="209965399369889474">Chưa kết nối với mạng</translation>
 <translation id="2107914222138020205">Cáp USB-C của bạn không hỗ trợ Thunderbolt. Hiệu suất của thiết bị có thể bị hạn chế.</translation>
 <translation id="2108303511227308752">Phím tắt Alt + Backspace đã thay đổi. Để sử dụng phím Delete, hãy nhấn tổ hợp phím <ph name="LAUNCHER_KEY_NAME" /> + Backspace.</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 42738093..4af2c20c 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -193,6 +193,7 @@
 <translation id="2079504693865562705">在檔案櫃中隱藏應用程式</translation>
 <translation id="2079545284768500474">復原</translation>
 <translation id="2083190527011054446">晚安,<ph name="GIVEN_NAME" />:</translation>
+<translation id="2088116547584365419">遊戲</translation>
 <translation id="209965399369889474">未連上網路</translation>
 <translation id="2107914222138020205">你的 USB-C 連接線不支援 Thunderbolt。裝置效能可能會因此受到限制。</translation>
 <translation id="2108303511227308752">「Alt + Backspace 鍵」的鍵盤快速鍵已變更。如要使用 Delete 鍵,請按下<ph name="LAUNCHER_KEY_NAME" />鍵 + Backspace 鍵。</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb
index bf50a3d..7991e299 100644
--- a/ash/strings/ash_strings_zu.xtb
+++ b/ash/strings/ash_strings_zu.xtb
@@ -96,6 +96,7 @@
 <translation id="1420732223884894666">Buka izithombe zakamuva zefoni yakho nemidiya ku-<ph name="DEVICE_TYPE" /> yakho</translation>
 <translation id="1426410128494586442">Yebo</translation>
 <translation id="1438357537418863713">Ukusakaza i-app manje kusethiwe. Uma usuqalile, ama-app asanda kwethulwa azovela lapha.</translation>
+<translation id="1447641497144572814">Isilondolozi sesikrini siyaqala</translation>
 <translation id="1455242230282523554">Bonisa izilungiselelo zolimi</translation>
 <translation id="1460620680449458626">Ivolumu ithulisiwe.</translation>
 <translation id="1467432559032391204">Kwesobunxele</translation>
diff --git a/ash/wm/splitview/split_view_divider.cc b/ash/wm/splitview/split_view_divider.cc
index 972aa4c3..b60d2193 100644
--- a/ash/wm/splitview/split_view_divider.cc
+++ b/ash/wm/splitview/split_view_divider.cc
@@ -486,6 +486,7 @@
   params.parent = Shell::GetContainer(controller->root_window(),
                                       kShellWindowId_AlwaysOnTopContainer);
   params.init_properties_container.SetProperty(kHideInDeskMiniViewKey, true);
+  params.name = "SplitViewDivider";
   divider_widget_->set_focus_on_creation(false);
   divider_widget_->Init(std::move(params));
   divider_widget_->SetVisibilityAnimationTransition(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index e5a179d..e8bd097d 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -3659,6 +3659,7 @@
       "allocator/partition_allocator/partition_alloc_base/rand_util_pa_unittest.cc",
       "allocator/partition_allocator/partition_alloc_base/scoped_clear_last_error_pa_unittest.cc",
       "allocator/partition_allocator/partition_alloc_base/sys_byteorder_pa_unittest.cc",
+      "allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.cc",
       "allocator/partition_allocator/partition_alloc_unittest.cc",
       "allocator/partition_allocator/partition_lock_unittest.cc",
       "allocator/partition_allocator/starscan/pcscan_scheduling_unittest.cc",
@@ -3878,6 +3879,7 @@
 if (enable_nocompile_tests) {
   nocompile_test("base_nocompile_tests") {
     sources = [
+      "allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.nc",
       "bind_unittest.nc",
       "callback_list_unittest.nc",
       "callback_unittest.nc",
diff --git a/base/allocator/partition_allocator/BUILD.gn b/base/allocator/partition_allocator/BUILD.gn
index 10a140d..559a733 100644
--- a/base/allocator/partition_allocator/BUILD.gn
+++ b/base/allocator/partition_allocator/BUILD.gn
@@ -109,6 +109,7 @@
     "partition_alloc_base/rand_util.h",
     "partition_alloc_base/scoped_clear_last_error.h",
     "partition_alloc_base/sys_byteorder.h",
+    "partition_alloc_base/thread_annotations.h",
     "partition_alloc_base/threading/platform_thread.cc",
     "partition_alloc_base/threading/platform_thread.h",
     "partition_alloc_base/threading/platform_thread_ref.h",
diff --git a/base/allocator/partition_allocator/DEPS b/base/allocator/partition_allocator/DEPS
index eeb8b8d..0f186c8 100644
--- a/base/allocator/partition_allocator/DEPS
+++ b/base/allocator/partition_allocator/DEPS
@@ -15,7 +15,6 @@
     "+base/mac/mac_util.h",
     "+base/mac/scoped_cftyperef.h",
     "+base/process/memory.h",
-    "+base/thread_annotations.h",
     "+base/win/windows_types.h",
     "+build/build_config.h",
     "+build/buildflag.h",
diff --git a/base/allocator/partition_allocator/address_pool_manager.h b/base/allocator/partition_allocator/address_pool_manager.h
index 93be971..3b38efc6 100644
--- a/base/allocator/partition_allocator/address_pool_manager.h
+++ b/base/allocator/partition_allocator/address_pool_manager.h
@@ -12,13 +12,13 @@
 #include "base/allocator/partition_allocator/address_pool_manager_types.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
 #include "base/base_export.h"
 #include "base/dcheck_is_on.h"
-#include "base/thread_annotations.h"
 #include "build/build_config.h"
 
 namespace base {
@@ -137,13 +137,13 @@
 
     // The bitset stores the allocation state of the address pool. 1 bit per
     // super-page: 1 = allocated, 0 = free.
-    std::bitset<kMaxSuperPagesInPool> alloc_bitset_ GUARDED_BY(lock_);
+    std::bitset<kMaxSuperPagesInPool> alloc_bitset_ PA_GUARDED_BY(lock_);
 
     // An index of a bit in the bitset before which we know for sure there all
     // 1s. This is a best-effort hint in the sense that there still may be lots
     // of 1s after this index, but at least we know there is no point in
     // starting the search before it.
-    size_t bit_hint_ GUARDED_BY(lock_) = 0;
+    size_t bit_hint_ PA_GUARDED_BY(lock_) = 0;
 
     size_t total_bits_ = 0;
     uintptr_t address_begin_ = 0;
diff --git a/base/allocator/partition_allocator/address_pool_manager_bitmap.h b/base/allocator/partition_allocator/address_pool_manager_bitmap.h
index a26eb08..227e2aa 100644
--- a/base/allocator/partition_allocator/address_pool_manager_bitmap.h
+++ b/base/allocator/partition_allocator/address_pool_manager_bitmap.h
@@ -86,7 +86,7 @@
     // It is safe to read |regular_pool_bits_| without a lock since the caller
     // is responsible for guaranteeing that the address is inside a valid
     // allocation and the deallocation call won't race with this call.
-    return TS_UNCHECKED_READ(
+    return PA_TS_UNCHECKED_READ(
         regular_pool_bits_)[address >> kBitShiftOfRegularPoolBitmap];
   }
 
@@ -99,7 +99,7 @@
     // It is safe to read |brp_pool_bits_| without a lock since the caller
     // is responsible for guaranteeing that the address is inside a valid
     // allocation and the deallocation call won't race with this call.
-    return TS_UNCHECKED_READ(
+    return PA_TS_UNCHECKED_READ(
         brp_pool_bits_)[address >> kBitShiftOfBRPPoolBitmap];
   }
 
@@ -134,8 +134,9 @@
 
   static Lock& GetLock();
 
-  static std::bitset<kRegularPoolBits> regular_pool_bits_ GUARDED_BY(GetLock());
-  static std::bitset<kBRPPoolBits> brp_pool_bits_ GUARDED_BY(GetLock());
+  static std::bitset<kRegularPoolBits> regular_pool_bits_
+      PA_GUARDED_BY(GetLock());
+  static std::bitset<kBRPPoolBits> brp_pool_bits_ PA_GUARDED_BY(GetLock());
 #if BUILDFLAG(USE_BACKUP_REF_PTR)
   static std::array<std::atomic_bool, kAddressSpaceSize / kSuperPageSize>
       brp_forbidden_super_page_map_;
diff --git a/base/allocator/partition_allocator/memory_reclaimer.h b/base/allocator/partition_allocator/memory_reclaimer.h
index c2ce7e2..76952a5 100644
--- a/base/allocator/partition_allocator/memory_reclaimer.h
+++ b/base/allocator/partition_allocator/memory_reclaimer.h
@@ -9,11 +9,11 @@
 #include <set>
 
 #include "base/allocator/partition_allocator/partition_alloc_base/no_destructor.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
 #include "base/base_export.h"
-#include "base/thread_annotations.h"
 
 namespace partition_alloc {
 
@@ -63,7 +63,7 @@
   void ResetForTesting();
 
   internal::Lock lock_;
-  std::set<PartitionRoot<>*> partitions_ GUARDED_BY(lock_);
+  std::set<PartitionRoot<>*> partitions_ PA_GUARDED_BY(lock_);
 
   friend class internal::base::NoDestructor<MemoryReclaimer>;
   friend class MemoryReclaimerTest;
diff --git a/base/allocator/partition_allocator/page_allocator.cc b/base/allocator/partition_allocator/page_allocator.cc
index abcb0b0d..48082ae 100644
--- a/base/allocator/partition_allocator/page_allocator.cc
+++ b/base/allocator/partition_allocator/page_allocator.cc
@@ -10,6 +10,7 @@
 #include "base/allocator/partition_allocator/address_space_randomization.h"
 #include "base/allocator/partition_allocator/page_allocator_internal.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
 #include "build/build_config.h"
@@ -42,8 +43,8 @@
 std::atomic<size_t> g_total_mapped_address_space;
 
 // We only support a single block of reserved address space.
-uintptr_t s_reservation_address GUARDED_BY(GetReserveLock()) = 0;
-size_t s_reservation_size GUARDED_BY(GetReserveLock()) = 0;
+uintptr_t s_reservation_address PA_GUARDED_BY(GetReserveLock()) = 0;
+size_t s_reservation_size PA_GUARDED_BY(GetReserveLock()) = 0;
 
 uintptr_t AllocPagesIncludingReserved(
     uintptr_t address,
diff --git a/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h
new file mode 100644
index 0000000..65a606a
--- /dev/null
+++ b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h
@@ -0,0 +1,264 @@
+// Copyright (c) 2018 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.
+
+// This header file contains macro definitions for thread safety annotations
+// that allow developers to document the locking policies of multi-threaded
+// code. The annotations can also help program analysis tools to identify
+// potential thread safety issues.
+//
+// Note that no analysis is done inside constructors and destructors,
+// regardless of what attributes are used. See
+// https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#no-checking-inside-constructors-and-destructors
+// for details.
+//
+// Note that the annotations we use are described as deprecated in the Clang
+// documentation, linked below. E.g. we use PA_EXCLUSIVE_LOCKS_REQUIRED where
+// the Clang docs use REQUIRES.
+//
+// http://clang.llvm.org/docs/ThreadSafetyAnalysis.html
+//
+// We use the deprecated Clang annotations to match Abseil (relevant header
+// linked below) and its ecosystem of libraries. We will follow Abseil with
+// respect to upgrading to more modern annotations.
+//
+// https://github.com/abseil/abseil-cpp/blob/master/absl/base/thread_annotations.h
+//
+// These annotations are implemented using compiler attributes. Using the macros
+// defined here instead of raw attributes allow for portability and future
+// compatibility.
+//
+// When referring to mutexes in the arguments of the attributes, you should
+// use variable names or more complex expressions (e.g. my_object->mutex_)
+// that evaluate to a concrete mutex object whenever possible. If the mutex
+// you want to refer to is not in scope, you may use a member pointer
+// (e.g. &MyClass::mutex_) to refer to a mutex in some (unknown) object.
+
+#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_
+#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_
+
+#include "base/dcheck_is_on.h"
+#include "build/build_config.h"
+
+#if defined(__clang__)
+#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
+#else
+#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x)  // no-op
+#endif
+
+// PA_GUARDED_BY()
+//
+// Documents if a shared field or global variable needs to be protected by a
+// mutex. PA_GUARDED_BY() allows the user to specify a particular mutex that
+// should be held when accessing the annotated variable.
+//
+// Example:
+//
+//   Mutex mu;
+//   int p1 PA_GUARDED_BY(mu);
+#define PA_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
+
+// PA_PT_GUARDED_BY()
+//
+// Documents if the memory location pointed to by a pointer should be guarded
+// by a mutex when dereferencing the pointer.
+//
+// Example:
+//   Mutex mu;
+//   int *p1 PA_PT_GUARDED_BY(mu);
+//
+// Note that a pointer variable to a shared memory location could itself be a
+// shared variable.
+//
+// Example:
+//
+//     // `q`, guarded by `mu1`, points to a shared memory location that is
+//     // guarded by `mu2`:
+//     int *q PA_GUARDED_BY(mu1) PA_PT_GUARDED_BY(mu2);
+#define PA_PT_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
+
+// PA_ACQUIRED_AFTER() / PA_ACQUIRED_BEFORE()
+//
+// Documents the acquisition order between locks that can be held
+// simultaneously by a thread. For any two locks that need to be annotated
+// to establish an acquisition order, only one of them needs the annotation.
+// (i.e. You don't have to annotate both locks with both PA_ACQUIRED_AFTER
+// and PA_ACQUIRED_BEFORE.)
+//
+// Example:
+//
+//   Mutex m1;
+//   Mutex m2 PA_ACQUIRED_AFTER(m1);
+#define PA_ACQUIRED_AFTER(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))
+
+#define PA_ACQUIRED_BEFORE(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))
+
+// PA_EXCLUSIVE_LOCKS_REQUIRED() / PA_SHARED_LOCKS_REQUIRED()
+//
+// Documents a function that expects a mutex to be held prior to entry.
+// The mutex is expected to be held both on entry to, and exit from, the
+// function.
+//
+// Example:
+//
+//   Mutex mu1, mu2;
+//   int a PA_GUARDED_BY(mu1);
+//   int b PA_GUARDED_BY(mu2);
+//
+//   void foo() PA_EXCLUSIVE_LOCKS_REQUIRED(mu1, mu2) { ... };
+#define PA_EXCLUSIVE_LOCKS_REQUIRED(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))
+
+#define PA_SHARED_LOCKS_REQUIRED(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))
+
+// PA_LOCKS_EXCLUDED()
+//
+// Documents the locks acquired in the body of the function. These locks
+// cannot be held when calling this function (as Abseil's `Mutex` locks are
+// non-reentrant).
+#define PA_LOCKS_EXCLUDED(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
+
+// PA_LOCK_RETURNED()
+//
+// Documents a function that returns a mutex without acquiring it.  For example,
+// a public getter method that returns a pointer to a private mutex should
+// be annotated with PA_LOCK_RETURNED.
+#define PA_LOCK_RETURNED(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
+
+// PA_LOCKABLE
+//
+// Documents if a class/type is a lockable type (such as the `Mutex` class).
+#define PA_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(lockable)
+
+// PA_SCOPED_LOCKABLE
+//
+// Documents if a class does RAII locking (such as the `MutexLock` class).
+// The constructor should use `PA_*_LOCK_FUNCTION()` to specify the mutex that
+// is acquired, and the destructor should use `PA_UNLOCK_FUNCTION()` with no
+// arguments; the analysis will assume that the destructor unlocks whatever the
+// constructor locked.
+#define PA_SCOPED_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
+
+// PA_EXCLUSIVE_LOCK_FUNCTION()
+//
+// Documents functions that acquire a lock in the body of a function, and do
+// not release it.
+#define PA_EXCLUSIVE_LOCK_FUNCTION(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))
+
+// PA_SHARED_LOCK_FUNCTION()
+//
+// Documents functions that acquire a shared (reader) lock in the body of a
+// function, and do not release it.
+#define PA_SHARED_LOCK_FUNCTION(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))
+
+// PA_UNLOCK_FUNCTION()
+//
+// Documents functions that expect a lock to be held on entry to the function,
+// and release it in the body of the function.
+#define PA_UNLOCK_FUNCTION(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))
+
+// PA_EXCLUSIVE_TRYLOCK_FUNCTION() / PA_SHARED_TRYLOCK_FUNCTION()
+//
+// Documents functions that try to acquire a lock, and return success or failure
+// (or a non-boolean value that can be interpreted as a boolean).
+// The first argument should be `true` for functions that return `true` on
+// success, or `false` for functions that return `false` on success. The second
+// argument specifies the mutex that is locked on success. If unspecified, this
+// mutex is assumed to be `this`.
+#define PA_EXCLUSIVE_TRYLOCK_FUNCTION(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))
+
+#define PA_SHARED_TRYLOCK_FUNCTION(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))
+
+// PA_ASSERT_EXCLUSIVE_LOCK() / PA_ASSERT_SHARED_LOCK()
+//
+// Documents functions that dynamically check to see if a lock is held, and fail
+// if it is not held.
+#define PA_ASSERT_EXCLUSIVE_LOCK(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__))
+
+#define PA_ASSERT_SHARED_LOCK(...) \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__))
+
+// PA_NO_THREAD_SAFETY_ANALYSIS
+//
+// Turns off thread safety checking within the body of a particular function.
+// This annotation is used to mark functions that are known to be correct, but
+// the locking behavior is more complicated than the analyzer can handle.
+#define PA_NO_THREAD_SAFETY_ANALYSIS \
+  PA_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
+
+//------------------------------------------------------------------------------
+// Tool-Supplied Annotations
+//------------------------------------------------------------------------------
+
+// PA_TS_UNCHECKED should be placed around lock expressions that are not valid
+// C++ syntax, but which are present for documentation purposes.  These
+// annotations will be ignored by the analysis.
+#define PA_TS_UNCHECKED(x) ""
+
+// PA_TS_FIXME is used to mark lock expressions that are not valid C++ syntax.
+// It is used by automated tools to mark and disable invalid expressions.
+// The annotation should either be fixed, or changed to PA_TS_UNCHECKED.
+#define PA_TS_FIXME(x) ""
+
+// Like PA_NO_THREAD_SAFETY_ANALYSIS, this turns off checking within the body of
+// a particular function.  However, this attribute is used to mark functions
+// that are incorrect and need to be fixed.  It is used by automated tools to
+// avoid breaking the build when the analysis is updated.
+// Code owners are expected to eventually fix the routine.
+#define PA_NO_THREAD_SAFETY_ANALYSIS_FIXME PA_NO_THREAD_SAFETY_ANALYSIS
+
+// Similar to PA_NO_THREAD_SAFETY_ANALYSIS_FIXME, this macro marks a
+// PA_GUARDED_BY annotation that needs to be fixed, because it is producing
+// thread safety warning.  It disables the PA_GUARDED_BY.
+#define PA_GUARDED_BY_FIXME(x)
+
+// Disables warnings for a single read operation.  This can be used to avoid
+// warnings when it is known that the read is not actually involved in a race,
+// but the compiler cannot confirm that.
+#define PA_TS_UNCHECKED_READ(x) \
+  partition_alloc::internal::thread_safety_analysis::ts_unchecked_read(x)
+
+namespace partition_alloc::internal::thread_safety_analysis {
+
+// Takes a reference to a guarded data member, and returns an unguarded
+// reference.
+template <typename T>
+inline const T& ts_unchecked_read(const T& v) PA_NO_THREAD_SAFETY_ANALYSIS {
+  return v;
+}
+
+template <typename T>
+inline T& ts_unchecked_read(T& v) PA_NO_THREAD_SAFETY_ANALYSIS {
+  return v;
+}
+
+}  // namespace partition_alloc::internal::thread_safety_analysis
+
+// The above is imported as-is from abseil-cpp. The following Chromium-specific
+// synonyms are added for Chromium concepts (SequenceChecker/ThreadChecker).
+#if DCHECK_IS_ON()
+
+// Equivalent to PA_GUARDED_BY for SequenceChecker/ThreadChecker. Currently,
+#define PA_GUARDED_BY_CONTEXT(name) PA_GUARDED_BY(name)
+
+// Equivalent to PA_EXCLUSIVE_LOCKS_REQUIRED for SequenceChecker/ThreadChecker.
+#define PA_VALID_CONTEXT_REQUIRED(name) PA_EXCLUSIVE_LOCKS_REQUIRED(name)
+
+#else  // DCHECK_IS_ON()
+
+#define PA_GUARDED_BY_CONTEXT(name)
+#define PA_VALID_CONTEXT_REQUIRED(name)
+
+#endif  // DCHECK_IS_ON()
+
+#endif  // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_
diff --git a/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.cc b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.cc
new file mode 100644
index 0000000..937f4174
--- /dev/null
+++ b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.cc
@@ -0,0 +1,58 @@
+// Copyright (c) 2018 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 "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class PA_LOCKABLE Lock {
+ public:
+  void Acquire() PA_EXCLUSIVE_LOCK_FUNCTION() {}
+  void Release() PA_UNLOCK_FUNCTION() {}
+};
+
+class PA_SCOPED_LOCKABLE AutoLock {
+ public:
+  AutoLock(Lock& lock) PA_EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
+    lock.Acquire();
+  }
+  ~AutoLock() PA_UNLOCK_FUNCTION() { lock_.Release(); }
+
+ private:
+  Lock& lock_;
+};
+
+class ThreadSafe {
+ public:
+  void ExplicitIncrement();
+  void ImplicitIncrement();
+
+ private:
+  Lock lock_;
+  int counter_ PA_GUARDED_BY(lock_);
+};
+
+void ThreadSafe::ExplicitIncrement() {
+  lock_.Acquire();
+  ++counter_;
+  lock_.Release();
+}
+
+void ThreadSafe::ImplicitIncrement() {
+  AutoLock auto_lock(lock_);
+  counter_++;
+}
+
+TEST(PartitionAllocThreadAnnotationsTest, ExplicitIncrement) {
+  ThreadSafe thread_safe;
+  thread_safe.ExplicitIncrement();
+}
+TEST(PartitionAllocThreadAnnotationsTest, ImplicitIncrement) {
+  ThreadSafe thread_safe;
+  thread_safe.ImplicitIncrement();
+}
+
+}  // anonymous namespace
diff --git a/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.nc b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.nc
new file mode 100644
index 0000000..259b53a
--- /dev/null
+++ b/base/allocator/partition_allocator/partition_alloc_base/thread_annotations_pa_unittest.nc
@@ -0,0 +1,71 @@
+// Copyright 2018 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.
+
+// This is a "No Compile Test" suite.
+// https://dev.chromium.org/developers/testing/no-compile-tests
+
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
+
+namespace {
+
+class PA_LOCKABLE Lock {
+ public:
+  void Acquire() PA_EXCLUSIVE_LOCK_FUNCTION() {}
+  void Release() PA_UNLOCK_FUNCTION() {}
+};
+
+class PA_SCOPED_LOCKABLE AutoLock {
+ public:
+  AutoLock(Lock& lock) PA_EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
+    lock.Acquire();
+  }
+  ~AutoLock() PA_UNLOCK_FUNCTION() { lock_.Release(); }
+
+ private:
+  Lock& lock_;
+};
+class ThreadSafe {
+ public:
+  void BuggyIncrement();
+ private:
+  Lock lock_;
+  int counter_ PA_GUARDED_BY(lock_);
+};
+
+#if defined(NCTEST_LOCK_WITHOUT_UNLOCK)  // [r"fatal error: mutex 'lock_' is still held at the end of function"]
+
+void ThreadSafe::BuggyIncrement() {
+  lock_.Acquire();
+  ++counter_;
+  // Forgot to release the lock.
+}
+
+#elif defined(NCTEST_ACCESS_WITHOUT_LOCK)  // [r"fatal error: writing variable 'counter_' requires holding mutex 'lock_' exclusively"]
+
+void ThreadSafe::BuggyIncrement() {
+  // Member access without holding the lock guarding it.
+  ++counter_;
+}
+
+#elif defined(NCTEST_ACCESS_WITHOUT_SCOPED_LOCK)  // [r"fatal error: writing variable 'counter_' requires holding mutex 'lock_' exclusively"]
+
+void ThreadSafe::BuggyIncrement() {
+  {
+    AutoLock auto_lock(lock_);
+    // The AutoLock will go out of scope before the guarded member access.
+  }
+  ++counter_;
+}
+
+#elif defined(NCTEST_GUARDED_BY_WRONG_TYPE)  // [r"fatal error: 'guarded_by' attribute requires arguments whose type is annotated"]
+
+int not_lockable;
+int global_counter PA_GUARDED_BY(not_lockable);
+
+// Defined to avoid link error.
+void ThreadSafe::BuggyIncrement() { }
+
+#endif
+
+}  // anonymous namespace
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index 49c031a..e65dbc8 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -27,6 +27,7 @@
 #include "base/allocator/partition_allocator/partition_alloc_base/logging.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/numerics/checked_math.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/rand_util.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
@@ -4371,16 +4372,16 @@
     root.Free(ptr);
 
   // Still have some committed empty slot spans.
-  // TS_UNCHECKED_READ() is not an issue here, since everything is
+  // PA_TS_UNCHECKED_READ() is not an issue here, since everything is
   // single-threaded.
-  EXPECT_GT(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes), 0u);
+  EXPECT_GT(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes), 0u);
   // But not all, as the cap triggered.
-  EXPECT_LT(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
+  EXPECT_LT(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
             single_slot_count * single_slot_size);
 
   // Nothing left after explicit purge.
   root.PurgeMemory(PurgeFlags::kDecommitEmptySlotSpans);
-  EXPECT_EQ(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes), 0u);
+  EXPECT_EQ(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes), 0u);
 
   for (void* ptr : allocated_memory)
     root.Free(ptr);
@@ -4415,7 +4416,7 @@
   single_slot_allocated_memory.clear();
 
   // Some of the free()-s above overflowed the slot span ring.
-  EXPECT_EQ(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
+  EXPECT_EQ(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
             kDefaultEmptySlotSpanRingSize * bucket_size);
 
   // Now can cache more slot spans.
@@ -4432,7 +4433,7 @@
   single_slot_allocated_memory.clear();
 
   // No overflow this time.
-  EXPECT_EQ(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
+  EXPECT_EQ(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
             single_slot_large_count * bucket_size);
 
   constexpr size_t single_slot_too_many_count = kMaxFreeableSpans + 10;
@@ -4446,7 +4447,7 @@
   single_slot_allocated_memory.clear();
 
   // Overflow still works.
-  EXPECT_EQ(TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
+  EXPECT_EQ(PA_TS_UNCHECKED_READ(root.empty_slot_spans_dirty_bytes),
             kMaxFreeableSpans * bucket_size);
 }
 
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc
index 6f43d030..840d062 100644
--- a/base/allocator/partition_allocator/partition_bucket.cc
+++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -18,6 +18,7 @@
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/debug/alias.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/immediate_crash.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
@@ -40,7 +41,7 @@
 template <bool thread_safe>
 [[noreturn]] NOINLINE void PartitionOutOfMemoryMappingFailure(
     PartitionRoot<thread_safe>* root,
-    size_t size) LOCKS_EXCLUDED(root->lock_) {
+    size_t size) PA_LOCKS_EXCLUDED(root->lock_) {
   PA_NO_CODE_FOLDING();
   root->OutOfMemory(size);
   PA_IMMEDIATE_CRASH();  // Not required, kept as documentation.
@@ -49,7 +50,7 @@
 template <bool thread_safe>
 [[noreturn]] NOINLINE void PartitionOutOfMemoryCommitFailure(
     PartitionRoot<thread_safe>* root,
-    size_t size) LOCKS_EXCLUDED(root->lock_) {
+    size_t size) PA_LOCKS_EXCLUDED(root->lock_) {
   PA_NO_CODE_FOLDING();
   root->OutOfMemory(size);
   PA_IMMEDIATE_CRASH();  // Not required, kept as documentation.
diff --git a/base/allocator/partition_allocator/partition_bucket.h b/base/allocator/partition_allocator/partition_bucket.h
index b4037fb..ebf2d55 100644
--- a/base/allocator/partition_allocator/partition_bucket.h
+++ b/base/allocator/partition_allocator/partition_bucket.h
@@ -8,12 +8,12 @@
 #include <cstddef>
 #include <cstdint>
 
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
-#include "base/thread_annotations.h"
 
 namespace partition_alloc::internal {
 
@@ -76,7 +76,7 @@
                                                size_t raw_size,
                                                size_t slot_span_alignment,
                                                bool* is_already_zeroed)
-      EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
 
   ALWAYS_INLINE bool CanStoreRawSize() const {
     // For direct-map as well as single-slot slot spans (recognized by checking
@@ -164,14 +164,14 @@
   ALWAYS_INLINE SlotSpanMetadata<thread_safe>* AllocNewSlotSpan(
       PartitionRoot<thread_safe>* root,
       unsigned int flags,
-      size_t slot_span_alignment) EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
+      size_t slot_span_alignment) PA_EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
 
   // Allocates a new super page from the current extent, if possible. All
   // slot-spans will be in the decommitted state. Returns the address of the
   // super page's payload, or 0 on error.
   ALWAYS_INLINE uintptr_t AllocNewSuperPage(PartitionRoot<thread_safe>* root,
                                             unsigned int flags)
-      EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
 
   // Each bucket allocates a slot span when it runs out of slots.
   // A slot span's size is equal to get_pages_per_slot_span() number of
@@ -194,7 +194,7 @@
   ALWAYS_INLINE uintptr_t
   ProvisionMoreSlotsAndAllocOne(PartitionRoot<thread_safe>* root,
                                 SlotSpanMetadata<thread_safe>* slot_span)
-      EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(root->lock_);
 };
 
 }  // namespace partition_alloc::internal
diff --git a/base/allocator/partition_allocator/partition_lock.h b/base/allocator/partition_allocator/partition_lock.h
index 679a0ef..0a4095ab 100644
--- a/base/allocator/partition_allocator/partition_lock.h
+++ b/base/allocator/partition_allocator/partition_lock.h
@@ -10,19 +10,19 @@
 
 #include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/immediate_crash.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/spinning_mutex.h"
 #include "base/dcheck_is_on.h"
-#include "base/thread_annotations.h"
 #include "build/build_config.h"
 
 namespace partition_alloc::internal {
 
-class LOCKABLE Lock {
+class PA_LOCKABLE Lock {
  public:
   inline constexpr Lock();
-  void Acquire() EXCLUSIVE_LOCK_FUNCTION() {
+  void Acquire() PA_EXCLUSIVE_LOCK_FUNCTION() {
 #if DCHECK_IS_ON()
     // When PartitionAlloc is malloc(), it can easily become reentrant. For
     // instance, a DCHECK() triggers in external code (such as
@@ -59,14 +59,14 @@
 #endif
   }
 
-  void Release() UNLOCK_FUNCTION() {
+  void Release() PA_UNLOCK_FUNCTION() {
 #if DCHECK_IS_ON()
     owning_thread_ref_.store(base::PlatformThreadRef(),
                              std::memory_order_release);
 #endif
     lock_.Release();
   }
-  void AssertAcquired() const ASSERT_EXCLUSIVE_LOCK() {
+  void AssertAcquired() const PA_ASSERT_EXCLUSIVE_LOCK() {
     lock_.AssertAcquired();
 #if DCHECK_IS_ON()
     PA_DCHECK(owning_thread_ref_.load(std ::memory_order_acquire) ==
@@ -74,7 +74,7 @@
 #endif
   }
 
-  void Reinit() UNLOCK_FUNCTION() {
+  void Reinit() PA_UNLOCK_FUNCTION() {
     lock_.AssertAcquired();
 #if DCHECK_IS_ON()
     owning_thread_ref_.store(base::PlatformThreadRef(),
@@ -93,23 +93,25 @@
 #endif
 };
 
-class SCOPED_LOCKABLE ScopedGuard {
+class PA_SCOPED_LOCKABLE ScopedGuard {
  public:
-  explicit ScopedGuard(Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
+  explicit ScopedGuard(Lock& lock) PA_EXCLUSIVE_LOCK_FUNCTION(lock)
+      : lock_(lock) {
     lock_.Acquire();
   }
-  ~ScopedGuard() UNLOCK_FUNCTION() { lock_.Release(); }
+  ~ScopedGuard() PA_UNLOCK_FUNCTION() { lock_.Release(); }
 
  private:
   Lock& lock_;
 };
 
-class SCOPED_LOCKABLE ScopedUnlockGuard {
+class PA_SCOPED_LOCKABLE ScopedUnlockGuard {
  public:
-  explicit ScopedUnlockGuard(Lock& lock) UNLOCK_FUNCTION(lock) : lock_(lock) {
+  explicit ScopedUnlockGuard(Lock& lock) PA_UNLOCK_FUNCTION(lock)
+      : lock_(lock) {
     lock_.Release();
   }
-  ~ScopedUnlockGuard() EXCLUSIVE_LOCK_FUNCTION() { lock_.Acquire(); }
+  ~ScopedUnlockGuard() PA_EXCLUSIVE_LOCK_FUNCTION() { lock_.Acquire(); }
 
  private:
   Lock& lock_;
diff --git a/base/allocator/partition_allocator/partition_lock_unittest.cc b/base/allocator/partition_allocator/partition_lock_unittest.cc
index 66fa168..c0e0a66c 100644
--- a/base/allocator/partition_allocator/partition_lock_unittest.cc
+++ b/base/allocator/partition_allocator/partition_lock_unittest.cc
@@ -5,6 +5,7 @@
 #include "base/allocator/partition_allocator/partition_lock.h"
 
 #include "base/allocator/partition_allocator/partition_alloc_base/migration_adapter.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
 #include "build/build_config.h"
@@ -178,7 +179,7 @@
   explicit ThreadDelegateForAssertAcquiredAnotherThreadHoldsTheLock(Lock& lock)
       : lock_(lock) {}
 
-  void ThreadMain() NO_THREAD_SAFETY_ANALYSIS override { lock_.Acquire(); }
+  void ThreadMain() PA_NO_THREAD_SAFETY_ANALYSIS override { lock_.Acquire(); }
 
  private:
   Lock& lock_;
@@ -188,8 +189,8 @@
 
 TEST(PartitionAllocLockTest, AssertAcquiredAnotherThreadHoldsTheLock) {
   Lock lock;
-  // NO_THREAD_SAFETY_ANALYSIS: The checker rightfully points out that the lock
-  // is still held at the end of the function, which is what we want here.
+  // PA_NO_THREAD_SAFETY_ANALYSIS: The checker rightfully points out that the
+  // lock is still held at the end of the function, which is what we want here.
   ThreadDelegateForAssertAcquiredAnotherThreadHoldsTheLock delegate(lock);
   base::PlatformThreadHandle handle;
   base::PlatformThreadForTesting::Create(0, &delegate, &handle);
@@ -209,7 +210,7 @@
  public:
   explicit ThreadDelegateForReinitInOtherThread(Lock& lock) : lock_(lock) {}
 
-  void ThreadMain() NO_THREAD_SAFETY_ANALYSIS override {
+  void ThreadMain() PA_NO_THREAD_SAFETY_ANALYSIS override {
     lock_.Reinit();
     lock_.Acquire();
     lock_.Release();
@@ -223,7 +224,7 @@
 
 // On Apple OSes, it is not allowed to unlock a lock from another thread, so
 // we need to re-initialize it.
-TEST(PartitionAllocLockTest, ReinitInOtherThread) NO_THREAD_SAFETY_ANALYSIS {
+TEST(PartitionAllocLockTest, ReinitInOtherThread) PA_NO_THREAD_SAFETY_ANALYSIS {
   Lock lock;
   lock.Acquire();
 
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h
index 065be91..08ecac8 100644
--- a/base/allocator/partition_allocator/partition_page.h
+++ b/base/allocator/partition_allocator/partition_page.h
@@ -15,6 +15,7 @@
 #include "base/allocator/partition_allocator/address_pool_manager_types.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
@@ -27,7 +28,6 @@
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
 #include "base/dcheck_is_on.h"
-#include "base/thread_annotations.h"
 #include "build/build_config.h"
 
 #if BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT)
@@ -704,7 +704,7 @@
 
 template <bool thread_safe>
 ALWAYS_INLINE void SlotSpanMetadata<thread_safe>::Free(uintptr_t slot_start)
-    EXCLUSIVE_LOCKS_REQUIRED(
+    PA_EXCLUSIVE_LOCKS_REQUIRED(
         PartitionRoot<thread_safe>::FromSlotSpan(this)->lock_) {
 #if DCHECK_IS_ON()
   auto* root = PartitionRoot<thread_safe>::FromSlotSpan(this);
@@ -738,7 +738,7 @@
     PartitionFreelistEntry* head,
     PartitionFreelistEntry* tail,
     size_t number_of_freed)
-    EXCLUSIVE_LOCKS_REQUIRED(
+    PA_EXCLUSIVE_LOCKS_REQUIRED(
         PartitionRoot<thread_safe>::FromSlotSpan(this)->lock_) {
 #if DCHECK_IS_ON()
   auto* root = PartitionRoot<thread_safe>::FromSlotSpan(this);
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc
index c6b4727..37c6429 100644
--- a/base/allocator/partition_allocator/partition_root.cc
+++ b/base/allocator/partition_allocator/partition_root.cc
@@ -12,6 +12,7 @@
 #include "base/allocator/partition_allocator/page_allocator.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
@@ -80,7 +81,7 @@
 
   void Enumerate(EnumerateCallback callback,
                  bool in_child,
-                 EnumerateOrder order) NO_THREAD_SAFETY_ANALYSIS {
+                 EnumerateOrder order) PA_NO_THREAD_SAFETY_ANALYSIS {
     if (order == kNormal) {
       ThreadSafePartitionRoot* root;
       for (root = Head(partition_roots_); root != nullptr;
@@ -131,7 +132,7 @@
   }
 
   ThreadSafePartitionRoot* Tail(ThreadSafePartitionRoot* roots)
-      NO_THREAD_SAFETY_ANALYSIS {
+      PA_NO_THREAD_SAFETY_ANALYSIS {
     if (!roots)
       return nullptr;
     ThreadSafePartitionRoot* node = roots;
@@ -141,7 +142,7 @@
   }
 
   ThreadSafePartitionRoot* partition_roots_
-      GUARDED_BY(ThreadSafePartitionRoot::GetEnumeratorLock()) = nullptr;
+      PA_GUARDED_BY(ThreadSafePartitionRoot::GetEnumeratorLock()) = nullptr;
 };
 
 }  // namespace internal
@@ -155,14 +156,14 @@
 #if defined(PA_HAS_ATFORK_HANDLER)
 
 void LockRoot(PartitionRoot<internal::ThreadSafe>* root,
-              bool) NO_THREAD_SAFETY_ANALYSIS {
+              bool) PA_NO_THREAD_SAFETY_ANALYSIS {
   PA_DCHECK(root);
   root->lock_.Acquire();
 }
 
-// NO_THREAD_SAFETY_ANALYSIS: acquires the lock and doesn't release it, by
+// PA_NO_THREAD_SAFETY_ANALYSIS: acquires the lock and doesn't release it, by
 // design.
-void BeforeForkInParent() NO_THREAD_SAFETY_ANALYSIS {
+void BeforeForkInParent() PA_NO_THREAD_SAFETY_ANALYSIS {
   // ThreadSafePartitionRoot::GetLock() is private. So use
   // g_root_enumerator_lock here.
   g_root_enumerator_lock.Acquire();
@@ -174,7 +175,7 @@
 }
 
 template <typename T>
-void UnlockOrReinit(T& lock, bool in_child) NO_THREAD_SAFETY_ANALYSIS {
+void UnlockOrReinit(T& lock, bool in_child) PA_NO_THREAD_SAFETY_ANALYSIS {
   // Only re-init the locks in the child process, in the parent can unlock
   // normally.
   if (in_child)
@@ -184,11 +185,11 @@
 }
 
 void UnlockOrReinitRoot(PartitionRoot<internal::ThreadSafe>* root,
-                        bool in_child) NO_THREAD_SAFETY_ANALYSIS {
+                        bool in_child) PA_NO_THREAD_SAFETY_ANALYSIS {
   UnlockOrReinit(root->lock_, in_child);
 }
 
-void ReleaseLocks(bool in_child) NO_THREAD_SAFETY_ANALYSIS {
+void ReleaseLocks(bool in_child) PA_NO_THREAD_SAFETY_ANALYSIS {
   // In reverse order, even though there are no lock ordering dependencies.
   UnlockOrReinit(ThreadCacheRegistry::GetLock(), in_child);
   internal::PartitionRootEnumerator::Instance().Enumerate(
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h
index a3efe89..051b81d 100644
--- a/base/allocator/partition_allocator/partition_root.h
+++ b/base/allocator/partition_allocator/partition_root.h
@@ -43,6 +43,7 @@
 #include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc-inl.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
@@ -294,8 +295,8 @@
   std::atomic<size_t> max_size_of_committed_pages{0};
   std::atomic<size_t> total_size_of_super_pages{0};
   std::atomic<size_t> total_size_of_direct_mapped_pages{0};
-  size_t total_size_of_allocated_bytes GUARDED_BY(lock_) = 0;
-  size_t max_size_of_allocated_bytes GUARDED_BY(lock_) = 0;
+  size_t total_size_of_allocated_bytes PA_GUARDED_BY(lock_) = 0;
+  size_t max_size_of_allocated_bytes PA_GUARDED_BY(lock_) = 0;
   // Atomic, because system calls can be made without the lock held.
   std::atomic<uint64_t> syscall_count{};
   std::atomic<uint64_t> syscall_total_time_ns{};
@@ -308,7 +309,7 @@
   // either been used for a memory allocation, and/or contains freelist
   // entries. But it might have been moved to swap. Note that all this memory
   // can be decommitted at any time.
-  size_t empty_slot_spans_dirty_bytes GUARDED_BY(lock_) = 0;
+  size_t empty_slot_spans_dirty_bytes PA_GUARDED_BY(lock_) = 0;
 
   // Only tolerate up to |total_size_of_committed_pages >>
   // max_empty_slot_spans_dirty_bytes_shift| dirty bytes in empty slot
@@ -323,11 +324,12 @@
   uintptr_t next_partition_page_end = 0;
   SuperPageExtentEntry* current_extent = nullptr;
   SuperPageExtentEntry* first_extent = nullptr;
-  DirectMapExtent* direct_map_list GUARDED_BY(lock_) = nullptr;
-  SlotSpan* global_empty_slot_span_ring[internal::kMaxFreeableSpans] GUARDED_BY(
-      lock_) = {};
-  int16_t global_empty_slot_span_ring_index GUARDED_BY(lock_) = 0;
-  int16_t global_empty_slot_span_ring_size GUARDED_BY(lock_) =
+  DirectMapExtent* direct_map_list PA_GUARDED_BY(lock_) = nullptr;
+  SlotSpan*
+      global_empty_slot_span_ring[internal::kMaxFreeableSpans] PA_GUARDED_BY(
+          lock_) = {};
+  int16_t global_empty_slot_span_ring_index PA_GUARDED_BY(lock_) = 0;
+  int16_t global_empty_slot_span_ring_size PA_GUARDED_BY(lock_) =
       internal::kDefaultEmptySlotSpanRingSize;
 
   // Integrity check = ~reinterpret_cast<uintptr_t>(this).
@@ -380,34 +382,34 @@
       uintptr_t address);
 
   ALWAYS_INLINE void DecreaseTotalSizeOfAllocatedBytes(SlotSpan* slot_span)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void IncreaseTotalSizeOfAllocatedBytes(SlotSpan* slot_span,
                                                        size_t raw_size)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void DecreaseTotalSizeOfAllocatedBytes(uintptr_t addr,
                                                        size_t len)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void IncreaseTotalSizeOfAllocatedBytes(uintptr_t addr,
                                                        size_t len,
                                                        size_t raw_size)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void IncreaseCommittedPages(size_t len);
   ALWAYS_INLINE void DecreaseCommittedPages(size_t len);
   ALWAYS_INLINE void DecommitSystemPagesForData(
       uintptr_t address,
       size_t length,
       PageAccessibilityDisposition accessibility_disposition)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void RecommitSystemPagesForData(
       uintptr_t address,
       size_t length,
       PageAccessibilityDisposition accessibility_disposition)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE bool TryRecommitSystemPagesForData(
       uintptr_t address,
       size_t length,
       PageAccessibilityDisposition accessibility_disposition)
-      LOCKS_EXCLUDED(lock_);
+      PA_LOCKS_EXCLUDED(lock_);
 
   [[noreturn]] NOINLINE void OutOfMemory(size_t size);
 
@@ -493,7 +495,8 @@
 
   // Reduces the size of the empty slot spans ring, until the dirty size is <=
   // |limit|.
-  void ShrinkEmptySlotSpansRing(size_t limit) EXCLUSIVE_LOCKS_REQUIRED(lock_);
+  void ShrinkEmptySlotSpansRing(size_t limit)
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   // The empty slot span ring starts "small", can be enlarged later. This
   // improves performance by performing fewer system calls, at the cost of more
   // memory usage.
@@ -513,17 +516,17 @@
                                     bool with_denser_bucket_distribution);
 
   ALWAYS_INLINE void FreeInSlotSpan(uintptr_t slot_start, SlotSpan* slot_span)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   // Frees memory, with |slot_start| as returned by |RawAlloc()|.
   ALWAYS_INLINE void RawFree(uintptr_t slot_start);
   ALWAYS_INLINE void RawFree(uintptr_t slot_start, SlotSpan* slot_span)
-      LOCKS_EXCLUDED(lock_);
+      PA_LOCKS_EXCLUDED(lock_);
 
   ALWAYS_INLINE void RawFreeBatch(FreeListEntry* head,
                                   FreeListEntry* tail,
                                   size_t size,
-                                  SlotSpan* slot_span) LOCKS_EXCLUDED(lock_);
+                                  SlotSpan* slot_span) PA_LOCKS_EXCLUDED(lock_);
 
   ALWAYS_INLINE void RawFreeWithThreadCache(uintptr_t slot_start,
                                             SlotSpan* slot_span);
@@ -556,13 +559,13 @@
   size_t get_total_size_of_allocated_bytes() const {
     // Since this is only used for bookkeeping, we don't care if the value is
     // stale, so no need to get a lock here.
-    return TS_UNCHECKED_READ(total_size_of_allocated_bytes);
+    return PA_TS_UNCHECKED_READ(total_size_of_allocated_bytes);
   }
 
   size_t get_max_size_of_allocated_bytes() const {
     // Since this is only used for bookkeeping, we don't care if the value is
     // stale, so no need to get a lock here.
-    return TS_UNCHECKED_READ(max_size_of_allocated_bytes);
+    return PA_TS_UNCHECKED_READ(max_size_of_allocated_bytes);
   }
 
   internal::pool_handle ChoosePool() const {
@@ -805,25 +808,25 @@
                                           size_t slot_span_alignment,
                                           size_t* usable_size,
                                           bool* is_already_zeroed)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   bool TryReallocInPlaceForNormalBuckets(void* ptr,
                                          SlotSpan* slot_span,
                                          size_t new_size);
   bool TryReallocInPlaceForDirectMap(
       internal::SlotSpanMetadata<thread_safe>* slot_span,
-      size_t requested_size) EXCLUSIVE_LOCKS_REQUIRED(lock_);
-  void DecommitEmptySlotSpans() EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      size_t requested_size) PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
+  void DecommitEmptySlotSpans() PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   ALWAYS_INLINE void RawFreeLocked(uintptr_t slot_start)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_);
   uintptr_t MaybeInitThreadCacheAndAlloc(uint16_t bucket_index,
                                          size_t* slot_size);
 
 #if defined(PA_USE_PARTITION_ROOT_ENUMERATOR)
   static internal::Lock& GetEnumeratorLock();
 
-  PartitionRoot* GUARDED_BY(GetEnumeratorLock()) next_root = nullptr;
-  PartitionRoot* GUARDED_BY(GetEnumeratorLock()) prev_root = nullptr;
+  PartitionRoot* PA_GUARDED_BY(GetEnumeratorLock()) next_root = nullptr;
+  PartitionRoot* PA_GUARDED_BY(GetEnumeratorLock()) prev_root = nullptr;
 
   friend class internal::PartitionRootEnumerator;
 #endif  // defined(PA_USE_PARTITION_ROOT_ENUMERATOR)
diff --git a/base/allocator/partition_allocator/random.cc b/base/allocator/partition_allocator/random.cc
index 68326b1..b355fe1 100644
--- a/base/allocator/partition_allocator/random.cc
+++ b/base/allocator/partition_allocator/random.cc
@@ -7,6 +7,7 @@
 #include <type_traits>
 
 #include "base/allocator/partition_allocator/partition_alloc_base/rand_util.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
 
 namespace partition_alloc {
@@ -27,15 +28,15 @@
 
  private:
   ::partition_alloc::internal::Lock lock_ = {};
-  bool initialized_ GUARDED_BY(lock_) = false;
+  bool initialized_ PA_GUARDED_BY(lock_) = false;
   union {
-    internal::base::InsecureRandomGenerator instance_ GUARDED_BY(lock_);
+    internal::base::InsecureRandomGenerator instance_ PA_GUARDED_BY(lock_);
     uint8_t instance_buffer_[sizeof(
-        internal::base::InsecureRandomGenerator)] GUARDED_BY(lock_) = {};
+        internal::base::InsecureRandomGenerator)] PA_GUARDED_BY(lock_) = {};
   };
 
   internal::base::InsecureRandomGenerator* GetGenerator()
-      EXCLUSIVE_LOCKS_REQUIRED(lock_) {
+      PA_EXCLUSIVE_LOCKS_REQUIRED(lock_) {
     if (!initialized_) {
       new (instance_buffer_) internal::base::InsecureRandomGenerator();
       initialized_ = true;
diff --git a/base/allocator/partition_allocator/spinning_mutex.h b/base/allocator/partition_allocator/spinning_mutex.h
index 7783d9f..3bf1e1e 100644
--- a/base/allocator/partition_allocator/spinning_mutex.h
+++ b/base/allocator/partition_allocator/spinning_mutex.h
@@ -9,12 +9,12 @@
 #include <atomic>
 
 #include "base/allocator/buildflags.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/yield_processor.h"
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
-#include "base/thread_annotations.h"
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_WIN)
@@ -65,18 +65,18 @@
 // any awareness of other threads' behavior. One exception: x86 macOS uses
 // os_unfair_lock() if available, which is the case for macOS >= 10.12, that is
 // most clients.
-class LOCKABLE BASE_EXPORT SpinningMutex {
+class PA_LOCKABLE BASE_EXPORT SpinningMutex {
  public:
   inline constexpr SpinningMutex();
-  ALWAYS_INLINE void Acquire() EXCLUSIVE_LOCK_FUNCTION();
-  ALWAYS_INLINE void Release() UNLOCK_FUNCTION();
-  ALWAYS_INLINE bool Try() EXCLUSIVE_TRYLOCK_FUNCTION(true);
+  ALWAYS_INLINE void Acquire() PA_EXCLUSIVE_LOCK_FUNCTION();
+  ALWAYS_INLINE void Release() PA_UNLOCK_FUNCTION();
+  ALWAYS_INLINE bool Try() PA_EXCLUSIVE_TRYLOCK_FUNCTION(true);
   void AssertAcquired() const {}  // Not supported.
-  void Reinit() UNLOCK_FUNCTION();
+  void Reinit() PA_UNLOCK_FUNCTION();
 
  private:
-  NOINLINE void AcquireSpinThenBlock() EXCLUSIVE_LOCK_FUNCTION();
-  void LockSlow() EXCLUSIVE_LOCK_FUNCTION();
+  NOINLINE void AcquireSpinThenBlock() PA_EXCLUSIVE_LOCK_FUNCTION();
+  void LockSlow() PA_EXCLUSIVE_LOCK_FUNCTION();
 
   // See below, the latency of PA_YIELD_PROCESSOR can be as high as ~150
   // cycles. Meanwhile, sleeping costs a few us. Spinning 64 times at 3GHz would
diff --git a/base/allocator/partition_allocator/starscan/pcscan_scheduling.h b/base/allocator/partition_allocator/starscan/pcscan_scheduling.h
index 9eefb1b..919cd81 100644
--- a/base/allocator/partition_allocator/starscan/pcscan_scheduling.h
+++ b/base/allocator/partition_allocator/starscan/pcscan_scheduling.h
@@ -8,6 +8,7 @@
 #include <atomic>
 #include <cstdint>
 
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
 #include "base/base_export.h"
@@ -128,8 +129,8 @@
   const ScheduleDelayedScanFunc schedule_delayed_scan_;
 
   Lock scheduler_lock_;
-  size_t hard_limit_ GUARDED_BY(scheduler_lock_){0};
-  base::TimeTicks earliest_next_scan_time_ GUARDED_BY(scheduler_lock_);
+  size_t hard_limit_ PA_GUARDED_BY(scheduler_lock_){0};
+  base::TimeTicks earliest_next_scan_time_ PA_GUARDED_BY(scheduler_lock_);
 
   friend class PartitionAllocPCScanMUAwareTaskBasedBackendTest;
 };
diff --git a/base/allocator/partition_allocator/thread_cache.h b/base/allocator/partition_allocator/thread_cache.h
index c5e551d..aeb4dfa 100644
--- a/base/allocator/partition_allocator/thread_cache.h
+++ b/base/allocator/partition_allocator/thread_cache.h
@@ -11,6 +11,7 @@
 #include <memory>
 
 #include "base/allocator/partition_allocator/partition_alloc_base/gtest_prod_util.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/time/time.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
@@ -157,7 +158,7 @@
 
   // Not using base::Lock as the object's constructor must be constexpr.
   internal::Lock lock_;
-  ThreadCache* list_head_ GUARDED_BY(GetLock()) = nullptr;
+  ThreadCache* list_head_ PA_GUARDED_BY(GetLock()) = nullptr;
   bool periodic_purge_is_initialized_ = false;
   internal::base::TimeDelta periodic_purge_next_interval_ =
       kDefaultPurgeInterval;
@@ -330,11 +331,11 @@
       ThreadCacheLimits::kLargeSizeThreshold;
 
   const ThreadCache* prev_for_testing() const
-      EXCLUSIVE_LOCKS_REQUIRED(ThreadCacheRegistry::GetLock()) {
+      PA_EXCLUSIVE_LOCKS_REQUIRED(ThreadCacheRegistry::GetLock()) {
     return prev_;
   }
   const ThreadCache* next_for_testing() const
-      EXCLUSIVE_LOCKS_REQUIRED(ThreadCacheRegistry::GetLock()) {
+      PA_EXCLUSIVE_LOCKS_REQUIRED(ThreadCacheRegistry::GetLock()) {
     return next_;
   }
 
@@ -425,8 +426,8 @@
 
   // Intrusive list since ThreadCacheRegistry::RegisterThreadCache() cannot
   // allocate.
-  ThreadCache* next_ GUARDED_BY(ThreadCacheRegistry::GetLock());
-  ThreadCache* prev_ GUARDED_BY(ThreadCacheRegistry::GetLock());
+  ThreadCache* next_ PA_GUARDED_BY(ThreadCacheRegistry::GetLock());
+  ThreadCache* prev_ PA_GUARDED_BY(ThreadCacheRegistry::GetLock());
 
   friend class ThreadCacheRegistry;
   friend class PartitionAllocThreadCacheTest;
diff --git a/base/allocator/partition_allocator/thread_cache_unittest.cc b/base/allocator/partition_allocator/thread_cache_unittest.cc
index 329f162..5a822df1 100644
--- a/base/allocator/partition_allocator/thread_cache_unittest.cc
+++ b/base/allocator/partition_allocator/thread_cache_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/allocator/partition_allocator/extended_api.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread_for_testing.h"
 #include "base/allocator/partition_allocator/partition_alloc_config.h"
 #include "base/allocator/partition_allocator/partition_lock.h"
@@ -661,7 +662,7 @@
         bucket_index_(bucket_index),
         with_denser_bucket_distribution_(with_denser_bucket_distribution) {}
 
-  void ThreadMain() override NO_THREAD_SAFETY_ANALYSIS {
+  void ThreadMain() override PA_NO_THREAD_SAFETY_ANALYSIS {
     FillThreadCacheAndReturnIndex(root_, kSmallSize,
                                   with_denser_bucket_distribution_);
     other_thread_tcache_ = root_->thread_cache_for_testing();
@@ -695,7 +696,7 @@
 }  // namespace
 
 TEST_P(PartitionAllocThreadCacheTest, MAYBE_PurgeAll)
-NO_THREAD_SAFETY_ANALYSIS {
+PA_NO_THREAD_SAFETY_ANALYSIS {
   std::atomic<bool> other_thread_started{false};
   std::atomic<bool> purge_called{false};
 
diff --git a/base/files/file_path.cc b/base/files/file_path.cc
index d0121e62..d077fbb8 100644
--- a/base/files/file_path.cc
+++ b/base/files/file_path.cc
@@ -47,9 +47,9 @@
 
 namespace {
 
-const char* const kCommonDoubleExtensionSuffixes[] = {"gz", "xz", "bz2",
-                                                      "z",  "bz", "lzma"};
-const char* const kCommonDoubleExtensions[] = { "user.js" };
+const char* const kCommonDoubleExtensionSuffixes[] = {
+    "bz", "bz2", "gz", "lz", "lzma", "lzo", "xz", "z", "zst"};
+const char* const kCommonDoubleExtensions[] = {"user.js"};
 
 const FilePath::CharType kStringTerminator = FILE_PATH_LITERAL('\0');
 
diff --git a/base/files/file_path_unittest.cc b/base/files/file_path_unittest.cc
index 49433d7..0b1d885 100644
--- a/base/files/file_path_unittest.cc
+++ b/base/files/file_path_unittest.cc
@@ -803,8 +803,12 @@
     { FPL("/foo.tar.bz"),            FPL(".tar.bz") },
     { FPL("/foo.tar.bz2"),           FPL(".tar.bz2") },
     { FPL("/foo.tar.gz"),            FPL(".tar.gz") },
+    { FPL("/foo.tar.lz"),            FPL(".tar.lz") },
+    { FPL("/foo.tar.lzma"),          FPL(".tar.lzma") },
+    { FPL("/foo.tar.lzo"),           FPL(".tar.lzo") },
     { FPL("/foo.tar.xz"),            FPL(".tar.xz") },
     { FPL("/foo.tar.z"),             FPL(".tar.z") },
+    { FPL("/foo.tar.zst"),           FPL(".tar.zst") },
     // `kCommonDoubleExtensions` cases.
     { FPL("/foo.1234.user.js"),      FPL(".user.js") },
     { FPL("foo.user.js"),            FPL(".user.js") },
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index afd1c9c4..80f84b1 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-8.20220520.3.1
+8.20220521.2.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 077f843..3bf2d9ca 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=104
 MINOR=0
-BUILD=5075
+BUILD=5077
 PATCH=0
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
index 3302fd6..e183a58 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -278,7 +278,8 @@
                     activityLifecycleDispatcher, tabModelSelector, tabContentManager,
                     browserControlsManager, tabCreatorManager, menuOrKeyboardActionController,
                     containerView, shareDelegateSupplier, multiWindowModeStateDispatcher,
-                    scrimCoordinator, /* rootView= */ containerView);
+                    scrimCoordinator, /* rootView= */ containerView, dynamicResourceLoaderSupplier,
+                    snackbarManager, modalDialogManager);
             mTabSwitcherCustomViewManagerSupplier.set(
                     mTabSwitcher.getTabSwitcherCustomViewManager());
         } else {
@@ -413,8 +414,7 @@
                 UserPrefs.get(Profile.getLastUsedRegularProfile()), mSnackbarManager);
 
         if (mTabSwitcher != null) {
-            mTabSwitcher.initWithNative(mActivity, mTabContentManager,
-                    mDynamicResourceLoaderSupplier.get(), mSnackbarManager, mModalDialogManager);
+            mTabSwitcher.initWithNative();
         }
         if (mTasksSurface != null) {
             mTasksSurface.onFinishNativeInitialization(mActivity, mOmniboxStubSupplier.get(),
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java
new file mode 100644
index 0000000..6670901
--- /dev/null
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java
@@ -0,0 +1,145 @@
+// Copyright 2022 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.
+
+package org.chromium.chrome.features.start_surface;
+
+import android.animation.Animator;
+import android.content.Context;
+import android.view.ViewGroup;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.base.TraceEvent;
+import org.chromium.chrome.browser.compositor.layouts.Layout;
+import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
+import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.layouts.EventFilter;
+import org.chromium.chrome.browser.layouts.LayoutType;
+import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer;
+import org.chromium.chrome.features.tasks.TasksSurface;
+
+/**
+ * A {@link Layout} that shows Start Surface home view.
+ */
+public class StartSurfaceHomeLayout extends Layout {
+    private static final String TAG = "SSHomeLayout";
+
+    private static final String TRACE_SHOW_START_SURFACE =
+            "StartSurfaceHomeLayout.Show.StartSurface";
+    private static final String TRACE_HIDE_START_SURFACE =
+            "StartSurfaceHomeLayout.Hide.StartSurface";
+    private static final String TRACE_DONE_SHOWING_START_SURFACE =
+            "StartSurfaceHomeLayout.DoneShowing";
+    private static final String TRACE_DONE_HIDING_START_SURFACE =
+            "StartSurfaceHomeLayout.DoneHiding";
+
+    private final SceneLayer mSceneLayer;
+    private final StartSurface mStartSurface;
+
+    private boolean mIsShown;
+    private boolean mIsInitialized;
+    private Animator mBackgroundTabAnimation;
+
+    /**
+     * The {@link Layout} is not usable until sizeChanged is called. This is convenient this way so
+     * we can pre-create the layout before the host is fully defined.
+     *
+     * @param context The current Android's context.
+     * @param updateHost The parent {@link LayoutUpdateHost}.
+     * @param renderHost The parent {@link LayoutRenderHost}.
+     */
+    public StartSurfaceHomeLayout(Context context, LayoutUpdateHost updateHost,
+            LayoutRenderHost renderHost, StartSurface startSurface) {
+        super(context, updateHost, renderHost);
+        mSceneLayer = new SceneLayer();
+        mStartSurface = startSurface;
+    }
+
+    @Override
+    public void onFinishNativeInitialization() {
+        if (mIsInitialized) return;
+
+        mIsInitialized = true;
+        mStartSurface.initWithNative();
+    }
+
+    @Override
+    public void destroy() {}
+
+    @Override
+    public void show(long time, boolean animate) {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_START_SURFACE)) {
+            super.show(time, animate);
+            // TODO(crbug.com/1315676): Call StartSurface#show here.
+            mIsShown = true;
+        }
+    }
+
+    @Override
+    public void startHiding(int nextTabId, boolean hintAtTabSelection) {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_START_SURFACE)) {
+            super.startHiding(nextTabId, hintAtTabSelection);
+            // TODO(crbug.com/1315676): Call StartSurface#hide here.
+            mIsShown = false;
+        }
+    }
+
+    @Override
+    public void doneHiding() {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_DONE_HIDING_START_SURFACE)) {
+            super.doneHiding();
+        }
+    }
+
+    @Override
+    public void doneShowing() {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_DONE_SHOWING_START_SURFACE)) {
+            super.doneShowing();
+        }
+    }
+
+    @Override
+    public boolean onBackPressed() {
+        return mStartSurface.getController().onBackPressed();
+    }
+
+    @Override
+    protected EventFilter getEventFilter() {
+        return null;
+    }
+
+    @Override
+    protected SceneLayer getSceneLayer() {
+        return mSceneLayer;
+    }
+
+    @Override
+    public void onTabCreated(long time, int id, int index, int sourceId, boolean newIsIncognito,
+            boolean background, float originX, float originY) {
+        super.onTabCreated(time, id, index, sourceId, newIsIncognito, background, originX, originY);
+        if (!background || newIsIncognito || !mIsShown) {
+            return;
+        }
+        TasksSurface primaryTasksSurface = mStartSurface.getPrimaryTasksSurface();
+        assert primaryTasksSurface != null;
+
+        if (mBackgroundTabAnimation != null && mBackgroundTabAnimation.isStarted()) {
+            mBackgroundTabAnimation.end();
+        }
+        mBackgroundTabAnimation =
+                BackgroundTabAnimation.create(this, (ViewGroup) primaryTasksSurface.getView(),
+                        originX, originY, getOrientation() == Orientation.PORTRAIT);
+        mBackgroundTabAnimation.start();
+    }
+
+    @VisibleForTesting
+    public StartSurface getStartSurfaceForTesting() {
+        return mStartSurface;
+    }
+
+    @Override
+    public int getLayoutType() {
+        return LayoutType.START_SURFACE;
+    }
+}
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java
index 0b82f51..1583039 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.features.tasks;
 
 import android.app.Activity;
-import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.view.LayoutInflater;
@@ -18,7 +17,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -27,11 +25,8 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherCustomViewManager;
-import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
-import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
-import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 
 /** Coordinator of the single tab tab switcher. */
 class SingleTabSwitcherCoordinator implements TabSwitcher {
@@ -131,9 +126,7 @@
     }
 
     @Override
-    public void initWithNative(Context context, TabContentManager tabContentManager,
-            DynamicResourceLoader dynamicResourceLoader, SnackbarManager snackbarManager,
-            ModalDialogManager modalDialogManager) {
+    public void initWithNative() {
         mTabListFaviconProvider.initWithNative(Profile.getLastUsedRegularProfile());
         mMediator.initWithNative();
     }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
index 1130ae5..e14a2b3a 100644
--- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
@@ -119,13 +119,15 @@
                     activity, activityLifecycleDispatcher, tabModelSelector, tabContentManager,
                     browserControlsStateProvider, tabCreatorManager, menuOrKeyboardActionController,
                     mView.getCarouselTabSwitcherContainer(), shareDelegateSupplier,
-                    multiWindowModeStateDispatcher, scrimCoordinator, rootView);
+                    multiWindowModeStateDispatcher, scrimCoordinator, rootView,
+                    dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager);
         } else if (tabSwitcherType == TabSwitcherType.GRID) {
             mTabSwitcher = TabManagementModuleProvider.getDelegate().createGridTabSwitcher(activity,
                     activityLifecycleDispatcher, tabModelSelector, tabContentManager,
                     browserControlsStateProvider, tabCreatorManager, menuOrKeyboardActionController,
                     mView.getBodyViewContainer(), shareDelegateSupplier,
-                    multiWindowModeStateDispatcher, scrimCoordinator, rootView);
+                    multiWindowModeStateDispatcher, scrimCoordinator, rootView,
+                    dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager);
         } else if (tabSwitcherType == TabSwitcherType.SINGLE) {
             mTabSwitcher = new SingleTabSwitcherCoordinator(
                     activity, mView.getCarouselTabSwitcherContainer(), tabModelSelector);
@@ -243,10 +245,7 @@
     @Override
     public void onFinishNativeInitialization(Context context, OmniboxStub omniboxStub,
             @Nullable FeedReliabilityLogger feedReliabilityLogger) {
-        if (mTabSwitcher != null) {
-            mTabSwitcher.initWithNative(context, mTabContentManager,
-                    mDynamicResourceLoaderSupplier.get(), mSnackbarManager, mModalDialogManager);
-        }
+        if (mTabSwitcher != null) mTabSwitcher.initWithNative();
 
         mMediator.initWithNative(omniboxStub, feedReliabilityLogger);
     }
diff --git a/chrome/android/features/start_surface/start_surface_java_sources.gni b/chrome/android/features/start_surface/start_surface_java_sources.gni
index 0dc54b4b..dc747ea0 100644
--- a/chrome/android/features/start_surface/start_surface_java_sources.gni
+++ b/chrome/android/features/start_surface/start_surface_java_sources.gni
@@ -18,6 +18,7 @@
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java",
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java",
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java",
+  "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceHomeLayout.java",
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java",
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java",
   "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
index 62d2aa9d..997bf64 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -31,6 +31,7 @@
 import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController;
 import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
 import org.chromium.components.module_installer.builder.ModuleInterface;
+import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 
 import java.lang.annotation.Retention;
@@ -67,6 +68,9 @@
      * @param multiWindowModeStateDispatcher Gives access to the multi window mode state.
      * @param scrimCoordinator The {@link ScrimCoordinator} to control the scrim view.
      * @param rootView The root view of the app.
+     * @param dynamicResourceLoaderSupplier Supplies the current {@link DynamicResourceLoader}.
+     * @param snackbarManager Manages the snackbar.
+     * @param modalDialogManager Manages modal dialogs.
      * @return The {@link TabSwitcher}.
      */
     TabSwitcher createGridTabSwitcher(@NonNull Activity activity,
@@ -79,7 +83,10 @@
             @NonNull ViewGroup containerView,
             @NonNull Supplier<ShareDelegate> shareDelegateSupplier,
             @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
-            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView);
+            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView,
+            @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier,
+            @NonNull SnackbarManager snackbarManager,
+            @NonNull ModalDialogManager modalDialogManager);
 
     /**
      * Create the {@link TabSwitcher} to display Tabs in carousel.
@@ -95,6 +102,9 @@
      * @param multiWindowModeStateDispatcher Gives access to the multi window mode state.
      * @param scrimCoordinator The {@link ScrimCoordinator} to control the scrim view.
      * @param rootView The root view of the app.
+     * @param dynamicResourceLoaderSupplier Supplies the current {@link DynamicResourceLoader}.
+     * @param snackbarManager Manages the snackbar.
+     * @param modalDialogManager Manages modal dialogs.
      * @return The {@link TabSwitcher}.
      */
     TabSwitcher createCarouselTabSwitcher(@NonNull Activity activity,
@@ -107,7 +117,10 @@
             @NonNull ViewGroup containerView,
             @NonNull Supplier<ShareDelegate> shareDelegateSupplier,
             @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
-            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView);
+            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView,
+            @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier,
+            @NonNull SnackbarManager snackbarManager,
+            @NonNull ModalDialogManager modalDialogManager);
 
     /**
      * Create the {@link TabGroupUi}.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
index 17cdfe28..ab2037b6 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
@@ -35,6 +35,7 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController;
 import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
+import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 
 /**
@@ -52,7 +53,10 @@
             @NonNull ViewGroup containerView,
             @NonNull Supplier<ShareDelegate> shareDelegateSupplier,
             @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
-            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView) {
+            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView,
+            @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier,
+            @NonNull SnackbarManager snackbarManager,
+            @NonNull ModalDialogManager modalDialogManager) {
         if (UmaSessionStats.isMetricsServiceAvailable()) {
             UmaSessionStats.registerSyntheticFieldTrial(
                     ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + SYNTHETIC_TRIAL_POSTFIX,
@@ -67,7 +71,7 @@
                                 && SysUtils.isLowEndDevice()
                         ? TabListCoordinator.TabListMode.LIST
                         : TabListCoordinator.TabListMode.GRID,
-                rootView);
+                rootView, dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager);
     }
 
     @Override
@@ -81,12 +85,16 @@
             @NonNull ViewGroup containerView,
             @NonNull Supplier<ShareDelegate> shareDelegateSupplier,
             @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
-            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView) {
+            @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView,
+            @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier,
+            @NonNull SnackbarManager snackbarManager,
+            @NonNull ModalDialogManager modalDialogManager) {
         return new TabSwitcherCoordinator(activity, lifecycleDispatcher, tabModelSelector,
                 tabContentManager, browserControls, tabCreatorManager,
                 menuOrKeyboardActionController, containerView, shareDelegateSupplier,
                 multiWindowModeStateDispatcher, scrimCoordinator,
-                TabListCoordinator.TabListMode.CAROUSEL, rootView);
+                TabListCoordinator.TabListMode.CAROUSEL, rootView, dynamicResourceLoaderSupplier,
+                snackbarManager, modalDialogManager);
     }
 
     @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
index 080ca16..0736bb0 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
@@ -4,10 +4,10 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
-import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.os.SystemClock;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -17,13 +17,9 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType;
-import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
-import org.chromium.ui.modaldialog.ModalDialogManager;
-import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 import org.chromium.ui.resources.dynamics.ViewResourceAdapter;
 
 import java.util.List;
@@ -52,11 +48,9 @@
     void setOnTabSelectingListener(OnTabSelectingListener listener);
 
     /**
-     * Called when the native initialization is completed.
+     * Called when native initialization is completed.
      */
-    void initWithNative(Context context, TabContentManager tabContentManager,
-            DynamicResourceLoader dynamicResourceLoader, SnackbarManager snackbarManager,
-            ModalDialogManager modalDialogManager);
+    void initWithNative();
 
     // TODO(1322733): Remove the following interfaces when we find a better way to notify the layout
     // that the GTS animation is finished.
@@ -124,6 +118,8 @@
          * @return Whether or not the TabSwitcher consumed the event.
          * @param isOnHomepage Whether the Start surface is showing.
          */
+        // TODO(crbug.com/1315676): Remove the parameter when tab switcher and start surface are
+        // decoupled.
         boolean onBackPressed(boolean isOnHomepage);
 
         /**
@@ -136,6 +132,8 @@
          * Called after the Chrome activity is launched.
          * @param activityCreationTimeMs {@link SystemClock#elapsedRealtime} at activity creation.
          */
+        // TODO(crbug.com/1315676): Remove this API when tab switcher and start surface are
+        // decoupled.
         void onOverviewShownAtLaunch(long activityCreationTimeMs);
 
         /**
@@ -164,7 +162,24 @@
          * Called when start surface is showing or hiding.
          * @param isOnHomepage Whether the Start surface is showing.
          */
+        // TODO(crbug.com/1315676): Remove this API when tab switcher and start surface are
+        // decoupled.
         void onHomepageChanged(boolean isOnHomepage);
+
+        /**
+         * Sets the parent view for snackbars. If <code>null</code> is given, the original parent
+         * view is restored.
+         *
+         * @param parentView The {@link ViewGroup} to attach snackbars to.
+         */
+        default void setSnackbarParentView(ViewGroup parentView){};
+
+        /**
+         * @return The Tab switcher container view.
+         */
+        default ViewGroup getTabSwitcherContainer() {
+            return null;
+        }
     }
 
     /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
index 290711b..638bd855 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -99,6 +99,7 @@
     // startedHiding() aren't always called for CAROUSEL tab switcher, thus we can't get its
     // visibility directly.
     private static boolean sIsGridTabSwitcherShowing;
+    private final Activity mActivity;
     private final PropertyModelChangeProcessor mContainerViewChangeProcessor;
     private final ActivityLifecycleDispatcher mLifecycleDispatcher;
     private final MenuOrKeyboardActionController mMenuOrKeyboardActionController;
@@ -110,6 +111,9 @@
     private final @TabListCoordinator.TabListMode int mMode;
     private final MessageCardProviderCoordinator mMessageCardProviderCoordinator;
     private final MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
+    private final Supplier<DynamicResourceLoader> mDynamicResourceLoaderSupplier;
+    private final SnackbarManager mSnackbarManager;
+    private final ModalDialogManager mModalDialogManager;
 
     private TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
     private TabGroupManualSelectionMode mTabGroupManualSelectionMode;
@@ -123,6 +127,7 @@
     private SharedPreferencesManager.Observer mPriceAnnotationsPrefObserver;
     private final ViewGroup mCoordinatorView;
     private final ViewGroup mRootView;
+    private TabContentManager mTabContentManager;
 
     private final MenuOrKeyboardActionController
             .MenuOrKeyboardActionHandler mTabSwitcherMenuActionHandler =
@@ -177,7 +182,11 @@
             @NonNull ViewGroup container, @NonNull Supplier<ShareDelegate> shareDelegateSupplier,
             @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
             @NonNull ScrimCoordinator scrimCoordinator, @TabListMode int mode,
-            @NonNull ViewGroup rootView) {
+            @NonNull ViewGroup rootView,
+            @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier,
+            @NonNull SnackbarManager snackbarManager,
+            @NonNull ModalDialogManager modalDialogManager) {
+        mActivity = activity;
         mMode = mode;
         mTabModelSelector = tabModelSelector;
         mContainer = container;
@@ -185,6 +194,10 @@
         mTabCreatorManager = tabCreatorManager;
         mMultiWindowModeStateDispatcher = multiWindowModeStateDispatcher;
         mRootView = rootView;
+        mTabContentManager = tabContentManager;
+        mDynamicResourceLoaderSupplier = dynamicResourceLoaderSupplier;
+        mSnackbarManager = snackbarManager;
+        mModalDialogManager = modalDialogManager;
 
         mTabSwitcherCustomViewManager =
                 new TabSwitcherCustomViewManager(new TabSwitcherCustomViewManager.Delegate() {
@@ -349,17 +362,15 @@
     }
 
     @Override
-    public void initWithNative(Context context, TabContentManager tabContentManager,
-            DynamicResourceLoader dynamicResourceLoader, SnackbarManager snackbarManager,
-            ModalDialogManager modalDialogManager) {
+    public void initWithNative() {
         if (mIsInitialized) return;
 
-        setUpTabGroupManualSelectionMode(context, tabContentManager);
+        setUpTabGroupManualSelectionMode(mActivity, mTabContentManager, mSnackbarManager);
 
-        mTabListCoordinator.initWithNative(dynamicResourceLoader);
+        mTabListCoordinator.initWithNative(mDynamicResourceLoaderSupplier.get());
         if (mTabGridDialogCoordinator != null) {
-            mTabGridDialogCoordinator.initWithNative(context, mTabModelSelector, tabContentManager,
-                    mTabListCoordinator.getTabGroupTitleEditor());
+            mTabGridDialogCoordinator.initWithNative(mActivity, mTabModelSelector,
+                    mTabContentManager, mTabListCoordinator.getTabGroupTitleEditor());
         }
 
         mMultiThumbnailCardProvider.initWithNative();
@@ -367,9 +378,9 @@
         if (mMode == TabListCoordinator.TabListMode.GRID) {
             if (CachedFeatureFlags.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)) {
                 mTabSuggestionsOrchestrator = new TabSuggestionsOrchestrator(
-                        context, mTabModelSelector, mLifecycleDispatcher);
+                        mActivity, mTabModelSelector, mLifecycleDispatcher);
                 TabSuggestionMessageService tabSuggestionMessageService =
-                        new TabSuggestionMessageService(context, mTabModelSelector,
+                        new TabSuggestionMessageService(mActivity, mTabModelSelector,
                                 mTabSelectionEditorCoordinator.getController());
                 mTabSuggestionsOrchestrator.addObserver(tabSuggestionMessageService);
                 mMessageCardProviderCoordinator.subscribeMessageService(
@@ -381,10 +392,10 @@
                         new NewTabTileCoordinator(mTabModelSelector, mTabCreatorManager);
             }
 
-            if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(context)
+            if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mActivity)
                     && !TabSwitcherCoordinator.isShowingTabsInMRUOrder(mMode)) {
                 mTabGridIphDialogCoordinator =
-                        new TabGridIphDialogCoordinator(context, mContainer, modalDialogManager);
+                        new TabGridIphDialogCoordinator(mActivity, mContainer, mModalDialogManager);
                 IphMessageService iphMessageService =
                         new IphMessageService(mTabGridIphDialogCoordinator);
                 mMessageCardProviderCoordinator.subscribeMessageService(iphMessageService);
@@ -392,13 +403,13 @@
         }
 
         // TODO(crbug.com/1222762): Only call setUpPriceTracking in GRID TabSwitcher.
-        setUpPriceTracking(context, modalDialogManager);
+        setUpPriceTracking(mActivity, mModalDialogManager);
 
         mIsInitialized = true;
     }
 
     private void setUpTabGroupManualSelectionMode(
-            Context context, TabContentManager tabContentManager) {
+            Context context, TabContentManager tabContentManager, SnackbarManager snackbarManager) {
         // For tab switcher in carousel mode, the selection editor should still follow grid style.
         int selectionEditorMode = mMode == TabListCoordinator.TabListMode.CAROUSEL
                 ? TabListCoordinator.TabListMode.GRID
@@ -406,7 +417,7 @@
         mTabSelectionEditorCoordinator =
                 new TabSelectionEditorCoordinator(context, mCoordinatorView, mTabModelSelector,
                         tabContentManager, selectionEditorMode, mRootView);
-        mMediator.initWithNative(mTabSelectionEditorCoordinator.getController());
+        mMediator.initWithNative(mTabSelectionEditorCoordinator.getController(), snackbarManager);
 
         mTabGroupManualSelectionMode = new TabGroupManualSelectionMode(
                 context.getString(R.string.tab_selection_editor_group),
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
new file mode 100644
index 0000000..ceb8fdcd
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
@@ -0,0 +1,693 @@
+// Copyright 2019 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.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat;
+
+import org.chromium.base.Log;
+import org.chromium.base.TraceEvent;
+import org.chromium.base.jank_tracker.JankScenario;
+import org.chromium.base.jank_tracker.JankTracker;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
+import org.chromium.chrome.browser.compositor.layouts.Layout;
+import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
+import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer;
+import org.chromium.chrome.browser.layouts.EventFilter;
+import org.chromium.chrome.browser.layouts.LayoutType;
+import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler;
+import org.chromium.chrome.browser.layouts.animation.CompositorAnimator;
+import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabUtils;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabListDelegate;
+import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver;
+import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
+import org.chromium.components.browser_ui.widget.animation.Interpolators;
+import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
+import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
+import org.chromium.components.version_info.VersionInfo;
+import org.chromium.ui.base.DeviceFormFactor;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.resources.ResourceManager;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * A {@link Layout} that shows all tabs in one grid or list view.
+ */
+public class TabSwitcherLayout extends Layout {
+    private static final String TAG = "TSLayout";
+
+    // Duration of the transition animation
+    public static final long ZOOMING_DURATION = 300;
+    private static final int TRANSLATE_DURATION_MS = 500;
+    private static final int BACKGROUND_FADING_DURATION_MS = 150;
+
+    private static final String TRACE_SHOW_TAB_SWITCHER = "TabSwitcherLayout.Show.TabSwitcher";
+    private static final String TRACE_HIDE_TAB_SWITCHER = "TabSwitcherLayout.Hide.TabSwitcher";
+    private static final String TRACE_DONE_SHOWING_TAB_SWITCHER = "TabSwitcherLayout.DoneShowing";
+    private static final String TRACE_DONE_HIDING_TAB_SWITCHER = "TabSwitcherLayout.DoneHiding";
+
+    // The transition animation from a tab to the tab switcher.
+    private AnimatorSet mTabToSwitcherAnimation;
+    private boolean mIsAnimating;
+
+    private TabListSceneLayer mSceneLayer;
+    private final TabSwitcher mTabSwitcher;
+    private final JankTracker mJankTracker;
+    private final TabSwitcher.Controller mController;
+    private final TabSwitcherViewObserver mTabSwitcherObserver;
+    @Nullable
+    private final ViewGroup mScrimAnchor;
+    @Nullable
+    private final ScrimCoordinator mScrimCoordinator;
+    private final TabSwitcher.TabListDelegate mGridTabListDelegate;
+
+    // Force the toolbar to finish its animation when this Layout finished hiding by setting
+    // setShowToolbar(true) on this dummy tab.
+    private final LayoutTab mDummyLayoutTab;
+    private boolean mIsInitialized;
+
+    private float mBackgroundAlpha;
+
+    private int mFrameCount;
+    private long mStartTime;
+    private long mLastFrameTime;
+    private long mMaxFrameInterval;
+    private int mStartFrame;
+
+    private boolean mAndroidViewFinishedShowing;
+
+    interface PerfListener {
+        void onAnimationDone(
+                int frameRendered, long elapsedMs, long maxFrameInterval, int dirtySpan);
+    }
+
+    private PerfListener mPerfListenerForTesting;
+
+    public TabSwitcherLayout(Context context, LayoutUpdateHost updateHost,
+            LayoutRenderHost renderHost, TabSwitcher tabSwitcher, JankTracker jankTracker,
+            @Nullable ViewGroup tabSwitcherScrimAnchor,
+            @Nullable ScrimCoordinator scrimCoordinator) {
+        super(context, updateHost, renderHost);
+        mDummyLayoutTab = createLayoutTab(Tab.INVALID_TAB_ID, false);
+        mDummyLayoutTab.setShowToolbar(true);
+        mTabSwitcher = tabSwitcher;
+        mController = mTabSwitcher.getController();
+        mTabSwitcher.setOnTabSelectingListener(this::onTabSelecting);
+        mGridTabListDelegate = mTabSwitcher.getTabListDelegate();
+        mJankTracker = jankTracker;
+        mScrimAnchor = tabSwitcherScrimAnchor;
+        mScrimCoordinator = scrimCoordinator;
+
+        mTabSwitcherObserver = new TabSwitcherViewObserver() {
+            @Override
+            public void startedShowing() {
+                mAndroidViewFinishedShowing = false;
+            }
+
+            @Override
+            public void finishedShowing() {
+                mAndroidViewFinishedShowing = true;
+                if (!TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(context)) {
+                    doneShowing();
+                }
+                // When Tab-to-GTS animation is done, it's time to renew the thumbnail without
+                // causing janky frames. When animation is off or not used, the thumbnail is already
+                // updated when showing the GTS. Tab-to-GTS animation is not invoked for tablet tab
+                // switcher polish.
+                if (isTabGtsAnimationEnabled()) {
+                    // Delay thumbnail taking a bit more to make it less likely to happen before the
+                    // thumbnail taking triggered by ThumbnailFetcher. See crbug.com/996385 for
+                    // details.
+                    new Handler().postDelayed(() -> {
+                        Tab currentTab = mTabModelSelector.getCurrentTab();
+                        if (currentTab != null) mTabContentManager.cacheTabThumbnail(currentTab);
+                        mLayoutTabs = null;
+                    }, ZOOMING_DURATION);
+                } else {
+                    // crbug.com/1176548, mLayoutTabs is used to capture thumbnail, null it in a
+                    // post delay handler to avoid creating a new pending surface in native, which
+                    // will hold the thumbnail capturing task.
+                    new Handler().postDelayed(() -> { mLayoutTabs = null; }, ZOOMING_DURATION);
+                }
+            }
+
+            @Override
+            public void startedHiding() {}
+
+            @Override
+            public void finishedHiding() {
+                // The Android View version of GTS overview is hidden.
+                // If not doing GTS-to-Tab transition animation, we show the fade-out instead, which
+                // was already done.
+                if (!isTabGtsAnimationEnabled()) {
+                    postHiding();
+                    return;
+                }
+                // If we are doing GTS-to-Tab transition animation, we start showing the Bitmap
+                // version of the GTS overview in the background while expanding the thumbnail to
+                // the viewport.
+                expandTab(getThumbnailLocationOfCurrentTab());
+            }
+        };
+
+        mController.addTabSwitcherViewObserver(mTabSwitcherObserver);
+    }
+
+    @Override
+    public void onFinishNativeInitialization() {
+        if (mIsInitialized) return;
+
+        mIsInitialized = true;
+        mTabSwitcher.initWithNative();
+        ensureSceneLayerCreated();
+        mSceneLayer.setTabModelSelector(mTabModelSelector);
+    }
+
+    // Layout implementation.
+    @Override
+    public void setTabModelSelector(TabModelSelector modelSelector, TabContentManager manager) {
+        super.setTabModelSelector(modelSelector, manager);
+        if (mSceneLayer != null) {
+            mSceneLayer.setTabModelSelector(modelSelector);
+        }
+    }
+
+    @Override
+    public LayoutTab getLayoutTab(int id) {
+        return mDummyLayoutTab;
+    }
+
+    @Override
+    public void destroy() {
+        mController.removeTabSwitcherViewObserver(mTabSwitcherObserver);
+    }
+
+    @Override
+    public void show(long time, boolean animate) {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_TAB_SWITCHER)) {
+            super.show(time, animate);
+
+            mJankTracker.startTrackingScenario(JankScenario.TAB_SWITCHER);
+
+            // Keep the current tab in mLayoutTabs even if we are not going to show the shrinking
+            // animation so that thumbnail taking is not blocked.
+            LayoutTab sourceLayoutTab = createLayoutTab(
+                    mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected());
+            sourceLayoutTab.setDecorationAlpha(0);
+
+            mLayoutTabs = new LayoutTab[] {sourceLayoutTab};
+
+            boolean quick = mGridTabListDelegate.prepareTabSwitcherView();
+
+            // Skip animation when there is no tab in current tab model, we don't show the shrink
+            // tab animatio.
+            boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0;
+            animate = animate && !isCurrentTabModelEmpty;
+
+            if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) {
+                showOverviewWithTranslateUp(animate);
+            } else {
+                showOverviewWithTabShrink(animate,
+                        () -> mGridTabListDelegate.getThumbnailLocationOfCurrentTab(false), quick);
+            }
+        }
+    }
+
+    private void showBrowserScrim() {
+        if (mScrimCoordinator == null) return;
+        PropertyModel scrimProp = new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS)
+                                          .with(ScrimProperties.ANCHOR_VIEW, mScrimAnchor)
+                                          .with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false)
+                                          .build();
+        mScrimCoordinator.showScrim(scrimProp);
+    }
+
+    private void hideBrowserScrim() {
+        if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return;
+        mScrimCoordinator.hideScrim(true);
+    }
+
+    @Override
+    protected void updateLayout(long time, long dt) {
+        ensureSceneLayerCreated();
+        super.updateLayout(time, dt);
+        if (mLayoutTabs == null) return;
+
+        assert mLayoutTabs.length >= 1;
+        boolean needUpdate = updateSnap(dt, mLayoutTabs[0]);
+        if (needUpdate) requestUpdate();
+    }
+
+    @Override
+    public void startHiding(int nextId, boolean hintAtTabSelection) {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_TAB_SWITCHER)) {
+            super.startHiding(nextId, hintAtTabSelection);
+
+            int sourceTabId = nextId;
+            if (sourceTabId == Tab.INVALID_TAB_ID) {
+                sourceTabId = mTabModelSelector.getCurrentTabId();
+            }
+
+            LayoutTab sourceLayoutTab =
+                    createLayoutTab(sourceTabId, mTabModelSelector.isIncognitoSelected());
+            sourceLayoutTab.setDecorationAlpha(0);
+
+            List<LayoutTab> layoutTabs = new ArrayList<>();
+            layoutTabs.add(sourceLayoutTab);
+
+            if (sourceTabId != mTabModelSelector.getCurrentTabId()) {
+                // Keep the original tab in mLayoutTabs to unblock thumbnail taking at the end of
+                // the animation.
+                LayoutTab originalTab = createLayoutTab(mTabModelSelector.getCurrentTabId(),
+                        mTabModelSelector.isIncognitoSelected());
+                originalTab.setScale(0);
+                originalTab.setDecorationAlpha(0);
+                layoutTabs.add(originalTab);
+            }
+            mLayoutTabs = layoutTabs.toArray(new LayoutTab[0]);
+
+            updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId)));
+
+            mIsAnimating = true;
+            if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) {
+                translateDown();
+            } else {
+                mController.hideTabSwitcherView(!isTabGtsAnimationEnabled());
+            }
+        }
+    }
+
+    @Override
+    public void doneHiding() {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_DONE_HIDING_TAB_SWITCHER)) {
+            super.doneHiding();
+            RecordUserAction.record("MobileExitStackView");
+            mJankTracker.finishTrackingScenario(JankScenario.TAB_SWITCHER);
+        }
+    }
+
+    @Override
+    public void doneShowing() {
+        try (TraceEvent e = TraceEvent.scoped(TRACE_DONE_SHOWING_TAB_SWITCHER)) {
+            if (!mAndroidViewFinishedShowing) return;
+            super.doneShowing();
+        }
+    }
+
+    @Override
+    public boolean onBackPressed() {
+        return mController.onBackPressed(false);
+    }
+
+    @Override
+    protected EventFilter getEventFilter() {
+        return null;
+    }
+
+    @Override
+    protected SceneLayer getSceneLayer() {
+        return mSceneLayer;
+    }
+
+    private void ensureSceneLayerCreated() {
+        if (mSceneLayer != null) return;
+        mSceneLayer = new TabListSceneLayer();
+    }
+
+    @Override
+    public boolean handlesTabClosing() {
+        return true;
+    }
+
+    @Override
+    public boolean handlesTabCreating() {
+        return true;
+    }
+
+    @Override
+    protected void forceAnimationToFinish() {
+        super.forceAnimationToFinish();
+        if (mTabToSwitcherAnimation != null) {
+            if (mTabToSwitcherAnimation.isRunning()) {
+                mTabToSwitcherAnimation.end();
+            }
+        }
+    }
+
+    /**
+     * Animate shrinking a tab to a target {@link Rect} area.
+     * @param animate Whether to play an entry animation.
+     * @param target The target {@link Rect} area.
+     */
+    private void showOverviewWithTabShrink(boolean animate, Supplier<Rect> target, boolean quick) {
+        // Skip shrinking animation when there is no tab in current tab model.
+        boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0;
+        boolean showShrinkingAnimation =
+                animate && isTabGtsAnimationEnabled() && !isCurrentTabModelEmpty;
+
+        boolean skipSlowZooming = TabUiFeatureUtilities.SKIP_SLOW_ZOOMING.getValue();
+        Log.d(TAG, "SkipSlowZooming = " + skipSlowZooming);
+        if (skipSlowZooming) {
+            showShrinkingAnimation &= quick;
+        }
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()) {
+            // Intentionally disable the shrinking animation when accessibility is enabled.
+            // During the shrinking animation, since the ComponsitorViewHolder is not focusable,
+            // I think we are in a temporary no "valid" focus target state, so the focus shifts
+            // to the omnibox and triggers an accessibility announcement of the URL and a
+            // keyboard hiding event. Disable the animation to avoid this temporary state.
+            showShrinkingAnimation &= !ChromeAccessibilityUtil.get().isAccessibilityEnabled();
+        }
+
+        if (!showShrinkingAnimation || target.get() == null) {
+            mController.showTabSwitcherView(animate);
+            return;
+        }
+
+        forceAnimationToFinish();
+        LayoutTab sourceLayoutTab = mLayoutTabs[0];
+        CompositorAnimationHandler handler = getAnimationHandler();
+        Collection<Animator> animationList = new ArrayList<>(5);
+
+        // Step 1: zoom out the source tab
+        Supplier<Float> scaleStartValueSupplier = () -> 1.0f;
+        Supplier<Float> scaleEndValueSupplier = () -> target.get().width() / (getWidth() * mDpToPx);
+
+        Supplier<Float> xStartValueSupplier = () -> 0f;
+        Supplier<Float> xEndValueSupplier = () -> target.get().left / mDpToPx;
+
+        Supplier<Float> yStartValueSupplier = () -> 0f;
+        Supplier<Float> yEndValueSupplier = () -> target.get().top / mDpToPx;
+
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.SCALE, scaleStartValueSupplier, scaleEndValueSupplier, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.X, xStartValueSupplier, xEndValueSupplier, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.Y, yStartValueSupplier, yEndValueSupplier, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and
+        // down, making the "create group" visible for a while.
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.MAX_CONTENT_HEIGHT, sourceLayoutTab.getUnclampedOriginalContentHeight(),
+                TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne()
+                        ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()),
+                                sourceLayoutTab.getUnclampedOriginalContentHeight())
+                        : getWidth(),
+                ZOOMING_DURATION, Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+
+        CompositorAnimator backgroundAlpha =
+                CompositorAnimator.ofFloat(handler, 0f, 1f, BACKGROUND_FADING_DURATION_MS,
+                        animator -> mBackgroundAlpha = animator.getAnimatedValue());
+        backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR);
+        animationList.add(backgroundAlpha);
+
+        mTabToSwitcherAnimation = new AnimatorSet();
+        mTabToSwitcherAnimation.playTogether(animationList);
+        mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mTabToSwitcherAnimation = null;
+                // Step 2: fade in the real GTS RecyclerView.
+                mController.showTabSwitcherView(true);
+
+                reportAnimationPerf(true);
+            }
+        });
+        mStartFrame = mFrameCount;
+        mStartTime = SystemClock.elapsedRealtime();
+        mLastFrameTime = SystemClock.elapsedRealtime();
+        mMaxFrameInterval = 0;
+        mTabToSwitcherAnimation.start();
+    }
+
+    /**
+     * Animate expanding a tab from a source {@link Rect} area.
+     * @param source The source {@link Rect} area.
+     */
+    private void expandTab(Rect source) {
+        LayoutTab sourceLayoutTab = mLayoutTabs[0];
+
+        forceAnimationToFinish();
+        CompositorAnimationHandler handler = getAnimationHandler();
+        Collection<Animator> animationList = new ArrayList<>(5);
+
+        // Zoom in the source tab
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.SCALE, source.width() / (getWidth() * mDpToPx), 1, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.X, source.left / mDpToPx, 0f, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.Y, source.top / mDpToPx, 0f, ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+        // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and
+        // down, making the "create group" visible for a while.
+        animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab,
+                LayoutTab.MAX_CONTENT_HEIGHT,
+                TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne()
+                        ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()),
+                                sourceLayoutTab.getUnclampedOriginalContentHeight())
+                        : getWidth(),
+                sourceLayoutTab.getUnclampedOriginalContentHeight(), ZOOMING_DURATION,
+                Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR));
+
+        CompositorAnimator backgroundAlpha =
+                CompositorAnimator.ofFloat(handler, 1f, 0f, BACKGROUND_FADING_DURATION_MS,
+                        animator -> mBackgroundAlpha = animator.getAnimatedValue());
+        backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR);
+        animationList.add(backgroundAlpha);
+
+        mTabToSwitcherAnimation = new AnimatorSet();
+        mTabToSwitcherAnimation.playTogether(animationList);
+        mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mTabToSwitcherAnimation = null;
+                postHiding();
+
+                reportAnimationPerf(false);
+            }
+        });
+        mStartFrame = mFrameCount;
+        mStartTime = SystemClock.elapsedRealtime();
+        mLastFrameTime = SystemClock.elapsedRealtime();
+        mMaxFrameInterval = 0;
+        mTabToSwitcherAnimation.start();
+    }
+
+    /**
+     * Animate translating grid tab switcher and its toolbar up.
+     */
+    private void showOverviewWithTranslateUp(boolean animate) {
+        forceAnimationToFinish();
+        showBrowserScrim();
+
+        Animator translateUp = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(),
+                View.TRANSLATION_Y, mController.getTabSwitcherContainer().getHeight(), 0f);
+        translateUp.setInterpolator(AnimationUtilsCompat.loadInterpolator(
+                getContext(), R.anim.fast_out_extra_slow_in_interpolator));
+        translateUp.setDuration(TRANSLATE_DURATION_MS);
+
+        mTabToSwitcherAnimation = new AnimatorSet();
+        mTabToSwitcherAnimation.play(translateUp);
+        mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                // Skip fade-in for tab switcher view, since it will translate in instead.
+                mController.getTabSwitcherContainer().setVisibility(View.VISIBLE);
+                mController.showTabSwitcherView(animate);
+                mController.setSnackbarParentView(mController.getTabSwitcherContainer());
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mTabToSwitcherAnimation = null;
+                mController.getTabSwitcherContainer().setY(0);
+                doneShowing();
+
+                reportTabletAnimationPerf(true);
+            }
+        });
+        mTabToSwitcherAnimation.start();
+    }
+
+    /**
+     * Animate translating grid tab switcher and its toolbar down off-screen.
+     */
+    private void translateDown() {
+        forceAnimationToFinish();
+        hideBrowserScrim();
+
+        Animator translateDown = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(),
+                View.TRANSLATION_Y, 0f, mController.getTabSwitcherContainer().getHeight());
+        translateDown.setInterpolator(AnimationUtilsCompat.loadInterpolator(
+                getContext(), R.anim.fast_out_extra_slow_in_interpolator));
+        translateDown.setDuration(TRANSLATE_DURATION_MS);
+
+        mTabToSwitcherAnimation = new AnimatorSet();
+        mTabToSwitcherAnimation.play(translateDown);
+        mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                mController.setSnackbarParentView(null);
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mTabToSwitcherAnimation = null;
+
+                // Skip fade-out  for tab switcher view, since it will translate out instead.
+                mController.hideTabSwitcherView(false);
+                mController.getTabSwitcherContainer().setVisibility(View.GONE);
+
+                reportTabletAnimationPerf(false);
+            }
+        });
+        mTabToSwitcherAnimation.start();
+    }
+
+    private Rect getThumbnailLocationOfCurrentTab() {
+        return mGridTabListDelegate.getThumbnailLocationOfCurrentTab(true);
+    }
+
+    private TabListDelegate getGridTabListDelegate() {
+        return mGridTabListDelegate;
+    }
+
+    private void postHiding() {
+        mGridTabListDelegate.postHiding();
+        mIsAnimating = false;
+        doneHiding();
+    }
+
+    @VisibleForTesting
+    void setPerfListenerForTesting(PerfListener perfListener) {
+        mPerfListenerForTesting = perfListener;
+    }
+
+    private void reportAnimationPerf(boolean isShrinking) {
+        int frameRendered = mFrameCount - mStartFrame;
+        long elapsedMs = SystemClock.elapsedRealtime() - mStartTime;
+        long lastDirty = mGridTabListDelegate.getLastDirtyTime();
+        int dirtySpan = (int) (lastDirty - mStartTime);
+        float fps = 1000.f * frameRendered / elapsedMs;
+        String message = String.format(Locale.US,
+                "fps = %.2f (%d / %dms), maxFrameInterval = %d, dirtySpan = %d", fps, frameRendered,
+                elapsedMs, mMaxFrameInterval, dirtySpan);
+
+        // TODO(crbug.com/964406): stop logging it after this feature stabilizes.
+        if (!VersionInfo.isStableBuild()) {
+            Log.i(TAG, message);
+        }
+
+        String suffix = isShrinking ? ".Shrink" : ".Expand";
+
+        // TODO(crbug.com/982018): Separate histograms for carousel tab switcher.
+        RecordHistogram.recordCount100Histogram(
+                "GridTabSwitcher.FramePerSecond" + suffix, (int) fps);
+        RecordHistogram.recordTimesHistogram(
+                "GridTabSwitcher.MaxFrameInterval" + suffix, mMaxFrameInterval);
+        RecordHistogram.recordTimesHistogram("GridTabSwitcher.DirtySpan" + suffix, dirtySpan);
+
+        if (mPerfListenerForTesting != null) {
+            mPerfListenerForTesting.onAnimationDone(
+                    frameRendered, elapsedMs, mMaxFrameInterval, dirtySpan);
+        }
+    }
+
+    private void reportTabletAnimationPerf(boolean translatingUp) {
+        // TODO(crbug.com/1304926): Record metrics for tablet animations.
+    }
+
+    @Override
+    protected void updateSceneLayer(RectF viewport, RectF contentViewport,
+            TabContentManager tabContentManager, ResourceManager resourceManager,
+            BrowserControlsStateProvider browserControls) {
+        ensureSceneLayerCreated();
+        super.updateSceneLayer(
+                viewport, contentViewport, tabContentManager, resourceManager, browserControls);
+        assert mSceneLayer != null;
+
+        // The content viewport is intentionally sent as both params below.
+        mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this,
+                tabContentManager, resourceManager, browserControls,
+                isTabGtsAnimationEnabled() ? mGridTabListDelegate.getResourceId() : 0,
+                mBackgroundAlpha, mGridTabListDelegate.getTabListTopOffset());
+        mFrameCount++;
+        if (mLastFrameTime != 0) {
+            long elapsed = SystemClock.elapsedRealtime() - mLastFrameTime;
+            mMaxFrameInterval = Math.max(mMaxFrameInterval, elapsed);
+        }
+        mLastFrameTime = SystemClock.elapsedRealtime();
+    }
+
+    @Override
+    public int getLayoutType() {
+        return LayoutType.TAB_SWITCHER;
+    }
+
+    @Override
+    public boolean onUpdateAnimation(long time, boolean jumpToEnd) {
+        return mTabToSwitcherAnimation == null && !mIsAnimating;
+    }
+
+    @Override
+    public boolean canHostBeFocusable() {
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()
+                && ChromeAccessibilityUtil.get().isAccessibilityEnabled()
+                && !DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) {
+            // We don't allow this layout to gain focus when accessibility is enabled so that the
+            // CompositorViewHolder doesn't steal focus when entering tab switcher.
+            // (crbug.com/1125185).
+            // We ignore this logic on tablets, since it would cause focus to briefly shift to the
+            // omnibox while entering the tab switcher. This was most notable on the NTP, where the
+            // virtual keyboard would quickly appear then disappear. (https://crbug.com/1320035).
+            return false;
+        }
+        return super.canHostBeFocusable();
+    }
+
+    /**
+     * Shrink/Expand animation is disabled for Tablet TabSwitcher launch polish.
+     * @return Whether shrink/expand animation is enabled.
+     */
+    private boolean isTabGtsAnimationEnabled() {
+        if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) return false;
+        return TabUiFeatureUtilities.isTabToGtsAnimationEnabled();
+    }
+}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
index d094dc7..0bf01f64 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -61,6 +61,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.features.start_surface.StartSurfaceUserData;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
@@ -157,6 +158,7 @@
     private boolean mRegisteredFirstMeaningfulPaintRecorder;
     private @TabListCoordinator.TabListMode int mMode;
     private Context mContext;
+    private SnackbarManager mSnackbarManager;
 
     /**
      * Interface to delegate resetting the tab grid.
@@ -452,11 +454,13 @@
      * @param tabSelectionEditorController The controller that can control the visibility of the
      *                                     TabSelectionEditor.
      */
-    public void initWithNative(TabSelectionEditorCoordinator
-                                       .TabSelectionEditorController tabSelectionEditorController) {
+    public void initWithNative(
+            TabSelectionEditorCoordinator.TabSelectionEditorController tabSelectionEditorController,
+            @Nullable SnackbarManager snackbarManager) {
         mTabSelectionEditorController = tabSelectionEditorController;
         mTabSelectionEditorController.getHandleBackPressChangedSupplier().addObserver(
                 this::notifyBackPressStateChanged);
+        mSnackbarManager = snackbarManager;
     }
 
     /**
@@ -615,6 +619,11 @@
     }
 
     @Override
+    public ViewGroup getTabSwitcherContainer() {
+        return mContainerView;
+    }
+
+    @Override
     public void addTabSwitcherViewObserver(TabSwitcherViewObserver observer) {
         mObservers.addObserver(observer);
     }
@@ -842,6 +851,12 @@
         notifyBackPressStateChangedInternal();
     }
 
+    @Override
+    public void setSnackbarParentView(ViewGroup parentView) {
+        if (mSnackbarManager == null) return;
+        mSnackbarManager.setParentView(parentView);
+    }
+
     /**
      * Do clean-up work after the overview hiding animation is finished.
      * @see TabSwitcher.TabListDelegate#postHiding
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
index 4b6709d3..1d4623b 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -221,7 +221,7 @@
                 mPriceWelcomeMessageController, mMultiWindowModeStateDispatcher,
                 TabListCoordinator.TabListMode.GRID);
 
-        mMediator.initWithNative(controller);
+        mMediator.initWithNative(controller, null);
         mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver);
         mMediator.setOnTabSelectingListener(mLayout::onTabSelecting);
     }
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index 79393bd..cd40de31 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -13,6 +13,7 @@
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementModuleProvider.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java",
+  "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/UndoGroupSnackbarController.java",
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 7fbcde91..0722cae 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -5061,8 +5061,8 @@
   <message name="IDS_ECHE_APP_NOTIFICATION_TRY_AGAIN_BUTTON" desc="Label for the connection lost button of EcheApp to try again.">
     Try again
   </message>
-  <message name="IDS_ECHE_APP_NOTIFICATION_HELP_BUTTON" desc="Help link text in connection lost notification of EcheApp.">
-    Help
+  <message name="IDS_ECHE_APP_NOTIFICATION_LEARN_MORE_BUTTON" desc="Learn more link text in connection lost notification of EcheApp.">
+    Learn more
   </message>
   <message name="IDS_ECHE_APP_SCREEN_LOCK_NOTIFICATION_TITLE" desc="Title for notification shown when screen lock is not enabled while using app stream of EcheApp.">
     Can't open app
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_HELP_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_HELP_BUTTON.png.sha1
deleted file mode 100644
index c99ad687..0000000
--- a/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_HELP_BUTTON.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cf8696b66fce06e70702f14c5bdbefe6ad191ad5
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_LEARN_MORE_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_LEARN_MORE_BUTTON.png.sha1
new file mode 100644
index 0000000..b5761d7f
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_ECHE_APP_NOTIFICATION_LEARN_MORE_BUTTON.png.sha1
@@ -0,0 +1 @@
+5cf40a36fda59bb035c5b916c1facea2498153db
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb
index 0b9a366..7d8e443 100644
--- a/chrome/app/resources/chromium_strings_eu.xtb
+++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -97,7 +97,7 @@
 <translation id="3350761136195634146">Badago kontu honen Chromium-eko profil bat</translation>
 <translation id="3387527074123400161">Chromium OS</translation>
 <translation id="3406848076815591792">Lehendik dagoen Chromium-eko profil batera aldatu nahi duzu?</translation>
-<translation id="3412460710772753638">Gailuko Pasahitz-kudeatzailea aplikazioan</translation>
+<translation id="3412460710772753638">Gailuko Pasahitz-kudeatzailea zerbitzuan</translation>
 <translation id="3430503420100763906">Chromium-eko profilekin, Chromium-en dituzun gauza guztiak bereiz ditzakezu. Sortu profilak lagunentzat eta familiako kideentzat, edo banandu gauza pertsonalak eta lanekoak.</translation>
 <translation id="347328004046849135">Arriskuan dagoen pasahitz batekin hasten baduzu saioa, jakinarazi egingo dizu Chromium-ek</translation>
 <translation id="3474745554856756813">Gailuko <ph name="ITEMS_COUNT" /> elementu ezabatuko dira. Geroago datuak eskuratu nahi izanez gero, hasi saioa Chromium-en <ph name="USER_EMAIL" /> gisa.</translation>
@@ -148,7 +148,7 @@
 <translation id="4544142686420020088">Chromium ez da eguneratu arazoren bat izan delako. <ph name="BEGIN_LINK" />Konpondu Chromium eguneratzeko arazoak eta huts egindako eguneratzeak.<ph name="END_LINK" /></translation>
 <translation id="454579500955453258">Chromium-eko beste profil batean egin nahi duzu aurrera?</translation>
 <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> gisa hasi duzu saioa. Laster-markak, historia eta bestelako ezarpenak atzi ditzakezu saioa hasita daukaten gailu guztien bidez.</translation>
-<translation id="4594305310729380060">Gailuko Pasahitz-kudeatzailea aplikazioan</translation>
+<translation id="4594305310729380060">Gailuko Pasahitz-kudeatzailea zerbitzuan</translation>
 <translation id="459535195905078186">Chromium aplikazioak</translation>
 <translation id="4613863813562375431">Chromium OS-ren bertsioa</translation>
 <translation id="4621240073146040695">Ia amaitu dugu! Eguneratzen amaitzeko, berrabiarazi Chromium.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index a0503caf..0395701 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">নতুন টেবত প্ৰকৃত &amp;প্ৰতিচ্ছবি খোলক</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{১ সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> আপডে’ট কৰক}one{{NUM_WEEKS} সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> আপডে’ট কৰক}other{{NUM_WEEKS} সপ্তাহৰ ভিতৰত <ph name="DEVICE_TYPE" /> আপডে’ট কৰক}}</translation>
 <translation id="1056898198331236512">সতর্কবার্তা</translation>
+<translation id="105822690353767994">যদি আপুনি এই বাৰ্তাটো পুনৰ চাব নিবিচাৰে, তেন্তে এই ছাইটটোত এক্সটেনশ্বনটো সদায় চলাবলৈ অনুমতি দিয়ক।</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{আপোনাৰ নতুন পিনটো দিয়ক। এটা পিনত অতি কমেও এটা বৰ্ণ থাকিবই লাগিব যি এটা আখৰ, সংখ্যা আৰু অন্য বৰ্ণ হ’ব পাৰে।}one{আপোনাৰ নতুন পিনটো দিয়ক। এটা পিনত অতি কমেও # টা বৰ্ণ থাকিবই লাগিব যিকেইটা আখৰ, সংখ্যা আৰু অন্য বৰ্ণ হ’ব পাৰে।}other{আপোনাৰ নতুন পিনটো দিয়ক। এটা পিনত অতি কমেও # টা বৰ্ণ থাকিবই লাগিব যিকেইটা আখৰ, সংখ্যা আৰু অন্য বৰ্ণ হ’ব পাৰে।}}</translation>
 <translation id="1059484610606223931">হাইপাৰটেক্স ট্ৰাঞ্চপ'ৰ্ট প্ৰ’ট’কল (HTTPS)</translation>
@@ -865,6 +866,7 @@
     ই অন্য ডিভাইচসমূহত থকা এপ্‌সমূহ অথবা সমলৰ ওপৰত প্ৰভাৱ নেপেলায়।</translation>
 <translation id="1809734401532861917">মোৰ বুকমাৰ্ক, সন্ধান ইতিহাস, পাছৱৰ্ড আৰু অন্য ছেটিংসমূহ <ph name="USER_EMAIL_ADDRESS" />ত যোগ কৰক</translation>
 <translation id="1810366086647840386">প্ৰতিচ্ছবিৰ ছাৰ্ভাৰ</translation>
+<translation id="1811908311154949291">ইনক’গনিট’ ফেঞ্চড্‌ ফ্ৰে’ম: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">সেৱা</translation>
 <translation id="18139523105317219">EDI পাৰ্টিৰ নাম</translation>
 <translation id="1815083418640426271">নিকা পাঠ হিচাপে পে’ষ্ট কৰক</translation>
@@ -1684,6 +1686,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />এ <ph name="NETWORK_ID" />ৰ সৈতে সংযোগ কৰিব নোৱাৰিলে। অনুগ্ৰহ কৰি অন্য কোনো নেটৱৰ্ক বাছনি কৰি পুনৰ চেষ্টা কৰক।</translation>
 <translation id="2553440850688409052">এই প্লাগইনটো লুকুৱাওক</translation>
 <translation id="2554553592469060349">বাছনি কৰা ফাইলটোৰ আকাৰ অত্যন্ত ডাঙৰ (সর্বাধিক আকাৰ: ৩এম.বি.)</translation>
+<translation id="25568951186001797">ফেঞ্চড্‌ ফ্ৰে’ম: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">আপোনাৰ ব্ৰাউজিঙৰ ইতিহাসে আপুনি দেখা পোৱা বিজ্ঞাপন প্ৰভাৱিত কৰে</translation>
 <translation id="2558896001721082624">ছিষ্টেম মেনুত সাধ্য সুবিধাসমূহ সদায়েই দেখুৱাওক</translation>
 <translation id="2559889124253841528">ডিভাইচত ছেভ কৰক</translation>
@@ -2245,6 +2248,7 @@
 <translation id="3101126716313987672">ৰাতিৰ পোহৰ</translation>
 <translation id="3101709781009526431">তাৰিখ আৰু সময়</translation>
 <translation id="3103451787721578293">অনুগ্ৰহ কৰি এই ডেটাখিনি আপল’ড কৰাৰ এটা কাৰণ দিয়ক:</translation>
+<translation id="3105339775057145050">অন্তিম অসফল আপডে’ট</translation>
 <translation id="3105796011181310544">পুনৰ Googleলৈ সলনি কৰিবনে?</translation>
 <translation id="310671807099593501">ছাইটটোৱে ব্লুটুথ ব্যৱহাৰ কৰি আছে</translation>
 <translation id="3108931485517391283">লাভ কৰিব নোৱাৰি</translation>
@@ -2547,6 +2551,7 @@
 <translation id="3433621910545056227">আমি দুঃখিত!  ছিষ্টেমটোৱে ডিভাইচটোৰ ইনষ্টলেশ্বনৰ সময়ৰ এট্রিবিউট লক স্থাপন কৰিব নোৱাৰিলে।</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">যদি আপোনাৰ শিশুৰ বাবে অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপ অন কৰা হয়, তেন্তে এই ডেটা তেওঁৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে। এই ছেটিংসমূহৰ বিষয়ে আৰু সেইবোৰ কেনেদৰে মিলাব পাৰি সেই বিষয়ে জানিবলৈ families.google.comলৈ যাওক।</translation>
+<translation id="3434475275396485144">এই ছেটিংটো আপোনাৰ ফ’নটোৰ প্ৰশাসকে পৰিচালনা কৰে</translation>
 <translation id="3434512374684753970">অডিঅ' আৰু ভিডিঅ'</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />"এ আপোনাৰ <ph name="CODE_TYPE" />ৰ বাবে অনুৰোধ কৰিছে</translation>
 <translation id="3435738964857648380">সুৰক্ষা</translation>
@@ -6383,6 +6388,7 @@
 <translation id="7264695323040866038">সমৰ্থিত ৱেব লিংকসমূহ খুলিবলৈ সদায় <ph name="APP" /> এপ্‌টো ব্যৱহাৰ কৰিবনে?</translation>
 <translation id="7267044199012331848">ভাৰ্ছুৱেল মেচিনটো ইনষ্টল কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক অথবা আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক। আসোঁৱাহ ক’ড: <ph name="ERROR_CODE" />।</translation>
 <translation id="7267875682732693301">আপোনাৰ ফিংগাৰপ্ৰিণ্টৰ সকলো অংশ যোগ দিয়া আঙুলিটো কেইবাবাৰো উঠোৱা নমোৱা কৰক</translation>
+<translation id="7267898843336437186">এই ছাইটটোৱে চাব পৰা এটা ফ’ল্ডাৰ বাছনি কৰক</translation>
 <translation id="7268127947535186412">ডিভাইচৰ গৰাকীয়ে এই ছেটিংটো পৰিচালনা কৰে।</translation>
 <translation id="7269736181983384521">Nearby Shareৰ ডেটাৰ ব্যৱহাৰ</translation>
 <translation id="7272674038937250585">কোনো বিৱৰণ নাই</translation>
@@ -7982,6 +7988,7 @@
 <translation id="8838770651474809439">হেমবাৰ্গাৰ</translation>
 <translation id="8838778928843281408">ফ’ন পৰিচালনা কৰক</translation>
 <translation id="8841843049738266382">অনুমতিৰ তালিকাত ৰখা ব্যৱহাৰকাৰীসকল পঢ়ক আৰু সলনি কৰক</translation>
+<translation id="8842059467121215385">"<ph name="EXTENSION_NAME" />" ব্যৱহাৰ কৰিবলৈ পৃষ্ঠাখন ৰিফ্ৰেশ্ব কৰক</translation>
 <translation id="8842594465773264717">এই ফিংগাৰপ্ৰিণ্টটো মচক</translation>
 <translation id="8845001906332463065">সহায় পাওক</translation>
 <translation id="8846132060409673887">এই কম্পিউটাৰটোৰ নিৰ্মাণকাৰী আৰু ম'ডেলৰ তথ্য পঢ়ক</translation>
@@ -8137,6 +8144,7 @@
 <translation id="899657321862108550">আপোনাৰ Chrome সকলোতে ব্যৱহাৰ কৰক</translation>
 <translation id="899676909165543803">আপোনাৰ কীব’ৰ্ডৰ একেবাৰে তলৰ সোঁফালৰ কীটো হৈছে ফিংগাৰপ্ৰিণ্ট ছেন্সৰ। যিকোনো এটা আঙুলিৰে এইটো লাহেকৈ স্পর্শ কৰক।</translation>
 <translation id="8999560016882908256">Section syntax error: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627"><ph name="FAILURE_TIME" />ত '<ph name="STATUS_TEXT" />' স্থিতিৰ উল্লেখেৰে ডিভাইচ পৰিচালনা ছাৰ্ভাৰৰ সৈতে সংযোগ বিচ্ছিন্ন হ’ল</translation>
 <translation id="9003647077635673607">সকলো ৱেবছাইটতে অনুমতি দিয়ক</translation>
 <translation id="9003677638446136377">পুনৰ পৰীক্ষা কৰক</translation>
 <translation id="9004754973617721124"><ph name="SITE_NAME" /> আৰু ইয়াৰ অন্তৰ্গত আটাইবোৰ ছাইটৰ আৰু ইয়াত ইনষ্টল কৰি থোৱা এপৰ বাবে ছাইটৰ ডেটা আৰু অনুমতিসমূহ মচিবনে?</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 77131ab..1c61adb 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -3968,6 +3968,7 @@
 <translation id="4842976633412754305">Гэта старонка спрабуе загрузіць сцэнарыі з неаўтэнтыфікаваных крыніц.</translation>
 <translation id="4844333629810439236">Іншыя клавіятуры</translation>
 <translation id="4844633725025837809">Дзеля дадатковай бяспекі зашыфроўвайце паролі на прыладзе, перш чым захоўваць іх у Менеджары пароляў Google</translation>
+<translation id="4846628405149428620">Укажыце, дзе сайт можа захоўваць змены</translation>
 <translation id="4846680374085650406">Для гэтай налады вы трымаецеся рэкамендацый адміністратара.</translation>
 <translation id="4847902821209177679">Выбрана: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />. Націсніце Enter, каб выбраць альбомы "<ph name="TOPIC_SOURCE" />"</translation>
 <translation id="4848191975108266266">Каманда "Ok Google" для Памочніка Google</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 936a753..7853852de 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -3980,7 +3980,7 @@
 <translation id="4842976633412754305">Ova stranica pokušava učitati skripte s izvora koji nisu autentificirani.</translation>
 <translation id="4844333629810439236">Ostale tastature</translation>
 <translation id="4844633725025837809">Radi dodatne sigurnosti, šifrirajte lozinke na uređaju prije nego što se sačuvaju u Googleovom Upravitelju lozinki</translation>
-<translation id="4846628405149428620">Odaberite gdje ova web-lokacija može spremati promjene</translation>
+<translation id="4846628405149428620">Odaberite gdje ova web lokacija može sačuvati izmjene</translation>
 <translation id="4846680374085650406">U skladu ste s preporukom administratora za ovu postavku.</translation>
 <translation id="4847902821209177679">Odabrano: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />. Pritisnite Enter da odaberete albume usluge <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Google Asistent "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index ac9a90b4..ba7b312e 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -3985,6 +3985,7 @@
 <translation id="4842976633412754305">Mae'r dudalen hon yn ceisio llwytho sgriptiau o ffynonellau sydd heb eu dilysu.</translation>
 <translation id="4844333629810439236">Bysellfyrddau eraill</translation>
 <translation id="4844633725025837809">Am ddiogelwch ychwanegol, amgryptiwch gyfrineiriau ar eich dyfais cyn iddynt gael eu cadw i Reolwr Cyfrineiriau Google</translation>
+<translation id="4846628405149428620">Dewiswch ble gall y wefan hon gadw newidiadau</translation>
 <translation id="4846680374085650406">Rydych yn dilyn argymhelliad y gweinyddwr ar gyfer y gosodiad hwn.</translation>
 <translation id="4847902821209177679">Mae <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> wedi'i ddewis, pwyswch Enter i ddewis albymau <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Google Assistant "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 03a363f..194ce8f 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3983,6 +3983,7 @@
 <translation id="4842976633412754305">Denne side forsøger at indlæse scripts fra kilder, som ikke er godkendte.</translation>
 <translation id="4844333629810439236">Andre tastaturer</translation>
 <translation id="4844633725025837809">For at beskytte adgangskoderne yderligere krypteres de på din enhed, inden de gemmes i Googles Adgangskodeadministrator</translation>
+<translation id="4846628405149428620">Vælg, hvor dette website kan gemme ændringer</translation>
 <translation id="4846680374085650406">Du følger administratorens anbefaling for denne indstilling.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> er valgt. Tryk på Enter for at vælge <ph name="TOPIC_SOURCE" />-album</translation>
 <translation id="4848191975108266266">Google Assistent-funktionen "Hey Google"</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index a522883..068296c9 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -3982,6 +3982,7 @@
 <translation id="4842976633412754305">Αυτή η σελίδα προσπαθεί να φορτώσει σενάρια από μη εξουσιοδοτημένες πηγές.</translation>
 <translation id="4844333629810439236">Άλλα πληκτρολόγια</translation>
 <translation id="4844633725025837809">Για επιπλέον ασφάλεια, κρυπτογραφήστε τους κωδικούς πρόσβασης στη συσκευή σας προτού αποθηκευτούν στον Διαχειριστή κωδικών πρόσβασης Google</translation>
+<translation id="4846628405149428620">Επιλέξτε πού θα αποθηκεύονται οι αλλαγές από αυτόν τον ιστότοπο</translation>
 <translation id="4846680374085650406">Ακολουθείτε την πρόταση του διαχειριστή για αυτήν τη ρύθμιση.</translation>
 <translation id="4847902821209177679">Επιλέχθηκε το στοιχείο <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />. Πατήστε Enter για να επιλέξετε λευκώματα από <ph name="TOPIC_SOURCE" />.</translation>
 <translation id="4848191975108266266">Ok Google του Βοηθού Google</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 7384e7f9..d0664c3 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">Open original image in new tab</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{Update <ph name="DEVICE_TYPE" /> within 1 week}other{Update <ph name="DEVICE_TYPE" /> within {NUM_WEEKS} weeks}}</translation>
 <translation id="1056898198331236512">Warning</translation>
+<translation id="105822690353767994">Always allow the extension to run on this site if you don't want to see this message again.</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{Enter your new PIN. A PIN must be at least one character long and can contain letters, numbers and other characters.}other{Enter your new PIN. A PIN must be at least # characters long and can contain letters, numbers and other characters.}}</translation>
 <translation id="1059484610606223931">Hypertext Transport Protocol Secure (HTTPS)</translation>
@@ -370,6 +371,7 @@
 <translation id="1362865166188278099">Mechanical issue. Check printer</translation>
 <translation id="1363585519747660921">USB printer needs configuration</translation>
 <translation id="1367951781824006909">Choose a file</translation>
+<translation id="1368603372088757436">Linux is not supported on your <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="1369149969991017342">Switch Access (control the computer with just one or two switches)</translation>
 <translation id="1372841398847029212">Sync to your account</translation>
 <translation id="1373176046406139583">Your device visibility controls who can share with you while your screen is unlocked. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
@@ -714,6 +716,7 @@
 <translation id="1670399744444387456">Basic</translation>
 <translation id="1673137583248014546"><ph name="URL" /> wants to see the make and model of your security key</translation>
 <translation id="1674073353928166410">Open all (<ph name="URL_COUNT" />) in Incognito window</translation>
+<translation id="1676902103953506022">Credential details for <ph name="USERNAME" /> on <ph name="DOMAIN" /></translation>
 <translation id="1677306805708094828">Can't add <ph name="EXTENSION_TYPE_PARAMETER" /></translation>
 <translation id="1677472565718498478"><ph name="TIME" /> left</translation>
 <translation id="1679068421605151609">Developer Tools</translation>
@@ -867,6 +870,7 @@
     This doesn’t affect apps or content on other devices.</translation>
 <translation id="1809734401532861917">Add my bookmarks, history, passwords and other settings to <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1810366086647840386">Image server</translation>
+<translation id="1811908311154949291">Incognito fenced frame: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">Services</translation>
 <translation id="18139523105317219">EDI Party Name</translation>
 <translation id="1815083418640426271">Paste as Plain Text</translation>
@@ -1686,6 +1690,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> was unable to connect to <ph name="NETWORK_ID" />. Please select another network or try again.</translation>
 <translation id="2553440850688409052">Hide This Plug-in</translation>
 <translation id="2554553592469060349">Selected file is too big (max size: 3mb).</translation>
+<translation id="25568951186001797">Fenced frame: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">Your browsing history affects the ads that you see</translation>
 <translation id="2558896001721082624">Always show accessibility options in the system menu</translation>
 <translation id="2559889124253841528">Save to device</translation>
@@ -2248,6 +2253,7 @@
 <translation id="3101126716313987672">Dim light</translation>
 <translation id="3101709781009526431">Date and time</translation>
 <translation id="3103451787721578293">Please enter a reason for uploading this data:</translation>
+<translation id="3105339775057145050">Last unsuccessful update</translation>
 <translation id="3105796011181310544">Change back to Google?</translation>
 <translation id="310671807099593501">Site is using Bluetooth</translation>
 <translation id="3108931485517391283">Can't receive</translation>
@@ -2550,6 +2556,7 @@
 <translation id="3433621910545056227">Oops!  The system failed to establish the device installation-time attributes lock.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account. Find out more about these settings and how to adjust them at families.google.com.</translation>
+<translation id="3434475275396485144">This setting is managed by your phone's administrator</translation>
 <translation id="3434512374684753970">Audio and video</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" is requesting your <ph name="CODE_TYPE" /></translation>
 <translation id="3435738964857648380">Security</translation>
@@ -4680,6 +4687,7 @@
 <translation id="554903022911579950">Kerberos</translation>
 <translation id="5551573675707792127">Keyboard and text input</translation>
 <translation id="5553089923092577885">Certificate Policy Mappings</translation>
+<translation id="5554240068773209752">Click here to customise controls</translation>
 <translation id="5554403733534868102">After this, no waiting for updates</translation>
 <translation id="5554489410841842733">This icon will be visible when the extension can act on the current page.</translation>
 <translation id="5554720593229208774">Email Certification Authority</translation>
@@ -6385,6 +6393,7 @@
 <translation id="7264695323040866038">Always use the <ph name="APP" /> app to open supported web links?</translation>
 <translation id="7267044199012331848">Couldn't install the virtual machine. Please try again, or contact your administrator. Error code: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">Keep lifting your finger to add the different parts of your fingerprint</translation>
+<translation id="7267898843336437186">Select a folder that this site can view</translation>
 <translation id="7268127947535186412">This setting is managed by the device owner.</translation>
 <translation id="7269736181983384521">Nearby Share data usage</translation>
 <translation id="7272674038937250585">No description provided</translation>
@@ -7242,6 +7251,7 @@
 <translation id="80866457114322936">{NUM_FILES,plural, =1{This file is encrypted. Ask its owner to decrypt it.}other{Some of these files are encrypted. Ask their owner to decrypt them.}}</translation>
 <translation id="808894953321890993">Change password</translation>
 <translation id="8090234456044969073">Read a list of your most frequently visited websites</translation>
+<translation id="8090513782447872344">You can come back anytime to take another look</translation>
 <translation id="8093359998839330381"><ph name="PLUGIN_NAME" /> isn't responding</translation>
 <translation id="8095105960962832018"><ph name="BEGIN_PARAGRAPH1" />Back up to Google Drive. Easily restore your data or switch device at any time. Your backup includes app data.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Your backups are uploaded to Google and encrypted using your Google Account password.<ph name="END_PARAGRAPH2" />
@@ -7985,6 +7995,7 @@
 <translation id="8838770651474809439">Hamburger</translation>
 <translation id="8838778928843281408">Manage phones</translation>
 <translation id="8841843049738266382">Read and change the allowlist users</translation>
+<translation id="8842059467121215385">Refresh the page to use ‘<ph name="EXTENSION_NAME" />’</translation>
 <translation id="8842594465773264717">Delete this fingerprint</translation>
 <translation id="8845001906332463065">Get help</translation>
 <translation id="8846132060409673887">Read the manufacturer and model of this computer</translation>
@@ -8140,6 +8151,7 @@
 <translation id="899657321862108550">Your Chrome, Everywhere</translation>
 <translation id="899676909165543803">The fingerprint sensor is the bottom-right key on your keyboard. Touch it lightly with any finger.</translation>
 <translation id="8999560016882908256">Section syntax error: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">Connection to Device Management Server failed with status ‘<ph name="STATUS_TEXT" />’ at <ph name="FAILURE_TIME" /></translation>
 <translation id="9003647077635673607">Allow on all websites</translation>
 <translation id="9003677638446136377">Check again</translation>
 <translation id="9004754973617721124">Clear site data and permissions for <ph name="SITE_NAME" />, all sites under it, and its installed app?</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 7a99c46..2afd656 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3972,6 +3972,7 @@
 <translation id="4842976633412754305">See leht üritab skripte laadida volitamata allikatest.</translation>
 <translation id="4844333629810439236">Muud klaviatuurid</translation>
 <translation id="4844633725025837809">Turvalisuse suurendamiseks krüpteerige paroolid oma seadmes, enne kui need salvestatakse Google'i paroolihaldurisse</translation>
+<translation id="4846628405149428620">Valige, kus see sait muudatusi salvestada saab</translation>
 <translation id="4846680374085650406">Järgite selle seade puhul administraatori soovitust.</translation>
 <translation id="4847902821209177679">Valitud on taust „<ph name="TOPIC_SOURCE" /> – <ph name="TOPIC_SOURCE_DESC" />”. Vajutage sisestusklahvi, et valida tausta „<ph name="TOPIC_SOURCE" />” jaoks albumid</translation>
 <translation id="4848191975108266266">Google'i assistent „Ok Google”</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 6eaf026..ada7437 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1792,7 +1792,7 @@
 <translation id="2687407218262674387">Google-ren Zerbitzu-baldintzak</translation>
 <translation id="2687621393791886981">Galdetu geroago</translation>
 <translation id="2688196195245426394">Errore bat gertatu da gailua zerbitzariarekin erregistratzean: <ph name="CLIENT_ERROR" />.</translation>
-<translation id="2688734475209947648">Ez duzu pasahitza gogoratu beharko. <ph name="ACCOUNT" /> kontuko Google-ren Pasahitz-kudeatzailea aplikazioan gordeko da.</translation>
+<translation id="2688734475209947648">Ez duzu pasahitza gogoratu beharko. <ph name="ACCOUNT" /> kontuko Google-ren Pasahitz-kudeatzailea zerbitzuan gordeko da.</translation>
 <translation id="2690024944919328218">Erakutsi hizkuntza-aukerak</translation>
 <translation id="2691385045260836588">Modeloa</translation>
 <translation id="2691440343905273290">Aldatu idazketa-metodoaren ezarpenak</translation>
@@ -3964,7 +3964,7 @@
 <translation id="4841741146571978176">Beharrezkoa den makina birtual bat ez dago. Aurrera egiteko, konfiguratu <ph name="VM_TYPE" />.</translation>
 <translation id="4842976633412754305">Orria autentifikatu gabeko iturburuetako scriptak kargatu nahian dabil.</translation>
 <translation id="4844333629810439236">Bestelako teklatuak</translation>
-<translation id="4844633725025837809">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea atalean gorde aurretik</translation>
+<translation id="4844633725025837809">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik</translation>
 <translation id="4846628405149428620">Hautatu non gorde ditzakeen aldaketak webguneak</translation>
 <translation id="4846680374085650406">Administratzailearen gomendioa betetzen ari zara ezarpenari dagokionez.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> hautatuta daukazula, sakatu Sartu <ph name="TOPIC_SOURCE" /> zerbitzuko albumak hautatzeko</translation>
@@ -4286,7 +4286,7 @@
 <translation id="5177549709747445269">Mugikorreko datuak erabiltzen ari zara</translation>
 <translation id="5178667623289523808">Bilatu aurrekoa</translation>
 <translation id="5181140330217080051">Deskargatzen</translation>
-<translation id="5181172023548002891">Google-ren Pasahitz-kudeatzailea atalean (<ph name="ACCOUNT" /> kontuan)</translation>
+<translation id="5181172023548002891">Google-ren Pasahitz-kudeatzailea zerbitzuan (<ph name="ACCOUNT" /> kontuan)</translation>
 <translation id="5184063094292164363">&amp;JavaScript kontsola</translation>
 <translation id="5184209580557088469">Bada erabiltzaile-izen hori duen zerbitzu-eskaera bat</translation>
 <translation id="5184662919967270437">Gailua eguneratzen</translation>
@@ -5624,7 +5624,7 @@
 <translation id="6520876759015997832"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> bilaketa-emaitza: "<ph name="SEARCH_RESULT_TEXT" />". Atal horretara joateko, sakatu Sartu.</translation>
 <translation id="6521214596282732365">Webguneek zure letrak erabil ohi dituzte goi-fidelitateko edukia sortzeko sareko tresna grafikoak eta diseinuzkoak erabilita.</translation>
 <translation id="6523303810310758032">Arakatze-historia ezabatzen duzunean (osorik nahiz webgune zehatz bat), neurketari buruzko informazio erlazionatua ere ezabatuko duzu. Ikusi <ph name="BEGIN_LINK" />arakatze-historia<ph name="END_LINK" />.</translation>
-<translation id="6523574494641144162">Google-ren Pasahitz-kudeatzailea aplikazioak ezin izan ditu gorde aplikazioak Google-ko kontuan, baina gailuan gorde ditzakezu.</translation>
+<translation id="6523574494641144162">Google-ren Pasahitz-kudeatzailea zerbitzuak ezin izan ditu gorde aplikazioak Google-ko kontuan, baina gailuan gorde ditzakezu.</translation>
 <translation id="6524735478670290456">Nola erabiltzen ditugu datu horiek?</translation>
 <translation id="652492607360843641">Sare <ph name="NETWORK_TYPE" /> batera zaude konektatuta.</translation>
 <translation id="6527303717912515753">Partekatu</translation>
@@ -5703,9 +5703,9 @@
 <translation id="6595187330192059106">Blokeatu beti <ph name="HOST" /> ostalariari MIDI gailuak erabat kontrolatzeko aukera.</translation>
 <translation id="6595408197871512625">{COUNT,plural, =1{Aldatu da arriskuan zegoen pasahitza.
 
-Arriskuan dagoen # pasahitz gehiago daukazu. Google-ren Pasahitz-kudeatzailea aplikazioak pasahitz hori orain aldatzea gomendatzen du.}other{Aldatu da arriskuan zegoen pasahitza.
+Arriskuan dagoen # pasahitz gehiago daukazu. Google-ren Pasahitz-kudeatzailea zerbitzuak pasahitz hori orain aldatzea gomendatzen du.}other{Aldatu da arriskuan zegoen pasahitza.
 
-Arriskuan dauden # pasahitz gehiago dauzkazu. Google-ren Pasahitz-kudeatzailea aplikazioak pasahitz horiek orain aldatzea gomendatzen du.}}</translation>
+Arriskuan dauden # pasahitz gehiago dauzkazu. Google-ren Pasahitz-kudeatzailea zerbitzuak pasahitz horiek orain aldatzea gomendatzen du.}}</translation>
 <translation id="6595792813574514527">Arrastatu irudiak <ph name="VISUAL_SEARCH_PROVIDER" /> bidez bilatzeko</translation>
 <translation id="6596325263575161958">Enkriptatze aukerak</translation>
 <translation id="6596816719288285829">IP helbidea</translation>
@@ -6769,7 +6769,7 @@
 <translation id="7665082356120621510">Gorde tamaina</translation>
 <translation id="7665369617277396874">Gehitu kontu bat</translation>
 <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{Itzuli <ph name="DEVICE_TYPE" /> gailua {NUM_WEEKS} asteko epean}other{Itzuli <ph name="DEVICE_TYPE" /> gailua {NUM_WEEKS} asteko epean}}</translation>
-<translation id="7668423670802040666">Google-ren Pasahitz-kudeatzailea atalean (<ph name="ACCOUNT" /> kontuan)</translation>
+<translation id="7668423670802040666">Google-ren Pasahitz-kudeatzailea zerbitzuan (<ph name="ACCOUNT" /> kontuan)</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{PINa okerra da. Saiakera bakarra geratzen zaizu.}other{PINa okerra da. # saiakera geratzen zaizkizu.}}</translation>
 <translation id="7670434942695515800">Errendimendurik onena lortzeko, berritu azken bertsiora. Fitxategien babeskopiak egitea gomendatzen dugu. Horrela, ez da daturik galduko bertsio-berritzea osatu ezin bada. Bertsio-berritzen hasi ondoren, Linux itzali egingo da. Aurrera egin aurretik, gorde irekita dauden fitxategiak. <ph name="LINK_START" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="7671130400130574146">Erabili sistemaren izenaren barra eta ertzak</translation>
@@ -7164,7 +7164,7 @@
 <translation id="8041089156583427627">Bidali oharrak</translation>
 <translation id="8041267120753677077">Igorri zuzenean telefonoko aplikazioak</translation>
 <translation id="8042142357103597104">Testuaren opakutasuna</translation>
-<translation id="8042331986490021244">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea atalean gorde aurretik</translation>
+<translation id="8042331986490021244">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik</translation>
 <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> aplikazioak ez du erantzuten.</translation>
 <translation id="8044899503464538266">Motela</translation>
 <translation id="8045253504249021590">Sinkronizazioa gelditu egin da Google-ren Panela atalean.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 1b78623..5552a8af 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -3040,7 +3040,7 @@
 <translation id="3900966090527141178">صادر کردن گذرواژه‌ها</translation>
 <translation id="3903187154317825986">صفحه‌کلید داخلی</translation>
 <translation id="3904326018476041253">خدمات مکان</translation>
-<translation id="3904849010307028014">براساس تعاملتان با یک سایت (مثلاً مرتباً وارد شدن به سیستم حسابی خاص)، این سایت می‌تواند کد اطمینان برای مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کنند، احتمال اینکه با شما مثل یک انسان (و نه روبات) برخورد کنند بیشتر است.</translation>
+<translation id="3904849010307028014">براساس تعاملتان با یک سایت (مثلاً مرتباً وارد شدن به سیستم حسابی خاص)، این سایت می‌تواند کد اطمینان برای مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کنند، احتمال اینکه با شما مثل یک انسان (و نه ربات) برخورد کنند بیشتر است.</translation>
 <translation id="3905761538810670789">تعمیر برنامه</translation>
 <translation id="3908393983276948098"><ph name="PLUGIN_NAME" /> قدیمی است</translation>
 <translation id="3908501907586732282">فعال کردن برنامه افزودنی</translation>
@@ -3979,6 +3979,7 @@
 <translation id="4842976633412754305">این صفحه در تلاش است اسکریپت‌هایی از منابع تأیید نشده بارگیری کند.</translation>
 <translation id="4844333629810439236">صفحه‌کلیدهای دیگر</translation>
 <translation id="4844633725025837809">‏برای افزایش ایمنی، گذرواژه‌ها را قبل‌از ذخیره شدن در «مدیر گذرواژه Google» در دستگاهتان رمزگذاری می‌کند</translation>
+<translation id="4846628405149428620">انتخاب جایی که این سایت می‌تواند تغییرات را ذخیره کند</translation>
 <translation id="4846680374085650406">شما از توصیه‌های سرپرست سیستم برای این تنظیم پیروی می‌کنید.</translation>
 <translation id="4847902821209177679">‏<ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> انتخاب شد، برای انتخاب کردن آلبوم‌های <ph name="TOPIC_SOURCE" />،‏ Enter را فشار دهید</translation>
 <translation id="4848191975108266266">‏دستیار Google «‏Ok Google»</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 0fae3728..0de8b81 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3978,6 +3978,7 @@
 <translation id="4842976633412754305">Tämä sivu yrittää ladata koodia todentamattomista lähteistä.</translation>
 <translation id="4844333629810439236">Muut näppäimistöt</translation>
 <translation id="4844633725025837809">Salasanat kannattaa salata turvallisuussyistä laitteella ennen niiden tallentamista Googlen Salasanojen ylläpitoon</translation>
+<translation id="4846628405149428620">Valitse, minne sivusto voi tallentaa muutokset</translation>
 <translation id="4846680374085650406">Noudatat järjestelmänvalvojan tätä asetusta koskevaa suositusta.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> valittu, valitse albumeita (<ph name="TOPIC_SOURCE" />) painamalla Enter</translation>
 <translation id="4848191975108266266">Google Assistantin Ok Google</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 7edb402..843112a 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -3957,6 +3957,7 @@
 <translation id="4842976633412754305">Cette page tente de charger des scripts provenant de sources non authentifiées.</translation>
 <translation id="4844333629810439236">Autres claviers</translation>
 <translation id="4844633725025837809">Pour renforcer la sécurité, chiffrez les mots de passe sur votre appareil avant qu'ils soient enregistrés dans le gestionnaire de mots de passe Google</translation>
+<translation id="4846628405149428620">Sélectionnez l'emplacement où ce site enregistrera les modifications</translation>
 <translation id="4846680374085650406">Vous suivez la recommandation de l'administrateur pour ce paramètre.</translation>
 <translation id="4847902821209177679">Source sélectionnée : <ph name="TOPIC_SOURCE" /> (<ph name="TOPIC_SOURCE_DESC" />), appuyez sur la touche Entrée pour sélectionner des albums de <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Mot-clé « Ok Google » de l'Assistant Google</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 45896e5..b9c6dd4d 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3967,6 +3967,7 @@
 <translation id="4842976633412754305">Cette page tente de charger des scripts à partir de sources non authentifiées.</translation>
 <translation id="4844333629810439236">Autres claviers</translation>
 <translation id="4844633725025837809">Pour renforcer la sécurité, chiffrez les mots de passe sur votre appareil avant qu'ils soient enregistrés dans le Gestionnaire de mots de passe Google</translation>
+<translation id="4846628405149428620">Sélectionnez où ce site peut enregistrer des modifications</translation>
 <translation id="4846680374085650406">Vous suivez la recommandation de l'administrateur pour ce paramètre.</translation>
 <translation id="4847902821209177679">Source <ph name="TOPIC_SOURCE" /> (<ph name="TOPIC_SOURCE_DESC" />) sélectionnée, appuyez sur Entrée pour sélectionner des albums dans <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Assistant Google "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 3d6f1662..b55edc24 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -3964,6 +3964,7 @@
 <translation id="4842976633412754305">Está páxina está tentando cargar scripts de fontes non autenticadas.</translation>
 <translation id="4844333629810439236">Outros teclados</translation>
 <translation id="4844633725025837809">Para dispoñer dunha maior seguranza, os teus contrasinais encríptanse no dispositivo antes de gardarse no xestor de contrasinais de Google</translation>
+<translation id="4846628405149428620">Selecciona onde pode gardar os cambios este sitio</translation>
 <translation id="4846680374085650406">Estás seguindo a recomendación do administrador para esta configuración.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> seleccionado. Preme Intro para seleccionar álbums de <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">"Ok Google" para ir ao Asistente de Google</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 4a325b08..c04ba24 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3964,6 +3964,7 @@
 <translation id="4842976633412754305">આ પેજ અનધિકૃત સૉર્સમાંથી સ્ક્રિપ્ટ લોડ કરવાનો પ્રયાસ કરી રહ્યું છે.</translation>
 <translation id="4844333629810439236">અન્ય કીબોર્ડ્સ</translation>
 <translation id="4844633725025837809">વધારાની સલામતી માટે, તમારા પાસવર્ડ Google પાસવર્ડ મેનેજરમાં સાચવવામાં આવે એ પહેલાં તેમને તમારા ડિવાઇસમાં એન્ક્રિપ્ટ કરો</translation>
+<translation id="4846628405149428620">આ સાઇટ ફેરફારોને ક્યાં સાચવી શકે તે પસંદ કરો</translation>
 <translation id="4846680374085650406">તમે આ સેટિંગ માટે વ્ય્વસ્થાપકની ભલામણને અનુસરી રહ્યાં છો.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />ની પસંદગી કરવામાં આવી, <ph name="TOPIC_SOURCE" /> આલ્બમ પસંદ કરવા માટે Enter કી દબાવો</translation>
 <translation id="4848191975108266266">Google Assistant "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index bfc4263..9ca795ed 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">मूल &amp;चित्र को नए टैब में खोलें</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> को 1 हफ़्ते में अपडेट करें}one{<ph name="DEVICE_TYPE" /> को {NUM_WEEKS} हफ़्ते में अपडेट करें}other{<ph name="DEVICE_TYPE" /> को {NUM_WEEKS} हफ़्तों में अपडेट करें}}</translation>
 <translation id="1056898198331236512">चेतावनी</translation>
+<translation id="105822690353767994">यह मैसेज आपको दोबारा न दिखे इसके लिए, इस साइट पर एक्सटेंशन को हमेशा इस्तेमाल करने की अनुमति दें.</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{नया पिन डालें. पिन में कम से कम 1 वर्ण होना ज़रूरी है और इसमें अक्षर, अंक, और दूसरे वर्ण डाले जा सकते हैं.}one{नया पिन डालें. पिन में कम से कम # वर्ण होना ज़रूरी है और इसमें अक्षर, अंक, और दूसरे वर्ण डाले जा सकते हैं.}other{नया पिन डालें. पिन में कम से कम # वर्ण होने ज़रूरी हैं और इसमें अक्षर, अंक, और दूसरे वर्ण डाले जा सकते हैं.}}</translation>
 <translation id="1059484610606223931">हाइपरटेक्स्ट ट्रांसपोर्ट प्रोटोकॉल (एचटीटीपीएस)</translation>
@@ -868,6 +869,7 @@
     इससे दूसरे डिवाइस के ऐप्लिकेशन या सामग्री पर कोई असर नहीं पड़ता.</translation>
 <translation id="1809734401532861917">मेरे बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को <ph name="USER_EMAIL_ADDRESS" /> में जोड़ें</translation>
 <translation id="1810366086647840386">इमेज का सर्वर</translation>
+<translation id="1811908311154949291">गुप्त मोड के लिए Fenced Frame: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">सेवाएं</translation>
 <translation id="18139523105317219">EDI पार्टी नाम</translation>
 <translation id="1815083418640426271">सादे टेक्‍स्‍ट के रूप में चिपकाएं</translation>
@@ -1687,6 +1689,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />, <ph name="NETWORK_ID" /> से कनेक्‍ट करने में असमर्थ था. कृपया कोई अन्‍य नेटवर्क चुनें या फिर से प्रयास करें.</translation>
 <translation id="2553440850688409052">यह प्लग इन छुपाएं</translation>
 <translation id="2554553592469060349">चुनी गई फ़ाइल बहुत बड़ी है (अधिकतम आकार: 3mb).</translation>
+<translation id="25568951186001797">Fenced Frame: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">आपके ब्राउज़िंग इतिहास का इस बात पर असर पड़ता है कि आपको कौनसे विज्ञापन दिखेंगे</translation>
 <translation id="2558896001721082624">सिस्टम मेन्यू में सुलभता विकल्प हमेशा दिखाएं</translation>
 <translation id="2559889124253841528">डिवाइस में सेव करें</translation>
@@ -2248,6 +2251,7 @@
 <translation id="3101126716313987672">हल्की रोशनी</translation>
 <translation id="3101709781009526431">तारीख और समय</translation>
 <translation id="3103451787721578293">कृपया इस डेटा को अपलोड करने की वजह बताएं:</translation>
+<translation id="3105339775057145050">पिछला अपडेट, जो पूरा नहीं हो सका</translation>
 <translation id="3105796011181310544">इसे बदलकर फिर से Google करें?</translation>
 <translation id="310671807099593501">साइट ब्लूटूथ का इस्तेमाल कर रही है</translation>
 <translation id="3108931485517391283">फ़ाइल नहीं मिल सकी</translation>
@@ -2550,6 +2554,7 @@
 <translation id="3433621910545056227">ओह!  सिस्टम डिवाइस इंस्टॉलेशन-समय विशेषता लॉक स्थापित नहीं कर पाया.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">अगर आपके बच्चे के लिए 'अन्य वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. इन सेटिंग के बारे में ज़्यादा जानें. साथ ही, जानें कि families.google.com पर इन्हें कैसे नियंत्रित करें.</translation>
+<translation id="3434475275396485144">इस सेटिंग को आपके फ़ोन का एडमिन मैनेज करता है</translation>
 <translation id="3434512374684753970">ऑडियो और वीडियो</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" आपके <ph name="CODE_TYPE" /> का अनुरोध कर रहा है</translation>
 <translation id="3435738964857648380">सुरक्षा</translation>
@@ -3981,6 +3986,7 @@
 <translation id="4842976633412754305">यह पृष्‍ठ अप्रमाणीकृत स्रोतों से स्‍क्रिप्‍ट लोड करने का प्रयास कर रहा है.</translation>
 <translation id="4844333629810439236">अन्य कीबोर्ड</translation>
 <translation id="4844633725025837809">ज़्यादा सुरक्षा के लिए, Google पासवर्ड मैनेजर में पासवर्ड सेव होने से पहले, अपने डिवाइस पर पासवर्ड को एन्क्रिप्ट (सुरक्षित) करें</translation>
+<translation id="4846628405149428620">चुनें कि यह साइट बदलावों को कहां सेव करेगी</translation>
 <translation id="4846680374085650406">आप इस सेटिंग के लिए व्यवस्थापक की अनुशंसा का अनुसरण कर रहे हैं.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> चुनी गई, <ph name="TOPIC_SOURCE" /> एल्बम चुनने के लिए Enter दबाएं</translation>
 <translation id="4848191975108266266">Google Assistant चालू करके "Ok Google" बोलें</translation>
@@ -6385,6 +6391,7 @@
 <translation id="7264695323040866038">क्या इसके साथ काम करने वाले वेब लिंक खोलने के लिए, हमेशा <ph name="APP" /> ऐप्लिकेशन का इस्तेमाल करना है?</translation>
 <translation id="7267044199012331848">वर्चुअल मशीन को इंस्टॉल नहीं किया जा सका. कृपया फिर से कोशिश करें या अपने एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">अपने फ़िंगरप्रिंट के अलग-अलग हिस्सों को कैप्चर करने के लिए, अपनी उंगली को उठाते रहें</translation>
+<translation id="7267898843336437186">कोई ऐसा फ़ोल्डर चुनें जिसे यह साइट देख सके</translation>
 <translation id="7268127947535186412">डिवाइस के मालिक इस सेटिंग का प्रबंधन करते हैं.</translation>
 <translation id="7269736181983384521">आस-पास शेयर करने की सुविधा और डेटा खर्च</translation>
 <translation id="7272674038937250585">कोई विवरण नहीं दिया गया है</translation>
@@ -7985,6 +7992,7 @@
 <translation id="8838770651474809439">हैमबर्गर</translation>
 <translation id="8838778928843281408">फ़ोन मैनेज करें</translation>
 <translation id="8841843049738266382">अनुमित वाले उपयोगकर्ताओं की सूची को देखने और बदलाव करने का ऐक्सेस दें</translation>
+<translation id="8842059467121215385">"<ph name="EXTENSION_NAME" />" का इस्तेमाल करने के लिए, पेज को रीफ़्रेश करें</translation>
 <translation id="8842594465773264717">इस फ़िंगरप्रिंट को मिटाएं</translation>
 <translation id="8845001906332463065">सहायता पाएं</translation>
 <translation id="8846132060409673887">इस कंप्यूटर का निर्माता और मॉडल पढ़ें</translation>
@@ -8140,6 +8148,7 @@
 <translation id="899657321862108550">आपका Chrome, हर जगह</translation>
 <translation id="899676909165543803">आपके कीबोर्ड पर, सबसे नीचे दाईं ओर वाली कुंजी फ़िंगरप्रिंट का सेंसर है. किसी भी उंगली से इसे हल्के से छुएं.</translation>
 <translation id="8999560016882908256">सेक्शन सिंटैक्स गड़बड़ी: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627"><ph name="FAILURE_TIME" /> पर '<ph name="STATUS_TEXT" />' की वजह से, डिवाइस मैनेजमेंट सर्वर से कनेक्ट नहीं किया जा सका</translation>
 <translation id="9003647077635673607">सभी वेबसाइटों पर अनुमति दें</translation>
 <translation id="9003677638446136377">फिर से जाँचें</translation>
 <translation id="9004754973617721124">क्या आप <ph name="SITE_NAME" /> के तहत आने वाली सभी साइटों, और इंस्टॉल किए गए ऐप्लिकेशन के लिए, साइट डेटा और अनुमतियां मिटाना चाहते हैं?</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 892daf1..09252992 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -3982,6 +3982,7 @@
 <translation id="4842976633412754305">Þessi síða er að reyna að hlaða skriftur af óstaðfestum uppruna.</translation>
 <translation id="4844333629810439236">Önnur lyklaborð</translation>
 <translation id="4844633725025837809">Dulkóðaðu aðgangsorðin þín í tækinu áður en þau eru vistuð í aðgangsorðastjórnun Google til að auka öryggið</translation>
+<translation id="4846628405149428620">Veldu hvar þetta vefsvæði getur vistað breytingar</translation>
 <translation id="4846680374085650406">Þú notar ráðlagt gildi stjórnandans fyrir þessa stillingu.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> valið, ýttu á færslulykilinn til að velja albúm í <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">„Ok Google“ Google hjálparans</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 21a0798..700c00c 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3966,6 +3966,7 @@
 <translation id="4842976633412754305">Questa pagina sta tentando di caricare script da fonti non autenticate.</translation>
 <translation id="4844333629810439236">Altre tastiere</translation>
 <translation id="4844633725025837809">Per maggiore sicurezza, cripta le password sul dispositivo prima che vengano salvate in Gestore delle password di Google</translation>
+<translation id="4846628405149428620">Seleziona la posizione in cui questo sito può salvare le modifiche</translation>
 <translation id="4846680374085650406">Stai seguendo il consiglio dell'amministratore per questa impostazione.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> selezionato, premi Invio per selezionare gli album <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Hotword "Ok Google" dell'Assistente Google</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index c2a313b..b118c481 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -3971,6 +3971,7 @@
 <translation id="4842976633412754305">ეს გვერდი ცდილობს სკრიპტების გადმოწერას არა საიმედო წყაროებიდან.</translation>
 <translation id="4844333629810439236">სხვა კლავიატურები</translation>
 <translation id="4844633725025837809">დამატებითი უსაფრთხოებისთვის, Google-ის პაროლების მმართველში შენახვამდე, დაშიფრეთ პაროლები თქვენს მოწყობილობაზე</translation>
+<translation id="4846628405149428620">აირჩიეთ, სად შეუძლია ამ საიტს ცვლილებების შენახვა</translation>
 <translation id="4846680374085650406">ამ პატარამეტრის შემთხვევაში, თქვენ იზიარებთ ადმინისტრატორის რეკომენდაციას.</translation>
 <translation id="4847902821209177679">არჩეულია <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />, <ph name="TOPIC_SOURCE" /> ალბომების ასარჩევად დააჭირეთ კლავიშზე Enter</translation>
 <translation id="4848191975108266266">Google ასისტენტის „Ok Google“</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 0a60385..93a7415 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -2111,7 +2111,7 @@
 <translation id="2988018669686457659">Қосалқы рендеринг құралы</translation>
 <translation id="2989123969927553766">Тінтуірдің айналдыруын жылдамдату</translation>
 <translation id="2989474696604907455">тіркелмеген</translation>
-<translation id="2989786307324390836">DER кодталған бинарлы, бір сертификат</translation>
+<translation id="2989786307324390836">DER кодталған екілік, бір сертификат</translation>
 <translation id="2989805286512600854">Жаңа қойындыда ашу</translation>
 <translation id="2990313168615879645">Аккаунт қосу</translation>
 <translation id="2990583317361835189">Сайттардың қозғалыс датчиктерін пайдалануына рұқсат бермеу</translation>
@@ -3962,6 +3962,7 @@
 <translation id="4842976633412754305">Бұл бет аутентификацияланбаған дереккөздерден сценарийлерді жүктеуге әрекет етуде.</translation>
 <translation id="4844333629810439236">Басқа пернетақталар</translation>
 <translation id="4844633725025837809">Қосымша қауіпсіздік үшін Google Құпия сөз менеджеріне сақтамас бұрын құрылғыдағы құпия сөздерді шифрлауға болады.</translation>
+<translation id="4846628405149428620">Бұл сайт өзгерістерді қай жерге сақтайтынын таңдаңыз</translation>
 <translation id="4846680374085650406">Бұл параметр үшін әкімші ұсынысын орындаудасыз.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> таңдалды, <ph name="TOPIC_SOURCE" /> альбомдарын таңдау үшін Enter пернесін басыңыз.</translation>
 <translation id="4848191975108266266">Google Assistant үшін қолданылатын "Ok Google" фразасы</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 46d423a..919bce14 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">បើករូបភាពដើមនៅក្នុងផ្ទាំងថ្មី</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{ដំឡើងកំណែ <ph name="DEVICE_TYPE" /> ក្នុងរយៈពេល 1 សប្ដាហ៍}other{ដំឡើងកំណែ <ph name="DEVICE_TYPE" /> ក្នុងរយៈពេល {NUM_WEEKS} សប្ដាហ៍}}</translation>
 <translation id="1056898198331236512">ការព្រមាន</translation>
+<translation id="105822690353767994">អនុញ្ញាត​ឱ្យកម្មវិធីបន្ថែម​ដំណើរការ​នៅលើ​គេហទំព័រ​នេះ​ជានិច្ច ប្រសិនបើ​អ្នក​មិន​ចង់​ឃើញ​សារ​នេះ​ទៀត។</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{បញ្ចូល​កូដ PIN ថ្មី​របស់អ្នក។ កូដ PIN ត្រូវតែ​មាន​យ៉ាងហោចណាស់​មួយ​តួ និង​អាច​មានជា​អក្សរ លេខ និង​តួអក្សរ​ផ្សេងទៀត។}other{បញ្ចូល​កូដ PIN ថ្មី​របស់អ្នក។ កូដ PIN ត្រូវតែ​មាន​យ៉ាងហោចណាស់​ # ​តួ និង​អាច​មានជា​អក្សរ លេខ និង​តួអក្សរ​ផ្សេងទៀត។}}</translation>
 <translation id="1059484610606223931">ប្រូតូកូលបញ្ជូនអត្ថបទតំណ (HTTPS)</translation>
@@ -867,6 +868,7 @@
     សកម្មភាពនេះ​មិនប៉ះពាល់ដល់​កម្មវិធី ឬខ្លឹមសារ​នៅលើឧបករណ៍​ផ្សេងទៀតទេ។</translation>
 <translation id="1809734401532861917">បញ្ចូល​ចំណាំ ប្រវត្តិ ពាក្យ​សម្ងាត់ និង​ការ​កំណត់​ផ្សេង​ទៀត​របស់​ខ្ញុំទៅ​ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1810366086647840386">ម៉ាស៊ីនមេរូបភាព</translation>
+<translation id="1811908311154949291">Fenced Frame ឯកជន៖ <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">សេវាកម្ម</translation>
 <translation id="18139523105317219">ឈ្មោះភាគី EDI</translation>
 <translation id="1815083418640426271">បិទភ្ជាប់ជាអត្ថបទធម្មតា</translation>
@@ -1686,6 +1688,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> មិនអាចភ្ជាប់ទៅ <ph name="NETWORK_ID" />។ សូមជ្រើសរើសបណ្តាញដ៏ទៃ ឬព្យាយាមម្តងទៀត។</translation>
 <translation id="2553440850688409052">លាក់កម្មវិធីជំនួយនេះ</translation>
 <translation id="2554553592469060349">ឯកសារដែលបានជ្រើសរើសធំពេក (ទំហំអតិបរមា៖ 3mb)។</translation>
+<translation id="25568951186001797">Fenced Frame៖ <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">ប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នកមានឥទ្ធិពលលើការផ្សាយពាណិជ្ជកម្មដែលអ្នកមើលឃើញ</translation>
 <translation id="2558896001721082624">បង្ហាញជម្រើសភាពងាយស្រួលជានិច្ចនៅក្នុងម៉ឺនុយប្រព័ន្ធ</translation>
 <translation id="2559889124253841528">រក្សាទុក​ទៅ​ក្នុង​ឧបករណ៍</translation>
@@ -2248,6 +2251,7 @@
 <translation id="3101126716313987672">ពន្លឺតិច</translation>
 <translation id="3101709781009526431">កាលបរិច្ឆេទ និងពេលវេលា</translation>
 <translation id="3103451787721578293">សូមបញ្ចូល​មូលហេតុ​ដែលបង្ហោះ​ទិន្នន័យនេះ៖</translation>
+<translation id="3105339775057145050">ការធ្វើ​បច្ចុប្បន្នភាព​មិនជោគជ័យ​ចុង​ក្រោយ</translation>
 <translation id="3105796011181310544">ប្ដូរទៅ Google វិញឬ?</translation>
 <translation id="310671807099593501">ទំព័រ​កំពុងប្រើ​ប៊្លូធូស</translation>
 <translation id="3108931485517391283">មិនអាចទទួលបានទេ</translation>
@@ -2550,6 +2554,7 @@
 <translation id="3433621910545056227">អូ! ប្រព័ន្ធបានបរាជ័យក្នុងការបង្កើតសោគុណលក្ខណៈរយៈពេលតំឡើងឧបករណ៍។</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">ប្រសិនបើ​ការកំណត់​សកម្មភាព​កម្មវិធី និង​គេហទំព័រ​បន្ថែម​ត្រូវបាន​បើកសម្រាប់​កូនរបស់អ្នក នោះ​ទិន្នន័យនេះ​អាចត្រូវ​បានរក្សាទុក​ទៅក្នុង​គណនី Google របស់គាត់។ ស្វែងយល់​បន្ថែម​អំពី​ការកំណត់​ទាំង​នេះ និង​របៀប​កែតម្រូវ​​វាតាមរយៈ families.google.com។</translation>
+<translation id="3434475275396485144">ការកំណត់​នេះ​ត្រូវបាន​គ្រប់គ្រង​ដោយ​អ្នកគ្រប់គ្រង​ទូរសព្ទ​របស់អ្នក</translation>
 <translation id="3434512374684753970">សំឡេង និង​វីដេអូ</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" កំពុង​ស្នើ​សុំ​ <ph name="CODE_TYPE" /> របស់​អ្នក</translation>
 <translation id="3435738964857648380">សុវត្ថិភាព</translation>
@@ -6386,6 +6391,7 @@
 <translation id="7264695323040866038">ប្រើកម្មវិធី <ph name="APP" /> ជានិច្ច ដើម្បីបើក​តំណបណ្ដាញដែលស្គាល់ឬ?</translation>
 <translation id="7267044199012331848">មិនអាច​ដំឡើង​ម៉ាស៊ីន​និម្មិត​បានទេ​។ សូម​ព្យាយាម​ម្ដងទៀត ឬ​ទាក់ទង​អ្នកគ្រប់គ្រង​របស់អ្នក​។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="7267875682732693301">បន្តលើកម្រាមដៃឡើង ដើម្បីបញ្ចូលផ្នែកផ្សេងទៀតនៃស្នាមម្រាមដៃរបស់អ្នក</translation>
+<translation id="7267898843336437186">ជ្រើសរើស​ថត​ដែល​គេហទំព័រ​នេះ​អាច​មើល</translation>
 <translation id="7268127947535186412">ការកំណត់នេះត្រូវបានគ្រប់គ្រងដោយម្ចាស់ឧបករណ៍។</translation>
 <translation id="7269736181983384521">ការប្រើទិន្នន័យនៃការចែករំលែកនៅ​ជិត</translation>
 <translation id="7272674038937250585">មិន​បាន​ផ្តល់​ការពណ៌នា​ទេ</translation>
@@ -7986,6 +7992,7 @@
 <translation id="8838770651474809439">ហេមប៊ឺហ្គើរ</translation>
 <translation id="8838778928843281408">គ្រប់គ្រង​ទូរសព្ទ</translation>
 <translation id="8841843049738266382">អាន និងប្ដូរអ្នកប្រើប្រាស់នៅក្នុងបញ្ជីអនុញ្ញាត</translation>
+<translation id="8842059467121215385">ផ្ទុក​ទំព័រ​នេះឡើងវិញ​ដើម្បីប្រើប្រាស់ "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="8842594465773264717">លុប​ស្នាមម្រាមដៃ​នេះ</translation>
 <translation id="8845001906332463065">ទទួលជំនួយ</translation>
 <translation id="8846132060409673887">អានក្រុមហ៊ុនផលិត និងម៉ូដែល​នៃ​កុំព្យូទ័រនេះ</translation>
@@ -8141,6 +8148,7 @@
 <translation id="899657321862108550">ចូលគណនី​នៅលើ Chrome របស់អ្នក​នៅគ្រប់ទីកន្លែង</translation>
 <translation id="899676909165543803">ឧបករណ៍​ចាប់ស្នាម​ម្រាមដៃគឺជាគ្រាប់ចុច​ខាងស្ដាំ​ដៃនៅផ្នែកខាងក្រោម​ក្ដារ​ចុចរបស់អ្នក។ សូមប៉ះឧបករណ៍​ចាប់ស្នាម​ម្រាមដៃនេះ​ថ្នមៗដោយប្រើម្រាមដៃណាមួយ។</translation>
 <translation id="8999560016882908256">វាក្យសម្ព័ន្ធនៃ​ផ្នែកមានបញ្ហា៖ <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">ការតភ្ជាប់​ទៅ​ម៉ាស៊ីន​មេ​គ្រប់គ្រង​ឧបករណ៍​មិន​បាន​សម្រេច​ដោយ​មានស្ថានភាព​ដាក់​ថា '<ph name="STATUS_TEXT" />' នៅ​ថ្ងៃ<ph name="FAILURE_TIME" /></translation>
 <translation id="9003647077635673607">អនុញ្ញាតនៅលើគេហទំព័រទាំងអស់</translation>
 <translation id="9003677638446136377">ពិនិត្យម្តងទៀត</translation>
 <translation id="9004754973617721124">សម្អាតទិន្នន័យគេហទំព័រ និងការអនុញ្ញាតសម្រាប់ <ph name="SITE_NAME" /> និងគេហទំព័រទាំងអស់ដែលស្ថិតនៅក្រោមវា និងកម្មវិធីដែលបានដំឡើងរបស់វាឬ?</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 292d2a7..159a91a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -3975,6 +3975,7 @@
 <translation id="4842976633412754305">ದೃಢೀಕರಿಸದಿರುವ ಮೂಲಗಳಿಂದ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳನ್ನು ಲೋಡ್‌ ಮಾಡಲು ಈ ಪುಟವು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation>
 <translation id="4844333629810439236">ಇತರ ಕೀಬೋರ್ಡ್‌ಗಳು</translation>
 <translation id="4844633725025837809">ಹೆಚ್ಚಿನ ಸುರಕ್ಷತೆಗಾಗಿ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು Google ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಉಳಿಸುವ ಮೊದಲು ಅವುಗಳನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿ</translation>
+<translation id="4846628405149428620">ಈ ಸೈಟ್ ಬದಲಾವಣೆಗಳನ್ನು ಎಲ್ಲಿ ಉಳಿಸಬಹುದು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="4846680374085650406">ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್‌ಗಾಗಿ ನಿರ್ವಾಹಕರ ಶಿಫಾರಸನ್ನು ಅನುಸರಿಸುತ್ತಿರುವಿರಿ.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ, <ph name="TOPIC_SOURCE" /> ಆಲ್ಬಮ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಲು Enter ಒತ್ತಿರಿ</translation>
 <translation id="4848191975108266266">Google Assistant "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 3f653f4..8dac17d 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -3981,6 +3981,7 @@
 <translation id="4842976633412754305">이 페이지가 인증되지 않은 소스에서 스크립트를 로드하려고 시도하고 있습니다.</translation>
 <translation id="4844333629810439236">기타 키보드</translation>
 <translation id="4844633725025837809">보안 강화를 위해 비밀번호를 기기 내에서 암호화한 후 Google 비밀번호 관리자에 저장합니다</translation>
+<translation id="4846628405149428620">사이트에서 변경사항을 저장할 위치 선택</translation>
 <translation id="4846680374085650406">이 설정에 대한 관리자 권장사항을 따릅니다.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> 선택됨, <ph name="TOPIC_SOURCE" /> 앨범을 선택하려면 Enter를 누르세요</translation>
 <translation id="4848191975108266266">Google 어시스턴트 'Ok Google'</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 8c7f57a..aa47d8c 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -3982,6 +3982,7 @@
 <translation id="4842976633412754305">Бул барак аныктыгы текшерилбеген булактардан келген скрипттерди жүктөөгө аракет кылууда.</translation>
 <translation id="4844333629810439236">Башка баскычтоптор</translation>
 <translation id="4844633725025837809">Кошумча коопсуздук үчүн Google Сырсөздөрдү башкаргычка сакталганга чейин сырсөздөрдү түзмөгүңүздө шифрлеңиз</translation>
+<translation id="4846628405149428620">Бул сайт өзгөртүүлөрдү сактай турган жерди тандаңыз</translation>
 <translation id="4846680374085650406">Бул жөндөөнү администратордун сунушу боюнча иштетип жатасыз.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> тандалды, <ph name="TOPIC_SOURCE" /> альбомдорун тандоо үчүн Enter баскычын басыңыз</translation>
 <translation id="4848191975108266266">Google Жардамчыга "Окей Google" деп кайрылуу</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 5936bf6..f513512 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -3985,6 +3985,7 @@
 <translation id="4842976633412754305">Šis puslapis bando įkelti scenarijus iš neautentifikuotų šaltinių.</translation>
 <translation id="4844333629810439236">Kitos klaviatūros</translation>
 <translation id="4844633725025837809">Kad užtikrintumėte geresnę saugą, šifruokite slaptažodžius įrenginyje prieš išsaugodami juos „Google“ slaptažodžių tvarkytuvėje</translation>
+<translation id="4846628405149428620">Pasirinkite, kur ši svetainė gali išsaugoti pakeitimus</translation>
 <translation id="4846680374085650406">Jūs vadovaujatės administratoriaus rekomendacija dėl šio nustatymo.</translation>
 <translation id="4847902821209177679">Pasirinkta <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />; jei norite pasirinkti <ph name="TOPIC_SOURCE" /> albumus, paspauskite „Enter“</translation>
 <translation id="4848191975108266266">„Google“ padėjėjas „Ok Google“</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 226a44b..9859d48 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3968,6 +3968,7 @@
 <translation id="4842976633412754305">Šajā lapā tiek mēģināts ielādēt skriptus no neautentificētiem avotiem.</translation>
 <translation id="4844333629810439236">Citas tastatūras</translation>
 <translation id="4844633725025837809">Lai gādātu par papildu drošību, šifrējiet paroles savā ierīcē, pirms tās tiek saglabātas Google paroļu pārvaldniekā.</translation>
+<translation id="4846628405149428620">Atlasiet, kur šī vietne var saglabāt izmaiņas</translation>
 <translation id="4846680374085650406">Jūs ievērojat administratora ieteikumus attiecībā uz šo iestatījumu.</translation>
 <translation id="4847902821209177679">Atlasīts <ph name="TOPIC_SOURCE" /> vienums <ph name="TOPIC_SOURCE_DESC" />. Lai atlasītu <ph name="TOPIC_SOURCE" /> albumus, nospiediet taustiņu Enter.</translation>
 <translation id="4848191975108266266">Google asistents un “Ok Google”</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 1c076a6..ee216659 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">Отвори оригинална &amp;слика во нова картичка</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{Ажурирајте го <ph name="DEVICE_TYPE" /> во рок од 1 седмица}one{Ажурирајте го <ph name="DEVICE_TYPE" /> во рок од {NUM_WEEKS} седмица}other{Ажурирајте го <ph name="DEVICE_TYPE" /> во рок од {NUM_WEEKS} седмици}}</translation>
 <translation id="1056898198331236512">Предупредување</translation>
+<translation id="105822690353767994">Дозволете екстензијата секогаш да се извршува на сајтов ако не сакате повторно да се прикаже поракава.</translation>
 <translation id="1058262162121953039">Личен код за деблокирање (PUK)</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{Внесете го новиот PIN-код. PIN-кодот мора да содржи најмалку еден знак, а може да содржи букви, бројки и други знаци.}one{Внесете го новиот PIN-код. PIN-кодот мора да содржи најмалку # знак, а може да содржи букви, бројки и други знаци.}other{Внесете го новиот PIN-код. PIN-кодот мора да содржи најмалку # знака, а може да содржи букви, бројки и други знаци.}}</translation>
 <translation id="1059484610606223931">Протокол за безбеден пренос на хипертекст (HTTPS)</translation>
@@ -868,6 +869,7 @@
     Ова не влијае на апликациите или содржините на другите уреди.</translation>
 <translation id="1809734401532861917">Додај ги моите обележувачи, историја, лозинки и други поставки на <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1810366086647840386">Отсликан сервер</translation>
+<translation id="1811908311154949291">Изолирана инкогнито рамка: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">Услуги</translation>
 <translation id="18139523105317219">Име на партијата EDI</translation>
 <translation id="1815083418640426271">Залепи како обичен текст</translation>
@@ -1687,6 +1689,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> не може да се поврзе на <ph name="NETWORK_ID" />. Изберете друга мрежа или обидете се повторно.</translation>
 <translation id="2553440850688409052">Сокриј го приклучокот</translation>
 <translation id="2554553592469060349">Избраната датотека е преголема (максимална големина: 3 MB).</translation>
+<translation id="25568951186001797">Изолирана рамка: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">Вашата историја на прелистувањето влијае на рекламите што ги гледате</translation>
 <translation id="2558896001721082624">Секогаш прикажувај опции за пристап во системското мени</translation>
 <translation id="2559889124253841528">Зачувај на уредот</translation>
@@ -2249,6 +2252,7 @@
 <translation id="3101126716313987672">Затемни светло</translation>
 <translation id="3101709781009526431">Датум и време</translation>
 <translation id="3103451787721578293">Внесете причина за прикачување на податоциве:</translation>
+<translation id="3105339775057145050">Последно неуспешно ажурирање</translation>
 <translation id="3105796011181310544">Да се врати на Google?</translation>
 <translation id="310671807099593501">Сајтот користи Bluetooth</translation>
 <translation id="3108931485517391283">Не може да се прими</translation>
@@ -2551,6 +2555,7 @@
 <translation id="3433621910545056227">Уф! Системот не успеа да воспостави заклучување на уредот за атрибути за време на инсталацијата.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">Ако сте ја вклучиле дополнителната поставка „Активност на интернет и апликации“ за вашето дете, овие податоци може да се зачувуваат во сметката на Google на детето. Дознајте повеќе за поставкиве и за тоа како да ги приспособите на families.google.com.</translation>
+<translation id="3434475275396485144">Администраторот на телефонот управува со поставкава.</translation>
 <translation id="3434512374684753970">Аудио и видео</translation>
 <translation id="3435688026795609344">„<ph name="EXTENSION_NAME" />“ го бара вашиот <ph name="CODE_TYPE" /></translation>
 <translation id="3435738964857648380">Безбедност</translation>
@@ -6388,6 +6393,7 @@
 <translation id="7264695323040866038">Секогаш да се користи апликацијата <ph name="APP" /> за отворање поддржани веб-линкови?</translation>
 <translation id="7267044199012331848">Не може да се инсталира виртуелната машина. Обидете се повторно или контактирајте со администраторот. Код за грешка: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">Подигнувајте го прстот за да ги додадете различните делови од отпечатокот</translation>
+<translation id="7267898843336437186">Изберете папка што сајтов ќе може да ја гледа</translation>
 <translation id="7268127947535186412">Со поставката управува сопственикот на уредот.</translation>
 <translation id="7269736181983384521">Користење интернет на „Споделување во близина“</translation>
 <translation id="7272674038937250585">Не е даден опис</translation>
@@ -7991,6 +7997,7 @@
 <translation id="8838770651474809439">Хамбургер</translation>
 <translation id="8838778928843281408">Управувајте со телефоните</translation>
 <translation id="8841843049738266382">Читај и менувај ги корисниците од списокот на дозволен пристап</translation>
+<translation id="8842059467121215385">Освежете ја страницата за да се користи „<ph name="EXTENSION_NAME" />“</translation>
 <translation id="8842594465773264717">Избришете го отпечатоков</translation>
 <translation id="8845001906332463065">Побарајте помош</translation>
 <translation id="8846132060409673887">Прочитај ги производителот и моделот на овој компјутер</translation>
@@ -8146,6 +8153,7 @@
 <translation id="899657321862108550">Вашиот Chrome, насекаде</translation>
 <translation id="899676909165543803">Сензорот за отпечатоци е долното десно копче на вашата тастатура. Допрете го нежно со кој било прст.</translation>
 <translation id="8999560016882908256">Синтаксичка грешка во делот: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">Поврзувањето со серверот на „Управник со уреди“ не успеа и има статус „<ph name="STATUS_TEXT" />“ во <ph name="FAILURE_TIME" /></translation>
 <translation id="9003647077635673607">Дозволи на сите веб-локации</translation>
 <translation id="9003677638446136377">Проверете повторно</translation>
 <translation id="9004754973617721124">Да се избришат податоците и дозволите од сајтот за <ph name="SITE_NAME" />, сите сајтови под него и неговите инсталирани апликации?</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 2bd678e..219c6af 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">ഒറിജിനൽ ചിത്രം പുതിയ ടാബിൽ തുറക്കുക</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{ഒരാഴ്‌ചയ്ക്കുള്ളിൽ <ph name="DEVICE_TYPE" /> അപ്ഡേറ്റ് ചെയ്യുക}other{{NUM_WEEKS} ആഴ്‌ചയ്ക്കുള്ളിൽ <ph name="DEVICE_TYPE" /> അപ്ഡേറ്റ് ചെയ്യുക}}</translation>
 <translation id="1056898198331236512">മുന്നറിയിപ്പ്</translation>
+<translation id="105822690353767994">ഈ സന്ദേശം വീണ്ടും കാണാൻ താൽപ്പര്യമില്ലെങ്കിൽ ഈ സൈറ്റിൽ വിപുലീകരണം റൺ ചെയ്യാൻ എപ്പോഴും അനുവദിക്കുക.</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{നിങ്ങളുടെ പുതിയ പിൻ നൽകുക. കുറഞ്ഞത് ഒരു പ്രതീകമെങ്കിലും ദൈർഘ്യമുള്ളതായിരിക്കണം പിൻ, ഇതിൽ അക്ഷരങ്ങളും അക്കങ്ങളും മറ്റ് പ്രതീകങ്ങളും ഉൾപ്പെടാം.}other{നിങ്ങളുടെ പുതിയ പിൻ നൽകുക. കുറഞ്ഞത് # പ്രതീകങ്ങളെങ്കിലും ദൈർഘ്യമുള്ളതായിരിക്കണം പിൻ, ഇതിൽ അക്ഷരങ്ങളും അക്കങ്ങളും മറ്റ് പ്രതീകങ്ങളും ഉൾപ്പെടാം.}}</translation>
 <translation id="1059484610606223931">ഹൈപ്പർടെക്‌സ്‌റ്റ് ട്രാൻസ്‌പോർട്ട് പ്രോട്ടോക്കോൾ (HTTPS)</translation>
@@ -855,6 +856,7 @@
       ഇത് മറ്റ് ഉപകരണങ്ങളിലെ ആപ്പുകളെയോ ഉള്ളടക്കത്തെയോ ബാധിക്കില്ല.</translation>
 <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> ഇമെയിലിൽ എന്റെ ബുക്ക്‌മാർക്കുകളും ചരിത്രവും പാസ്‌വേഡുകളും മറ്റ് ക്രമീകരണവും ചേർക്കുക</translation>
 <translation id="1810366086647840386">ചിത്രത്തിന്റെ സെർവർ</translation>
+<translation id="1811908311154949291">അദൃശ്യ മോഡ് പരിരക്ഷയുള്ള ഫ്രെയിം: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">സേവനങ്ങള്‍</translation>
 <translation id="18139523105317219">EDI പാര്‍‌ട്ടി നാമം</translation>
 <translation id="1815083418640426271">പ്ലെയിന്‍ വാചകമായി ഒട്ടിക്കുക</translation>
@@ -1670,6 +1672,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> ന് <ph name="NETWORK_ID" /> ലേയ്ക്ക് ബന്ധിപ്പിക്കാന്‍ കഴിയുന്നില്ല. ദയവായി മറ്റൊരു നെറ്റ്‍വര്‍ക്ക് തിരഞ്ഞെടുക്കുക അല്ലെങ്കില്‍ വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2553440850688409052">ഈ പ്ലഗിന്‍ മറയ്ക്കുക</translation>
 <translation id="2554553592469060349">തിരഞ്ഞെടുത്ത ഫയൽ വളരെ വലുതാണ് (പരമാവധി വലുപ്പം: 3mb).</translation>
+<translation id="25568951186001797">പരിരക്ഷയുള്ള ഫ്രെയിം: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം നിങ്ങൾ കാണുന്ന പരസ്യങ്ങളെ ബാധിക്കും</translation>
 <translation id="2558896001721082624">സിസ്റ്റം മെനുവിൽ ഉപയോഗസഹായി ഓപ്‌ഷനുകൾ എല്ലായ്പ്പോഴും കാണിക്കുക</translation>
 <translation id="2559889124253841528">ഉപകരണത്തിൽ സംരക്ഷിക്കുക</translation>
@@ -2232,6 +2235,7 @@
 <translation id="3101126716313987672">മങ്ങിയ വെളിച്ചം</translation>
 <translation id="3101709781009526431">തീയതിയും സമയവും</translation>
 <translation id="3103451787721578293">ഈ ഡാറ്റ അപ്‌ലോഡ് ചെയ്യുന്നതിന് കാരണം നൽകുക:</translation>
+<translation id="3105339775057145050">പരാജയപ്പെട്ട അവസാന അപ്‌ഡേറ്റ്</translation>
 <translation id="3105796011181310544">തിരികെ Google-ലേക്ക് മാറ്റണോ?</translation>
 <translation id="310671807099593501">സൈറ്റ്, bluetooth ഉപയോഗിക്കുന്നു</translation>
 <translation id="3108931485517391283">സ്വീകരിക്കാനാകുന്നില്ല</translation>
@@ -2534,6 +2538,7 @@
 <translation id="3433621910545056227">ക്ഷമിക്കണം! ഉപകരണ ഇൻസ്റ്റലേഷൻ-സമയ ആട്രിബ്യൂട്ട് ലോക്ക് സ്ഥാപിക്കുന്നതിൽ സിസ്റ്റം പരാജയപ്പെട്ടു.</translation>
 <translation id="3434107140712555581">ബാറ്ററി: <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">നിങ്ങളുടെ കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. ഈ ക്രമീകരണത്തെ കുറിച്ചും അതെങ്ങനെയാണ് ക്രമപ്പെടുത്തുന്നത് എന്നതിനെ കുറിച്ചും families.google.com എന്നതിൽ കൂടുതലറിയുക.</translation>
+<translation id="3434475275396485144">നിങ്ങളുടെ ഫോണിന്റെ അഡ്‌മിൻ ആണ് ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത്</translation>
 <translation id="3434512374684753970">ഓഡിയോയും വീഡിയോയും</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" നിങ്ങളുടെ <ph name="CODE_TYPE" /> അഭ്യർത്ഥിക്കുന്നു</translation>
 <translation id="3435738964857648380">സുരക്ഷ</translation>
@@ -6369,6 +6374,7 @@
 <translation id="7264695323040866038">പിന്തുണയ്ക്കുന്ന വെബ് ലിങ്കുകൾ തുറക്കാൻ എല്ലായ്‌പ്പോഴും <ph name="APP" /> ആപ്പ് ഉപയോഗിക്കണോ?</translation>
 <translation id="7267044199012331848">വെർച്വൽ മെഷീൻ ഇൻസ്‍റ്റാൾ ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ നിങ്ങളുടെ അഡ്‍മിനെ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">നിങ്ങളുടെ ഫിംഗർപ്രിന്റിന്റെ വ്യത്യസ്ത ഭാഗങ്ങൾ ചേർക്കുന്നതിന് നിങ്ങളുടെ വിരൽ ഉയർത്തിക്കൊണ്ടിരിക്കുക</translation>
+<translation id="7267898843336437186">ഈ സൈറ്റിന് കാണാനാകുന്ന ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="7268127947535186412">ഉപകരണ ഉടമയാണ് ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത്.</translation>
 <translation id="7269736181983384521">സമീപമുള്ള പങ്കിടൽ ഡാറ്റാ ഉപയോഗം</translation>
 <translation id="7272674038937250585">വിവരണമൊന്നും നൽകിയിട്ടില്ല</translation>
@@ -7967,6 +7973,7 @@
 <translation id="8838770651474809439">ഹാംബർഗർ</translation>
 <translation id="8838778928843281408">ഫോണുകൾ മാനേജ് ചെയ്യുക</translation>
 <translation id="8841843049738266382">വൈറ്റ്ലിസ്‌റ്റ് ചെയ്‌ത ഉപയോക്താക്കളെ വായിക്കുക, മാറ്റുക</translation>
+<translation id="8842059467121215385">"<ph name="EXTENSION_NAME" />" ഉപയോഗിക്കാൻ പേജ് റീഫ്രഷ് ചെയ്യുക</translation>
 <translation id="8842594465773264717">ഈ ഫിംഗർപ്രിന്റ് ഇല്ലാതാക്കുക</translation>
 <translation id="8845001906332463065">സഹായം നേടുക</translation>
 <translation id="8846132060409673887">ഈ കമ്പ്യൂട്ടറിന്റെ നിർമ്മാതാവ്, മോഡൽ എന്നിവയെക്കുറിച്ചുള്ള വിവരം വായിക്കുക</translation>
@@ -8122,6 +8129,7 @@
 <translation id="899657321862108550">നിങ്ങളുടെ Chrome, എല്ലായിടത്തും</translation>
 <translation id="899676909165543803">നിങ്ങളുടെ കീബോർഡിലെ താഴെ വലതുഭാഗത്തുള്ള കീയാണ് ഫിംഗർപ്രിന്റ് സെൻസർ. ഏതെങ്കിലും വിരലുകൊണ്ട് അതിൽ മൃദുവായി സ്‌പർശിക്കുക.</translation>
 <translation id="8999560016882908256">വിഭാഗ വാക്യഘടനാ പിശക്: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">ഡിവൈസ് മാനേജ്‌മെന്റ് സെർവറിലേക്കുള്ള കണക്ഷൻ, '<ph name="STATUS_TEXT" />' എന്ന സ്റ്റാറ്റസോടെ <ph name="FAILURE_TIME" />-ന് പരാജയപ്പെട്ടു</translation>
 <translation id="9003647077635673607">എല്ലാ വെബ്‌സൈറ്റുകളിലും അനുവദിക്കുക</translation>
 <translation id="9003677638446136377">വീണ്ടും പരിശോധിക്കുക</translation>
 <translation id="9004754973617721124"><ph name="SITE_NAME" /> എന്ന സൈറ്റിനും അതിന് കീഴിലുള്ള എല്ലാ സൈറ്റുകൾക്കും ഇൻസ്റ്റാൾ ചെയ്ത അവയുടെ ആപ്പുകൾക്കുമുള്ള സൈറ്റ് ഡാറ്റയും അനുമതികളും മായ്‌ക്കണോ?</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 4ba1d4dc..35d17c4 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3979,6 +3979,7 @@
 <translation id="4842976633412754305">हे पृष्ठ अप्रमाणिकृत स्त्रोतांवरून स्क्रिप्ट लोड करण्याचा प्रयत्न करत आहे.</translation>
 <translation id="4844333629810439236">अन्य कीबोर्ड</translation>
 <translation id="4844633725025837809">अतिरिक्त सुरक्षिततेसाठी, पासवर्ड हे Google पासवर्ड व्यवस्थापक यामध्ये सेव्ह केले जाण्यापूर्वी तुमच्या डिव्हाइसवर एंक्रिप्ट करा</translation>
+<translation id="4846628405149428620">ही साइट बदल कुठे सेव्ह करू शकते ते निवडा</translation>
 <translation id="4846680374085650406">तुम्ही या सेटिंगसाठी ॲडमिनिस्ट्रेटरच्या शिफारसींना फॉलो करत आहात.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> निवडले, <ph name="TOPIC_SOURCE" /> अल्बम निवडण्यासाठी एंटर दाबा</translation>
 <translation id="4848191975108266266">Google Assistant "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index fed601c..273704c 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3963,6 +3963,7 @@
 <translation id="4842976633412754305">यस पृष्ठले प्रमाणित नगरिएका स्रोतहरूबाट स्क्रिप्टहरू लोड गर्ने कोशिश गरिरहेको छ।</translation>
 <translation id="4844333629810439236">अन्य कुञ्जीपाटीहरू</translation>
 <translation id="4844633725025837809">आफ्ना पासवर्डहरू अझ सुरक्षित राख्नका निम्ति ती पासवर्डहरू आफ्नो डिभाइसमा इन्क्रिप्ट गरेपछि मात्र Google पासवर्ड म्यानेजरमा सेभ गर्नुहोस्</translation>
+<translation id="4846628405149428620">यो साइटले परिवर्तनहरू कहाँ सेभ गर्न सक्छ भन्ने कुरा चयन गर्नुहोस्</translation>
 <translation id="4846680374085650406">तपाईंले यो सेटिङका लागि प्रशासकको सिफारिस पालना गरिरहनुभएको छ ।</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> चयन गरिएको छ, <ph name="TOPIC_SOURCE" /> का एल्बमहरू चयन गर्न Enter थिच्नुहोस्</translation>
 <translation id="4848191975108266266">"Ok Google" भनेर Google सहायक अन गर्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 6243c91..4a76d25 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਮੂਲ &amp;ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" /> ਨੂੰ 1 ਹਫ਼ਤੇ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}one{<ph name="DEVICE_TYPE" /> ਨੂੰ {NUM_WEEKS} ਹਫ਼ਤੇ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}other{<ph name="DEVICE_TYPE" /> ਨੂੰ {NUM_WEEKS} ਹਫ਼ਤਿਆਂ ਦੇ ਅੰਦਰ ਅੱਪਡੇਟ ਕਰੋ}}</translation>
 <translation id="1056898198331236512">ਚਿਤਾਵਨੀ</translation>
+<translation id="105822690353767994">ਜੇ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਦੁਬਾਰਾ ਨਹੀਂ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਹਮੇਸ਼ਾਂ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਇਸ ਸਾਈਟ 'ਤੇ ਚੱਲਣ ਦੀ ਆਗਿਆ ਦਿਓ।</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{ਆਪਣਾ ਨਵਾਂ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਪਿੰਨ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਅੱਖਰ, ਨੰਬਰ ਅਤੇ ਹੋਰ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।}one{ਆਪਣਾ ਨਵਾਂ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਪਿੰਨ ਘੱਟੋ-ਘੱਟ # ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਅੱਖਰ, ਨੰਬਰ ਅਤੇ ਹੋਰ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।}other{ਆਪਣਾ ਨਵਾਂ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਪਿੰਨ ਘੱਟੋ-ਘੱਟ # ਅੱਖਰ-ਚਿੰਨ੍ਹਾਂ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਅੱਖਰ, ਨੰਬਰ ਅਤੇ ਹੋਰ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹੋ ਸਕਦੇ ਹਨ।}}</translation>
 <translation id="1059484610606223931">ਹਾਇਪਰਟੈਕਸਟ ਟਰਾਂਸਪੋਰਟ ਪ੍ਰੋਟੋਕੋਲ (HTTPS)</translation>
@@ -868,6 +869,7 @@
     ਇਹ ਹੋਰ ਡੀਵਾਈਸਾਂ ਦੀਆਂ ਐਪਾਂ ਜਾਂ ਸਮੱਗਰੀ 'ਤੇ ਅਸਰ ਨਹੀਂ ਪਾਉਂਦਾ।</translation>
 <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> ਵਿੱਚ ਮੇਰੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਸ਼ਾਮਲ ਕਰੋ</translation>
 <translation id="1810366086647840386">ਇਮੇਜ ਸਰਵਰ</translation>
+<translation id="1811908311154949291">ਇਨਕੋਗਨਿਟੋ ਫੈਂਸਡ ਫ੍ਰੇਮ: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">ਸੇਵਾਵਾਂ</translation>
 <translation id="18139523105317219">EDI ਪਾਰਟੀ ਨਾਮ</translation>
 <translation id="1815083418640426271">ਸਰਲ ਲਿਖਤ ਵਜੋਂ ਪੇਸਟ ਕਰੋ</translation>
@@ -1687,6 +1689,7 @@
 <translation id="2553340429761841190"><ph name="PRODUCT_NAME" />, <ph name="NETWORK_ID" /> ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੂਜਾ ਨੈੱਟਵਰਕ ਚੁਣੋ ਜਾਂ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="2553440850688409052">ਇਹ ਪਲੱਗਇਨ ਲੁਕਾਓ</translation>
 <translation id="2554553592469060349">ਚੁਣੀ ਗਈ ਫਾਈਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡੀ ਹੈ (ਅਧਿਕਤਮ ਆਕਾਰ: 3mb).</translation>
+<translation id="25568951186001797">ਫੈਂਸਡ ਫ੍ਰੇਮ: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਤੁਹਾਨੂੰ ਦਿਸਣ ਵਾਲੇ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦਾ ਹੈ</translation>
 <translation id="2558896001721082624">ਸਿਸਟਮ ਮੀਨੂ ਵਿੱਚ ਹਮੇਸ਼ਾਂ ਪਹੁੰਚਯੋਗਤਾ ਵਿਕਲਪ ਦਿਖਾਓ</translation>
 <translation id="2559889124253841528">ਡੀਵਾਈਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ</translation>
@@ -2248,6 +2251,7 @@
 <translation id="3101126716313987672">ਮੱਧਮ ਲਾਈਟ</translation>
 <translation id="3101709781009526431">ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ</translation>
 <translation id="3103451787721578293">ਕਿਰਪਾ ਕਰਕੇ ਇਸ ਡਾਟੇ ਨੂੰ ਅੱਪਲੋਡ ਕਰਨ ਦਾ ਕਾਰਨ ਦਾਖਲ ਕਰੋ:</translation>
+<translation id="3105339775057145050">ਪਿਛਲਾ ਅਸਫਲ ਅੱਪਡੇਟ</translation>
 <translation id="3105796011181310544">ਕੀ Google 'ਤੇ ਵਾਪਸ ਜਾਣਾ ਹੈ?</translation>
 <translation id="310671807099593501">ਸਾਈਟ ਬਲੂਟੁੱਥ ਵਰਤ ਰਹੀ ਹੈ</translation>
 <translation id="3108931485517391283">ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation>
@@ -2550,6 +2554,7 @@
 <translation id="3433621910545056227">ਓਹੋ! ਸਿਸਟਮ ਡੀਵਾਈਸ ਸਥਾਪਨਾ-ਸਮਾਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਾਕ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ।</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। families.google.com 'ਤੇ ਇਹਨਾਂ ਸੈਟਿੰਗਾਂ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਹੋਰ ਜਾਣੋ।</translation>
+<translation id="3434475275396485144">ਇਸ ਸੈਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation>
 <translation id="3434512374684753970">ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ਵੱਲੋਂ ਤੁਹਾਡੇ <ph name="CODE_TYPE" /> ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation>
 <translation id="3435738964857648380">ਸੁਰੱਖਿਆ</translation>
@@ -6388,6 +6393,7 @@
 <translation id="7264695323040866038">ਕੀ ਹਮੇਸ਼ਾਂ ਸਮਰਥਿਤ ਵੈੱਬ ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ <ph name="APP" /> ਐਪ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?</translation>
 <translation id="7267044199012331848">ਆਭਾਸੀ ਮਸ਼ੀਨ ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਗੜਬੜ ਕੋਡ: <ph name="ERROR_CODE" />।</translation>
 <translation id="7267875682732693301">ਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੇ ਵੱਖ-ਵੱਖ ਭਾਗਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਆਪਣੀ ਉਂਗਲ ਨੂੰ ਰੱਖਣਾ-ਚੁੱਕਣਾ ਜਾਰੀ ਰੱਖੋ</translation>
+<translation id="7267898843336437186">ਕੋਈ ਅਜਿਹਾ ਫੋਲਡਰ ਚੁਣੋ ਜੋ ਇਹ ਸਾਈਟ ਦੇਖ ਸਕੇ</translation>
 <translation id="7268127947535186412">ਇਸ ਸੈਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧਨ ਡੀਵਾਈਸ ਦਾ ਮਾਲਕ ਕਰਦਾ ਹੈ।</translation>
 <translation id="7269736181983384521">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਡਾਟਾ ਵਰਤੋਂ</translation>
 <translation id="7272674038937250585">ਕੋਈ ਵਰਣਨ ਮੁਹੱਈਆ ਨਹੀਂ ਕੀਤਾ ਗਿਆ</translation>
@@ -7987,6 +7993,7 @@
 <translation id="8838770651474809439">ਹੈਮਬਰਗਰ</translation>
 <translation id="8838778928843281408">ਫ਼ੋਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
 <translation id="8841843049738266382">ਪ੍ਰਵਾਨਗੀ ਲਈ ਸੂਚੀਬੱਧ ਵਰਤੋਂਕਾਰਾਂ ਬਾਰੇ ਪੜ੍ਹੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਬਦਲੋ</translation>
+<translation id="8842059467121215385">"<ph name="EXTENSION_NAME" />" ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਪੰਨੇ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation>
 <translation id="8842594465773264717">ਇਸ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨੂੰ ਮਿਟਾਓ</translation>
 <translation id="8845001906332463065">ਮਦਦ ਪ੍ਰਾਪਤ ਕਰੋ</translation>
 <translation id="8846132060409673887">ਇਸ ਕੰਪਿਊਟਰ ਦੇ ਨਿਰਮਾਤਾ ਅਤੇ ਮਾਡਲ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਪੜ੍ਹੋ</translation>
@@ -8142,6 +8149,7 @@
 <translation id="899657321862108550">ਤੁਹਾਡਾ Chrome, ਹਰ ਥਾਂ 'ਤੇ</translation>
 <translation id="899676909165543803">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਤੁਹਾਡੇ ਕੀ-ਬੋਰਡ ਦੀ ਹੇਠਲੀ ਸੱਜੇ ਪਾਸੇ ਦੀ ਕੁੰਜੀ ਹੈ। ਇਸਨੂੰ ਕਿਸੇ ਵੀ ਉਂਗਲ ਨਾਲ ਹਲਕਾ ਜਿਹਾ ਸਪਰਸ਼ ਕਰੋ।</translation>
 <translation id="8999560016882908256">ਸੈਕਸ਼ਨ ਦੇ ਸਿਨਟੈਕਸ ਵਿੱਚ ਗੜਬੜ: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627"><ph name="FAILURE_TIME" /> ਵਜੇ '<ph name="STATUS_TEXT" />' ਸਥਿਤੀ ਕਰਕੇ ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਨ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation>
 <translation id="9003647077635673607">ਸਾਰੀਆਂ ਵੈਬਸਾਈਟਾਂ ਤੇ ਆਗਿਆ ਦਿਓ</translation>
 <translation id="9003677638446136377">ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ</translation>
 <translation id="9004754973617721124">ਕੀ <ph name="SITE_NAME" />, ਇਸਦੇ ਅਧੀਨ ਆਉਂਦੀਆਂ ਸਾਰੀਆਂ ਸਾਈਟਾਂ, ਅਤੇ ਇਸਦੀ ਸਥਾਪਤ ਕੀਤੀ ਐਪ ਲਈ ਸਾਈਟ ਡਾਟਾ ਅਤੇ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 1b40e458..56a6b002 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -6886,7 +6886,7 @@
 <translation id="7764857504908700767">Quando as avaliações estão ativadas, a redução de spam e fraudes depende de símbolos fidedignos para ajudar os sites a combater fraudes e distinguir bots de pessoas.</translation>
 <translation id="7765158879357617694">Mover</translation>
 <translation id="7765507180157272835">É necessário Bluetooth e Wi-Fi</translation>
-<translation id="7766082757934713382">Ajuda a reduzir a utilização de dados de rede ao colocar em pausa as atualizações automáticas do sistema e de apps.</translation>
+<translation id="7766082757934713382">Ajuda a reduzir a utilização de dados de rede ao pausar as atualizações automáticas do sistema e de apps.</translation>
 <translation id="7766807826975222231">Faça uma visita guiada</translation>
 <translation id="7766838926148951335">Aceitar autorizações</translation>
 <translation id="7767554953520855281">Os detalhes estão ocultos durante a partilha do ecrã</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 7e703f4..eee35699 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -3967,6 +3967,7 @@
 <translation id="4842976633412754305">Pagina încearcă să încarce scripturi din surse neautentificate.</translation>
 <translation id="4844333629810439236">Alte tastaturi</translation>
 <translation id="4844633725025837809">Pentru siguranță suplimentară, criptează parolele pe dispozitiv înainte să se salveze în Managerul de parole Google</translation>
+<translation id="4846628405149428620">Selectează unde poate salva modificările acest site</translation>
 <translation id="4846680374085650406">Urmați recomandarea administratorului pentru această setare.</translation>
 <translation id="4847902821209177679">S-a selectat <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />, apasă pe Enter pentru a selecta albumele <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">„Ok Google” pentru Asistentul Google</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 94fd5de..e26eaba 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3967,6 +3967,7 @@
 <translation id="4842976633412754305">Страница пытается загрузить скрипты из непроверенных источников.</translation>
 <translation id="4844333629810439236">Другие раскладки</translation>
 <translation id="4844633725025837809">В целях повышения безопасности шифруйте пароли на устройстве, прежде чем они будут сохраняться в Диспетчере паролей Google.</translation>
+<translation id="4846628405149428620">Укажите, где этот сайт может сохранять изменения</translation>
 <translation id="4846680374085650406">Параметр настроен в соответствии с рекомендациями администратора.</translation>
 <translation id="4847902821209177679">Выбран вариант "<ph name="TOPIC_SOURCE" />" (<ph name="TOPIC_SOURCE_DESC" />). Нажмите Ввод, чтобы выбрать альбомы отсюда: <ph name="TOPIC_SOURCE" />.</translation>
 <translation id="4848191975108266266">Фраза "Окей, Google" для Google Ассистента</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 55c7a0f..b371cdb1 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">Otvoriť pôvodný &amp;obrázok na novej karte</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{Aktualizujte zariadenie <ph name="DEVICE_TYPE" /> do 1 týždňa}few{Aktualizujte zariadenie <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňov}many{Aktualizujte zariadenie <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňa}other{Aktualizujte zariadenie <ph name="DEVICE_TYPE" /> do {NUM_WEEKS} týždňov}}</translation>
 <translation id="1056898198331236512">Upozornenie</translation>
+<translation id="105822690353767994">Ak nechcete, aby sa vám táto správa zobrazovala, povoľte, aby sa dané rozšírenie na tomto webe spúšťalo vždy.</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{Zadajte nový PIN. PIN musí mať aspoň jeden znak a môže obsahovať písmená, čísla a ďalšie znaky.}few{Zadajte nový PIN. PIN musí mať aspoň # znaky a môže obsahovať písmená, čísla a ďalšie znaky.}many{Zadajte nový PIN. A PIN must be at least # characters long and can contain letters, numbers, and other characters.}other{Zadajte nový PIN. PIN musí mať aspoň # znakov a môže obsahovať písmená, čísla a ďalšie znaky.}}</translation>
 <translation id="1059484610606223931">Protokol HTTPS (Hypertext Transport Protocol)</translation>
@@ -858,6 +859,7 @@
     Neovplyvní to aplikácie ani obsah v ďalších zariadeniach.</translation>
 <translation id="1809734401532861917">Pridať záložky, históriu, heslá a ďalšie nastavenia do účtu <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1810366086647840386">Server obrazu</translation>
+<translation id="1811908311154949291">Ohraničený rám inkognito: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">Služby</translation>
 <translation id="18139523105317219">Názov strany EDI</translation>
 <translation id="1815083418640426271">Prilepiť ako čistý text</translation>
@@ -1673,6 +1675,7 @@
 <translation id="2553340429761841190">Systém <ph name="PRODUCT_NAME" /> sa nemohol pripojiť k sieti <ph name="NETWORK_ID" />. Vyberte inú sieť alebo to skúste znova.</translation>
 <translation id="2553440850688409052">Skryť tento doplnok</translation>
 <translation id="2554553592469060349">Vybratý súbor je príliš veľký (maximálna veľkosť: 3 MB).</translation>
+<translation id="25568951186001797">Ohraničený rám: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">Vaša história prehliadania ovplyvňuje zobrazované reklamy</translation>
 <translation id="2558896001721082624">Zobrazovať možnosti dostupnosti v ponuke systému</translation>
 <translation id="2559889124253841528">Uložiť do zariadenia</translation>
@@ -2235,6 +2238,7 @@
 <translation id="3101126716313987672">Stlmiť osvetlenie</translation>
 <translation id="3101709781009526431">Dátum a čas</translation>
 <translation id="3103451787721578293">Zadajte dôvod nahrávania týchto údajov:</translation>
+<translation id="3105339775057145050">Posledná neúspešná aktualizácia</translation>
 <translation id="3105796011181310544">Chcete prepnúť späť na Google?</translation>
 <translation id="310671807099593501">Web používa Bluetooth</translation>
 <translation id="3108931485517391283">Nedá sa prijať</translation>
@@ -2537,6 +2541,7 @@
 <translation id="3433621910545056227">Ojoj! Systému sa nepodarilo nastaviť zámku pre inštaláciu atribútov v zariadení.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" /> %</translation>
 <translation id="3434272557872943250">Ak pre dieťa zapnete nastavenie ďalšej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. Viac o týchto nastaveniach a o tom, ako ich upraviť, sa dozviete na families.google.com.</translation>
+<translation id="3434475275396485144">Toto nastavenie ovláda správca vášho telefónu</translation>
 <translation id="3434512374684753970">Zvuk a video</translation>
 <translation id="3435688026795609344">Rozšírenie <ph name="EXTENSION_NAME" /> požaduje <ph name="CODE_TYPE" /></translation>
 <translation id="3435738964857648380">Bezpečnosť</translation>
@@ -6375,6 +6380,7 @@
 <translation id="7264695323040866038">Chcete otvárať podporované odkazy na weby pomocou aplikácie <ph name="APP" />?</translation>
 <translation id="7267044199012331848">Virtuálny počítač sa nepodarilo nainštalovať. Skúste to znova alebo kontaktujte správcu. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">Zdvíhajte prst, aby ste pridali všetky odlišné časti odtlačku</translation>
+<translation id="7267898843336437186">Vyberte priečinok, ktorý si bude môcť tento web zobraziť</translation>
 <translation id="7268127947535186412">Toto nastavenie spravuje vlastník zariadenia.</translation>
 <translation id="7269736181983384521">Spotreba dát pri Zdieľaní nablízku</translation>
 <translation id="7272674038937250585">Popis nie je k dispozícii</translation>
@@ -7976,6 +7982,7 @@
 <translation id="8838770651474809439">Hamburger</translation>
 <translation id="8838778928843281408">Spravovať telefóny</translation>
 <translation id="8841843049738266382">Čítať a meniť používateľov na zozname povolených</translation>
+<translation id="8842059467121215385">Ak chcete používať rozšírenie <ph name="EXTENSION_NAME" />, obnovte stránku</translation>
 <translation id="8842594465773264717">Odstrániť tento odtlačok prsta</translation>
 <translation id="8845001906332463065">Získať pomoc</translation>
 <translation id="8846132060409673887">Prečítať informácie o výrobcovi a modeli tohto zariadenia</translation>
@@ -8131,6 +8138,7 @@
 <translation id="899657321862108550">Váš Chrome, všade</translation>
 <translation id="899676909165543803">Senzor odtlačkov prstov je pravý dolný kláves na klávesnici. Zľahka sa ho dotknite ľubovoľným prstom.</translation>
 <translation id="8999560016882908256">Chyba syntaxe sekcie: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">Nepodarilo sa pripojiť k serveru na správu zariadení. Stav o <ph name="FAILURE_TIME" />: <ph name="STATUS_TEXT" />.</translation>
 <translation id="9003647077635673607">Povoliť na všetkých webových stránkach</translation>
 <translation id="9003677638446136377">Skontrolovať znova</translation>
 <translation id="9004754973617721124">Chcete vymazať dáta a povolenia webu <ph name="SITE_NAME" />, všetky jeho podriadené weby a jeho nainštalovanú aplikáciu?</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index a762eed..ba40b97 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3985,6 +3985,7 @@
 <translation id="4842976633412754305">Ta stran poskuša naložiti skripte iz virov, ki nimajo preverjene pristnosti.</translation>
 <translation id="4844333629810439236">Druge tipkovnice</translation>
 <translation id="4844633725025837809">Zaradi dodatne varnosti šifrirajte gesla v napravi, preden se shranijo v Google Upravitelju gesel.</translation>
+<translation id="4846628405149428620">Izberite, kje lahko to spletno mesto shranjuje spremembe</translation>
 <translation id="4846680374085650406">Upoštevate priporočila skrbnika za to nastavitev.</translation>
 <translation id="4847902821209177679">Izbrali ste <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />, pritisnite Enter, da izberete albume <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Pomočnik Google – »Ok Google«</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index f1be55c..2df457bb 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -3963,6 +3963,7 @@
 <translation id="4842976633412754305">Kjo faqe po përpiqet të ngarkojë skripte nga burime të paverifikuara.</translation>
 <translation id="4844333629810439236">Tastiera të tjera</translation>
 <translation id="4844633725025837809">Për siguri shtesë, enkripto fjalëkalimet në pajisjen tënde para se të ruhen në "Menaxherin e fjalëkalimeve" të Google</translation>
+<translation id="4846628405149428620">Zgjidh se ku mund t'i ruajë ndryshimet ky sajt</translation>
 <translation id="4846680374085650406">Po ndjek rekomandimin e administratorit për këtë cilësim.</translation>
 <translation id="4847902821209177679">Është zgjedhur "<ph name="TOPIC_SOURCE_DESC" />" nga "<ph name="TOPIC_SOURCE" />". Shtyp "Enter" për të zgjedhur albumet e "<ph name="TOPIC_SOURCE" />"</translation>
 <translation id="4848191975108266266">"Ok Google" e "Asistentit të Google"</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index b2a3fa4..b54ac94d 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -3982,6 +3982,7 @@
 <translation id="4842976633412754305">Sidan försöker att läsa in skript från overifierade källor.</translation>
 <translation id="4844333629810439236">Övriga tangentbord</translation>
 <translation id="4844633725025837809">Öka säkerheten genom att kryptera lösenord på enheten innan de sparas i Google Lösenordshantering.</translation>
+<translation id="4846628405149428620">Välj var den här webbplatsen får spara ändringar</translation>
 <translation id="4846680374085650406">Du följer administratörens rekommendation för den här inställningen.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> har markerats. Välj album i <ph name="TOPIC_SOURCE" /> genom att trycka på Retur</translation>
 <translation id="4848191975108266266">Google Assistent ”Ok Google”</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 873b152..bac4726 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3977,6 +3977,7 @@
 <translation id="4842976633412754305">Ukurasa huu unajaribu kupakia hati kutoka kwenye vyanzo visivyothibitishwa.</translation>
 <translation id="4844333629810439236">Kibodi zingine</translation>
 <translation id="4844633725025837809">Ili kuimarisha usalama, simba manenosiri kwa njia fiche kwenye kifaa chako kabla hayajahifadhiwa kwenye Kidhibiti cha Manenosiri cha Google</translation>
+<translation id="4846628405149428620">Chagua mahali ambapo tovuti hii inaweza kuhifadhi mabadiliko</translation>
 <translation id="4846680374085650406">Unafuata pendekezo la msimamizi kwa mpangilio huu.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> imechaguliwa, bonyeza 'Enter' ili uchague albamu za <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Programu ya Mratibu wa Google "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 20ae3f1..111cd96 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">అసలు &amp;చిత్రాన్ని కొత్త ట్యాబ్‌లో తెరువు</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{1 వారంలోపు <ph name="DEVICE_TYPE" />ని అప్‌డేట్ చేయండి}other{{NUM_WEEKS} వారాలలోపు <ph name="DEVICE_TYPE" />ని అప్‌డేట్ చేయండి}}</translation>
 <translation id="1056898198331236512">హెచ్చరిక</translation>
+<translation id="105822690353767994">ఈ మెసేజ్‌ను మీరు మళ్లీ చూడకూడదు అనుకుంటే, ఈ సైట్‌లో రన్ అయ్యేలా ఎక్స్‌టెన్షన్‌ను ఎల్లవేళలా అనుమతించండి.</translation>
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{మీ కొత్త PINను ఎంటర్ చేయండి. PIN తప్పక కనీసం ఒక క్యారెక్టర్ పొడవు ఉండాలి, అలాగే ఇందులో అక్షరాలు, నంబర్‌లు, ఇతర క్యారెక్టర్‌లను ఉపయోగించవచ్చు.}other{మీ కొత్త PINను ఎంటర్ చేయండి. PIN తప్పక కనీసం # క్యారెక్టర్‌ల పొడవు ఉండాలి, అలాగే ఇందులో అక్షరాలు, నంబర్‌లు, ఇతర క్యారెక్టర్‌లను ఉపయోగించవచ్చు.}}</translation>
 <translation id="1059484610606223931">హైపర్ టెక్స్ట్ ట్రాన్స్‌పోర్ట్ ప్రోటోకాల్ (HTTPS)</translation>
@@ -866,6 +867,7 @@
       ఇది ఇతర పరికరాల్లో యాప్‌లు లేదా కంటెంట్‌ను ప్రభావితం చేయదు.</translation>
 <translation id="1809734401532861917">నా బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లను <ph name="USER_EMAIL_ADDRESS" />కి జోడించు</translation>
 <translation id="1810366086647840386">ఇమేజ్ సర్వర్</translation>
+<translation id="1811908311154949291">అజ్ఞాత ఫెన్స్‌డ్ ఫ్రేమ్: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">సేవలు</translation>
 <translation id="18139523105317219">EDI వేడుక పేరు</translation>
 <translation id="1815083418640426271">సాదా వచనం లాగా అతికించు</translation>
@@ -1685,6 +1687,7 @@
 <translation id="2553340429761841190"><ph name="NETWORK_ID" />కు కనెక్ట్ చేయడానికి <ph name="PRODUCT_NAME" />కి సాధ్యం కాలేదు. దయచేసి మరొక నెట్‌వర్క్‌ని ఎంచుకోండి లేదా మళ్ళీ ప్రయత్నిచండి.</translation>
 <translation id="2553440850688409052">ఈ ప్లగ్ఇన్‌ను దాచిపెట్టు</translation>
 <translation id="2554553592469060349">ఎంచుకోబడిన ఫైల్ చాలా పెద్దదిగా ఉంది (గరిష్ట పరిమాణం: 3mb).</translation>
+<translation id="25568951186001797">ఫెన్స్‌డ్ ఫ్రేమ్: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">మీ బ్రౌజింగ్ హిస్టరీ, మీరు చూసే యాడ్‌లను ప్రభావితం చేస్తుంది</translation>
 <translation id="2558896001721082624">సిస్టమ్ మెనూలో ఎల్లప్పుడూ యాక్సెస్ సామర్థ్య ఎంపికలను చూపు</translation>
 <translation id="2559889124253841528">పరికరంలో సేవ్ చేయండి</translation>
@@ -2247,6 +2250,7 @@
 <translation id="3101126716313987672">డిమ్ లైట్</translation>
 <translation id="3101709781009526431">తేదీ మరియు సమయం</translation>
 <translation id="3103451787721578293">ఈ డేటాను అప్‌లోడ్ చేయడానికి దయచేసి కారణాన్ని ఎంటర్ చేయండి:</translation>
+<translation id="3105339775057145050">చివరి అప్‌డేట్ విజయవంతం కాలేదు</translation>
 <translation id="3105796011181310544">తిరిగి Googleకు మార్చాలా?</translation>
 <translation id="310671807099593501">సైట్ బ్లూటూత్‌ను ఉపయోగిస్తోంది</translation>
 <translation id="3108931485517391283">స్వీకరించడం సాధ్యం కాలేదు</translation>
@@ -2549,6 +2553,7 @@
 <translation id="3433621910545056227">అయ్యో!  పరికరం ఇన్‌స్టాలేషన్-సమయ లక్షణాల లాక్‌ను ఏర్పాటు చేయడంలో సిస్టమ్ విఫలమైంది.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ యాక్టివిటీ సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు. ఈ సెట్టింగ్‌ల గురించి, వాటిని ఎలా సర్దుబాటు చేయాలనే దాని గురించి families.google.comలో మరింత తెలుసుకోండి.</translation>
+<translation id="3434475275396485144">ఈ సెట్టింగ్‌ను మీ ఫోన్ అడ్మినిస్ట్రేటర్ మేనేజ్ చేస్తుంది</translation>
 <translation id="3434512374684753970">ఆడియో &amp; వీడియో</translation>
 <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" మీ <ph name="CODE_TYPE" />ని అభ్యర్థిస్తోంది</translation>
 <translation id="3435738964857648380">భద్రత</translation>
@@ -6384,6 +6389,7 @@
 <translation id="7264695323040866038">సపోర్ట్ చేసే వెబ్ లింక్‌లను తెరవడానికి ఎల్లప్పుడూ <ph name="APP" /> యాప్‌ను ఉపయోగించాలా?</translation>
 <translation id="7267044199012331848">వర్చువల్ మెషిన్‌ను ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి లేదా మీ నిర్వాహకుడిని సంప్రదించండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">మీ వేలిముద్ర కోసం వివిధ భాగాలను జోడించడానికి మీ వేలిని పైకి ఎత్తుతూ ఉండండి</translation>
+<translation id="7267898843336437186">ఈ సైట్‌కు చూసే అనుమతి ఉండేలా ఫోల్డర్‌ను ఎంచుకోండి</translation>
 <translation id="7268127947535186412">ఈ సెట్టింగ్‌ను పరికరం యజమాని నిర్వహిస్తున్నారు.</translation>
 <translation id="7269736181983384521">సమీప షేరింగ్ డేటా వినియోగం</translation>
 <translation id="7272674038937250585">వివరణ ఏదీ అందించబడలేదు</translation>
@@ -7980,6 +7986,7 @@
 <translation id="8838770651474809439">హాంబర్గర్</translation>
 <translation id="8838778928843281408">ఫోన్ నంబర్‌లను మేనేజ్ చేయండి</translation>
 <translation id="8841843049738266382">వైట్‌లిస్ట్ చేయబడిన యూజర్‌లను చదవండి, మార్చండి</translation>
+<translation id="8842059467121215385">"<ph name="EXTENSION_NAME" />"‌ను ఉపయోగించడానికి పేజీని రిఫ్రెష్ చేయండి</translation>
 <translation id="8842594465773264717">ఈ వేలిముద్రను తొలగించు</translation>
 <translation id="8845001906332463065">సహాయం పొందండి</translation>
 <translation id="8846132060409673887">ఈ కంప్యూటర్ తయారీదారు పేరు మరియు మోడల్‌కి సంబంధించిన సమాచారాన్ని చదవగలుగుతుంది</translation>
@@ -8135,6 +8142,7 @@
 <translation id="899657321862108550">మీ Chrome, అన్ని పరికరాలలో పొందవచ్చు</translation>
 <translation id="899676909165543803">మీ కీబోర్డ్‌లో దిగువున కుడివైపు కీ కింది భాగంలో వేలిముద్ర సెన్సార్ ఉంది. ఏదైనా వేలితో దానిపై మెల్లగా తాకండి.</translation>
 <translation id="8999560016882908256">ఒక విభాగంలో సింటాక్స్ ఎర్రర్: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">డివైజ్ మేనేజర్ సర్వర్‌కు కనెక్షన్ <ph name="FAILURE_TIME" />కు '<ph name="STATUS_TEXT" />' స్టేటస్‌తో విఫలమైంది</translation>
 <translation id="9003647077635673607">అన్ని వెబ్‌సైట్‌ల్లో అనుమతించు</translation>
 <translation id="9003677638446136377">మళ్లీ తనిఖీ చేయి</translation>
 <translation id="9004754973617721124"><ph name="SITE_NAME" />, దానికి సంబంధించిన అన్ని సైట్‌లు, ఇంకా ఇన్‌స్టాల్ చేయబడిన యాప్‌లో సైట్ డేటాను, ఇంకా అనుమతులను క్లియర్ చేయాలనుకుంటున్నారా?</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 7375011..05df0d69 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -3963,6 +3963,7 @@
 <translation id="4842976633412754305">Bu sayfa kimliği doğrulanmamış kaynaklardan komut dosyaları yüklemeye çalışıyor.</translation>
 <translation id="4844333629810439236">Diğer klavyeler</translation>
 <translation id="4844633725025837809">Ek güvenlik için, Google Şifre Yöneticisi'ne kaydedilmeden önce şifrelerinizi cihazınızda şifreleyin</translation>
+<translation id="4846628405149428620">Bu sitenin, değişiklikleri nereye kaydedebileceğini seçin</translation>
 <translation id="4846680374085650406">Bu ayar için yöneticinin önerisini uyguluyorsunuz.</translation>
 <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> seçildi, <ph name="TOPIC_SOURCE" /> albümlerini seçmek için Enter tuşuna basın</translation>
 <translation id="4848191975108266266">Google Asistan "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 3cee9ce..70c273c 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -3967,6 +3967,7 @@
 <translation id="4842976633412754305">یہ صفحہ غیر توثیق کردہ ذرائع سے اسکرپٹس لوڈ کرنے کی کوشش کر رہا ہے۔</translation>
 <translation id="4844333629810439236">دوسرے کی بورڈز</translation>
 <translation id="4844633725025837809">‏اضافی حفاظت کے لیے، پاس ورڈز کو Google پاس ورڈ مینیجر میں محفوظ کرنے سے پہلے اپنے آلے پر مرموز کریں</translation>
+<translation id="4846628405149428620">منتخب کریں کہ یہ سائٹ تبدیلیاں کہاں محفوظ کر سکتی ہے</translation>
 <translation id="4846680374085650406">اس ترتیب کیلئے آپ منتظم کی تجویز کی پیروی کر رہے ہیں۔</translation>
 <translation id="4847902821209177679">‏<ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> منتخب کیا گیا، <ph name="TOPIC_SOURCE" /> البمز منتخب کرنے کے لیے Enter دبائیں</translation>
 <translation id="4848191975108266266">‏Google اسسٹنٹ "Ok Google"</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 9ad71523..58c30dc 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -3982,6 +3982,7 @@
 <translation id="4842976633412754305">Trang này đang cố gắng tải tập lệnh từ nguồn chưa được xác thực.</translation>
 <translation id="4844333629810439236">Các bàn phím khác</translation>
 <translation id="4844633725025837809">Để tăng mức độ an toàn, hãy mã hoá mật khẩu trên thiết bị trước khi lưu vào Trình quản lý mật khẩu của Google</translation>
+<translation id="4846628405149428620">Chọn phạm vi mà trang web này có thể lưu các thay đổi</translation>
 <translation id="4846680374085650406">Bạn đang theo khuyến cáo của quản trị viên về cài đặt này.</translation>
 <translation id="4847902821209177679">Đã chọn <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />, hãy nhấn phím Enter để chọn các album trên <ph name="TOPIC_SOURCE" /></translation>
 <translation id="4848191975108266266">Lệnh "Ok Google" của Trợ lý Google</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 50184cc..33c00d0 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -3965,6 +3965,7 @@
 <translation id="4842976633412754305">這個網頁正在嘗試載入來源未經驗證的指令碼。</translation>
 <translation id="4844333629810439236">其他鍵盤</translation>
 <translation id="4844633725025837809">為進一步加強安全性,系統會先在裝置上將密碼加密,再儲存至 Google 密碼管理員</translation>
+<translation id="4846628405149428620">選取這個網站儲存變更的位置</translation>
 <translation id="4846680374085650406">你目前所採用的是管理員的建議設定。</translation>
 <translation id="4847902821209177679">已選取「<ph name="TOPIC_SOURCE" /><ph name="TOPIC_SOURCE_DESC" />」,按下 Enter 鍵即可選取「<ph name="TOPIC_SOURCE" />」的相簿</translation>
 <translation id="4848191975108266266">Google 助理的「Ok Google」</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 7382267..dcdc698a 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -55,6 +55,7 @@
 <translation id="1054153489933238809">Vula &amp;isithombe sangempela kuthebhu entsha</translation>
 <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{Buyekeza i-<ph name="DEVICE_TYPE" /> phakathi neviki eli-1}one{Buyekeza i-<ph name="DEVICE_TYPE" /> phakathi namaviki angu-{NUM_WEEKS}}other{Buyekeza i-<ph name="DEVICE_TYPE" /> phakathi namaviki angu-{NUM_WEEKS}}}</translation>
 <translation id="1056898198331236512">Isexwayiso</translation>
+<translation id="105822690353767994">Njalo vumela isandiso ukuthi siqalise kule sayithi uma ungafuni ukubona futhi lo myalezo.</translation>
 <translation id="1058262162121953039">I-PUK</translation>
 <translation id="1059065096897445832">{MIN_PIN_LENGTH,plural, =1{Faka iphinikhodi yakho entsha Iphinikhodi kumele okungenani ibe yinde ngohlamvu olulodwa futhi ingaqukatha amaletha, izinombolo, nezinye izinhlamvu.}one{Faka iphinikhodi yakho entsha Iphinikhodi kumele okungenani ibe nezinhlamvu ezingu-# ngobude futhi ingaqukatha amaletha, izinombolo, nezinye izinhlamvu.}other{Faka iphinikhodi yakho entsha Iphinikhodi kumele okungenani ibe nezinhlamvu ezingu-# ngobude futhi ingaqukatha amaletha, izinombolo, nezinye izinhlamvu.}}</translation>
 <translation id="1059484610606223931">I-Hypertext Transport Protocol (HTTPS)</translation>
@@ -866,6 +867,7 @@
     Lokhu akuthinti izinhlelo zokusebenza noma okuqukethwe kwamanye amadivayisi.</translation>
 <translation id="1809734401532861917">Engeza amabhukhimakhi, umlando, amaphasiwedi, nezinye izilungiselelo ku-<ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1810366086647840386">Isithombe Seseva</translation>
+<translation id="1811908311154949291">Uhlaka Olubiyelwe lwe-Incognito: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="1813278315230285598">Amasevisi</translation>
 <translation id="18139523105317219">Igama lenhlangano ye-EDI</translation>
 <translation id="1815083418640426271">Namathisela njengombhalo ongenalutho</translation>
@@ -1687,6 +1689,7 @@
 <translation id="2553340429761841190">I-<ph name="PRODUCT_NAME" /> ayikwazanga ukuxhumeka ku-<ph name="NETWORK_ID" />. Sicela ukhethe enye inethiwekhi noma zama futhi.</translation>
 <translation id="2553440850688409052">Fihla le-plug-in</translation>
 <translation id="2554553592469060349">Ifayela elikhethiwe likhulu kakhulu (usayizi omkhulu: 3mb).</translation>
+<translation id="25568951186001797">Uhlaka Olubiyelwe: <ph name="FENCEDFRAME_SITE" /></translation>
 <translation id="2558569818338050235">Umlando wakho wokubhrawuza uthinta izikhangiso ozibonayo</translation>
 <translation id="2558896001721082624">Bonisa izinketho zokufinyelela kumenyu yesistimu</translation>
 <translation id="2559889124253841528">Londoloza kudivayisi</translation>
@@ -2249,6 +2252,7 @@
 <translation id="3101126716313987672">Fiphalisa ukukhanya</translation>
 <translation id="3101709781009526431">Idethi nesikhathi</translation>
 <translation id="3103451787721578293">Sicela ufake isizathu sokulayisha le datha:</translation>
+<translation id="3105339775057145050">Isibuyekezo Esingaphumelelanga Sokugcina</translation>
 <translation id="3105796011181310544">Ushintshela emuva ku-Google?</translation>
 <translation id="310671807099593501">Isayithi lisebenzisa i-bluetooth</translation>
 <translation id="3108931485517391283">Ayikwazi ukuthola</translation>
@@ -2551,6 +2555,7 @@
 <translation id="3433621910545056227">Eshu! Isistimu ihlulekile ukusungula ukukhiya kwesichasiso kwesikhathi sokufaka sedivayisi.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3434272557872943250">Uma isilungiselelo esingeziwe sewebhu nesohlelo lokusebenza sivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe ye-Google. Funda kabanzi ngalezi zilungiselelo nendlela yokuzilungisa kwethi families.google.com.</translation>
+<translation id="3434475275396485144">Le sethingi iphethwe ngumlawuli wefoni yakho</translation>
 <translation id="3434512374684753970">Umsindo Nevidiyo</translation>
 <translation id="3435688026795609344">I-"<ph name="EXTENSION_NAME" />" icela i-<ph name="CODE_TYPE" /> yakho</translation>
 <translation id="3435738964857648380">Ukuvikela</translation>
@@ -6390,6 +6395,7 @@
 <translation id="7264695323040866038">Hlala usebenzisa i-app ye-<ph name="APP" /> ukuvula amalinki wewebhu asekelwe?</translation>
 <translation id="7267044199012331848">Ayikwazanga ukufaka umshini ngokubuka Sicela uzame futhi, noma xhumana nomlawuli wakho. Ikhodi yephutha: <ph name="ERROR_CODE" />.</translation>
 <translation id="7267875682732693301">Qhubeka nokuphakamisa umunwe wakho ukuze ungeze izingxenye ezahlukahlukene zezigxiviso zeminwe zakho</translation>
+<translation id="7267898843336437186">Khetha ifolda le sayithi engayibuka</translation>
 <translation id="7268127947535186412">Lesi silungiselelo siphethwe umnikazi wedivayisi.</translation>
 <translation id="7269736181983384521">Ukusetshenziswa kwedatha Kokuthumela Eduze</translation>
 <translation id="7272674038937250585">Akukho ncazelo enikeziwe</translation>
@@ -7989,6 +7995,7 @@
 <translation id="8838770651474809439">I-hamburger</translation>
 <translation id="8838778928843281408">Phatha amafoni</translation>
 <translation id="8841843049738266382">Funda futhi ushintshe uhlu lwabasebenzisi abagunyaziwe</translation>
+<translation id="8842059467121215385">Vuselela ikhasi ukuze usebenzise i-"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="8842594465773264717">Susa lezi zigxivizo zeminwe</translation>
 <translation id="8845001906332463065">Thola usizo</translation>
 <translation id="8846132060409673887">Funda umkhiqizi nemodeli yale khompuyutha</translation>
@@ -8144,6 +8151,7 @@
 <translation id="899657321862108550">I-Chrome yakho, yonke indawo</translation>
 <translation id="899676909165543803">Inzwa yezigxivizo zeminwe ingukhiye osesandleni sokudla esingaphansi kukhibhodi yakho. Ithinte kancane nganoma imuphi umunwe.</translation>
 <translation id="8999560016882908256">Iphutha lesigaba sesinthekisi: <ph name="ERROR_LINE" /></translation>
+<translation id="9003185744423389627">Ukuxhuma Kwiseva Yokuphathwa Kwedivayisi kwehlulekile ngesimo esithi '<ph name="STATUS_TEXT" />' ngo-<ph name="FAILURE_TIME" /></translation>
 <translation id="9003647077635673607">Vumela kuwo wonke amawebhusayithi</translation>
 <translation id="9003677638446136377">Hlola futhi</translation>
 <translation id="9004754973617721124">Sula idatha yesayithi nezimvume ze-<ph name="SITE_NAME" />, wonke amasayithi angaphansi kwayo, ne-app yayo efakiwe?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index fa7f41ef..a5321e8 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -250,7 +250,7 @@
 <translation id="6418662306461808273">Lehendik dagoen Chrome-ko profilera aldatu nahi duzu?</translation>
 <translation id="6506909944137591434">Chrome-k kamera atzitzeko baimena behar du zure inguruaren 3D-ko mapa bat sortzeko</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
-<translation id="659498884637196217">Google-ren Pasahitz-kudeatzailea atalean (gailu honetan)</translation>
+<translation id="659498884637196217">Google-ren Pasahitz-kudeatzailea zerbitzuan (gailu honetan)</translation>
 <translation id="6632473616050862500"><ph name="BEGIN_LINK_CROS_OSS" />Kode irekiko software<ph name="END_LINK_CROS_OSS" /> gehigarriari esker da posible ChromeOS Flex.</translation>
 <translation id="6676384891291319759">Sartu Interneten</translation>
 <translation id="6679975945624592337">Utzi Google Chrome-ri atzeko planoan abiarazten</translation>
@@ -316,7 +316,7 @@
 <translation id="7930071585467473040">Pasahitzak kopiatzen saiatzen ari da Google Chrome.</translation>
 <translation id="7951272445806340501">Eguneratzea aplikatzeko, berrabiarazi egin behar da ChromeOS Flex.</translation>
 <translation id="7962410387636238736">Ordenagailuak ez du jasoko Google Chrome-ren beste eguneratzerik, jada ez baita bateragarria Windows XP eta Windows Vista-rekin</translation>
-<translation id="8005666035647241369">Google-ren Pasahitz-kudeatzailea atalean (gailu honetan)</translation>
+<translation id="8005666035647241369">Google-ren Pasahitz-kudeatzailea zerbitzuan (gailu honetan)</translation>
 <translation id="8008534537613507642">Berrinstalatu Chrome</translation>
 <translation id="8013993649590906847">Irudiren batek ez badu azalpen lagungarririk, halako bat lortzen ahaleginduko da Chrome. Azalpen horiek sortzeko, irudiak Google-ri bidaltzen zaizkio.</translation>
 <translation id="8064015586118426197">ChromeOS Flex</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b6f985a..ec95945 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4680,6 +4680,8 @@
       "apps/app_service/webapk/webapk_metrics.h",
       "apps/app_service/webapk/webapk_prefs.cc",
       "apps/app_service/webapk/webapk_prefs.h",
+      "apps/digital_goods/digital_goods_ash.cc",
+      "apps/digital_goods/digital_goods_ash.h",
       "apps/digital_goods/digital_goods_factory_impl.cc",
       "apps/digital_goods/digital_goods_factory_impl.h",
       "apps/digital_goods/digital_goods_impl.cc",
@@ -5235,6 +5237,8 @@
       "apps/app_service/browser_app_instance_forwarder.h",
       "apps/digital_goods/digital_goods_factory_stub.cc",
       "apps/digital_goods/digital_goods_factory_stub.h",
+      "apps/digital_goods/digital_goods_lacros.cc",
+      "apps/digital_goods/digital_goods_lacros.h",
       "chrome_browser_main_parts_lacros.cc",
       "chrome_browser_main_parts_lacros.h",
       "chromeos/app_mode/app_session.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c218ce61..ec10a086 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -575,6 +575,44 @@
      std::size(kForceDark_IncreaseTextContrast), nullptr}};
 #endif  // !BUILDFLAG(IS_CHROMEOS)
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+const FeatureEntry::FeatureParam kShelfSwipeOffset30[] = {
+    {"shelf_swipe_offset", "30"}};
+const FeatureEntry::FeatureParam kShelfSwipeOffset50[] = {
+    {"shelf_swipe_offset", "50"}};
+const FeatureEntry::FeatureParam kShelfSwipeOffset80[] = {
+    {"shelf_swipe_offset", "80"}};
+const FeatureEntry::FeatureParam kShelfSwipeOffset100[] = {
+    {"shelf_swipe_offset", "100"}};
+
+const FeatureEntry::FeatureVariation
+    kShelfPalmRejectionSwipeOffsetVariations[] = {
+        {"30px offset", kShelfSwipeOffset30, std::size(kShelfSwipeOffset30),
+         nullptr},
+        {"50px offset", kShelfSwipeOffset50, std::size(kShelfSwipeOffset50),
+         nullptr},
+        {"80px offset", kShelfSwipeOffset80, std::size(kShelfSwipeOffset80),
+         nullptr},
+        {"100px offset", kShelfSwipeOffset100, std::size(kShelfSwipeOffset100),
+         nullptr}};
+
+const FeatureEntry::FeatureParam kShelfTouchArea100[] = {
+    {"shelf_touch_area", "100"}};
+const FeatureEntry::FeatureParam kShelfTouchArea150[] = {
+    {"shelf_touch_area", "150"}};
+const FeatureEntry::FeatureParam kShelfTouchArea200[] = {
+    {"shelf_touch_area", "200"}};
+const FeatureEntry::FeatureParam kShelfTouchArea250[] = {
+    {"shelf_touch_area", "250"}};
+
+const FeatureEntry::FeatureVariation kShelfPalmRejectionTouchAreaVariations[] =
+    {{"100px area", kShelfTouchArea100, std::size(kShelfTouchArea100), nullptr},
+     {"150px area", kShelfTouchArea150, std::size(kShelfTouchArea150), nullptr},
+     {"200px area", kShelfTouchArea200, std::size(kShelfTouchArea200), nullptr},
+     {"250px area", kShelfTouchArea250, std::size(kShelfTouchArea250),
+      nullptr}};
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 const FeatureEntry::FeatureParam kMBIModeLegacy[] = {{"mode", "legacy"}};
 const FeatureEntry::FeatureParam kMBIModeEnabledPerRenderProcessHost[] = {
     {"mode", "per_render_process_host"}};
@@ -7084,6 +7122,19 @@
      flag_descriptions::kShelfGesturesWithVirtualKeyboardName,
      flag_descriptions::kShelfGesturesWithVirtualKeyboardDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kShelfGesturesWithVirtualKeyboard)},
+    {"shelf-palm-rejection-swipe-offset",
+     flag_descriptions::kShelfPalmRejectionSwipeOffsetName,
+     flag_descriptions::kShelfPalmRejectionSwipeOffsetDescription, kOsCrOS,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(
+         ash::features::kShelfPalmRejectionSwipeOffset,
+         kShelfPalmRejectionSwipeOffsetVariations,
+         "ShelfPalmRejectionSwipeOffset")},
+    {"shelf-palm-rejection-touch-area",
+     flag_descriptions::kShelfPalmRejectionTouchAreaName,
+     flag_descriptions::kShelfPalmRejectionTouchAreaDescription, kOsCrOS,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kShelfPalmRejectionTouchArea,
+                                    kShelfPalmRejectionTouchAreaVariations,
+                                    "ShelfPalmRejectionTouchArea")},
     {"force-show-continue-section",
      flag_descriptions::kForceShowContinueSectionName,
      flag_descriptions::kForceShowContinueSectionDescription, kOsCrOS,
diff --git a/chrome/browser/apps/digital_goods/digital_goods_ash.cc b/chrome/browser/apps/digital_goods/digital_goods_ash.cc
new file mode 100644
index 0000000..7163e427b
--- /dev/null
+++ b/chrome/browser/apps/digital_goods/digital_goods_ash.cc
@@ -0,0 +1,195 @@
+// Copyright 2022 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 "chrome/browser/apps/digital_goods/digital_goods_ash.h"
+
+#include <utility>
+
+#include "ash/components/arc/pay/arc_digital_goods_bridge.h"
+#include "chrome/browser/apps/digital_goods/util.h"
+#include "chrome/browser/ash/apps/apk_web_app_service.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "components/digital_goods/mojom/digital_goods.mojom.h"
+#include "components/payments/core/features.h"
+#include "components/payments/core/payments_experimental_features.h"
+#include "url/gurl.h"
+
+namespace apps {
+
+namespace {
+
+constexpr char kSupportedPaymentMethod[] = "https://play.google.com/billing";
+
+// Gets the package name of the Android app linked to this web app.
+absl::optional<std::string> GetTwaPackageName(const std::string& app_id) {
+  Profile* profile = ProfileManager::GetPrimaryUserProfile();
+  auto* apk_web_app_service = ash::ApkWebAppService::Get(profile);
+  if (!apk_web_app_service) {
+    return absl::nullopt;
+  }
+  return apk_web_app_service->GetPackageNameForWebApp(app_id);
+}
+
+arc::ArcDigitalGoodsBridge* GetArcDigitalGoodsBridge() {
+  Profile* profile = ProfileManager::GetPrimaryUserProfile();
+  return arc::ArcDigitalGoodsBridge::GetForBrowserContext(profile);
+}
+
+}  // namespace
+
+// DigitalGoodsAsh implementation.
+
+DigitalGoodsAsh::DigitalGoodsAsh() = default;
+DigitalGoodsAsh::~DigitalGoodsAsh() = default;
+
+mojo::PendingRemote<crosapi::mojom::DigitalGoods>
+DigitalGoodsAsh::BindRequest() {
+  mojo::PendingRemote<crosapi::mojom::DigitalGoods> pending_remote;
+  mojo::PendingReceiver<crosapi::mojom::DigitalGoods> pending_receiver =
+      pending_remote.InitWithNewPipeAndPassReceiver();
+  receiver_set_.Add(this, std::move(pending_receiver));
+  return pending_remote;
+}
+
+void DigitalGoodsAsh::GetDetails(const std::string& web_app_id,
+                                 const GURL& scope,
+                                 const std::vector<std::string>& item_ids,
+                                 GetDetailsCallback callback) {
+  auto* digital_goods_service = GetArcDigitalGoodsBridge();
+
+  if (!digital_goods_service) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*item_detail_list=*/{});
+    return;
+  }
+
+  absl::optional<std::string> package_name = GetTwaPackageName(web_app_id);
+  if (!package_name) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*item_detail_list=*/{});
+    return;
+  }
+
+  digital_goods_service->GetDetails(*package_name, scope.spec(), item_ids,
+                                    std::move(callback));
+}
+
+void DigitalGoodsAsh::ListPurchases(const std::string& web_app_id,
+                                    const GURL& scope,
+                                    ListPurchasesCallback callback) {
+  auto* digital_goods_service = GetArcDigitalGoodsBridge();
+
+  if (!digital_goods_service) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+
+  absl::optional<std::string> package_name = GetTwaPackageName(web_app_id);
+  if (!package_name) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+
+  digital_goods_service->ListPurchases(*package_name, scope.spec(),
+                                       std::move(callback));
+}
+
+void DigitalGoodsAsh::ListPurchaseHistory(
+    const std::string& web_app_id,
+    const GURL& scope,
+    ListPurchaseHistoryCallback callback) {
+  auto* digital_goods_service = GetArcDigitalGoodsBridge();
+
+  if (!digital_goods_service) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+
+  absl::optional<std::string> package_name = GetTwaPackageName(web_app_id);
+  if (!package_name) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+
+  digital_goods_service->ListPurchaseHistory(*package_name, scope.spec(),
+                                             std::move(callback));
+}
+
+void DigitalGoodsAsh::Consume(const std::string& web_app_id,
+                              const GURL& scope,
+                              const std::string& purchase_token,
+                              ConsumeCallback callback) {
+  auto* digital_goods_service = GetArcDigitalGoodsBridge();
+
+  if (!digital_goods_service) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable);
+    return;
+  }
+
+  absl::optional<std::string> package_name = GetTwaPackageName(web_app_id);
+  if (!package_name) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable);
+    return;
+  }
+
+  digital_goods_service->Consume(*package_name, scope.spec(), purchase_token,
+                                 std::move(callback));
+}
+
+// DigitalGoodsFactoryAsh implementation.
+
+DigitalGoodsFactoryAsh::DigitalGoodsFactoryAsh() = default;
+DigitalGoodsFactoryAsh::~DigitalGoodsFactoryAsh() = default;
+
+void DigitalGoodsFactoryAsh::BindReceiver(
+    mojo::PendingReceiver<crosapi::mojom::DigitalGoodsFactory> receiver) {
+  receiver_set_.Add(this, std::move(receiver));
+}
+
+void DigitalGoodsFactoryAsh::CreateDigitalGoods(
+    const std::string& payment_method,
+    const std::string& web_app_id,
+    CreateDigitalGoodsCallback callback) {
+  // Check feature flag.
+  if (!payments::PaymentsExperimentalFeatures::IsEnabled(
+          payments::features::kAppStoreBilling)) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
+        /*digital_goods=*/mojo::NullRemote());
+    return;
+  }
+
+  if (payment_method != kSupportedPaymentMethod) {
+    std::move(callback).Run(payments::mojom::CreateDigitalGoodsResponseCode::
+                                kUnsupportedPaymentMethod,
+                            /*digital_goods=*/mojo::NullRemote());
+    return;
+  }
+
+  if (!GetTwaPackageName(web_app_id)) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
+        /*digital_goods=*/mojo::NullRemote());
+    return;
+  }
+
+  std::move(callback).Run(payments::mojom::CreateDigitalGoodsResponseCode::kOk,
+                          /*digital_goods=*/digital_goods_.BindRequest());
+}
+
+}  // namespace apps
diff --git a/chrome/browser/apps/digital_goods/digital_goods_ash.h b/chrome/browser/apps/digital_goods/digital_goods_ash.h
new file mode 100644
index 0000000..696c221a
--- /dev/null
+++ b/chrome/browser/apps/digital_goods/digital_goods_ash.h
@@ -0,0 +1,67 @@
+// Copyright 2022 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 CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_ASH_H_
+#define CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_ASH_H_
+
+#include <string>
+
+#include "chromeos/crosapi/mojom/digital_goods.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+
+class GURL;
+
+namespace apps {
+
+// Created in ash-chrome. Receives Digital Goods API calls from lacros-chrome
+// and forwards them to ARC.
+class DigitalGoodsAsh : public crosapi::mojom::DigitalGoods {
+ public:
+  DigitalGoodsAsh();
+  ~DigitalGoodsAsh() override;
+
+  mojo::PendingRemote<crosapi::mojom::DigitalGoods> BindRequest();
+
+  // crosapi::mojom::DigitalGoods overrides.
+  void GetDetails(const std::string& web_app_id,
+                  const GURL& scope,
+                  const std::vector<std::string>& item_ids,
+                  GetDetailsCallback callback) override;
+  void ListPurchases(const std::string& web_app_id,
+                     const GURL& scope,
+                     ListPurchasesCallback callback) override;
+  void ListPurchaseHistory(const std::string& web_app_id,
+                           const GURL& scope,
+                           ListPurchaseHistoryCallback callback) override;
+  void Consume(const std::string& web_app_id,
+               const GURL& scope,
+               const std::string& purchase_token,
+               ConsumeCallback callback) override;
+
+ private:
+  mojo::ReceiverSet<crosapi::mojom::DigitalGoods> receiver_set_;
+};
+
+class DigitalGoodsFactoryAsh : public crosapi::mojom::DigitalGoodsFactory {
+ public:
+  DigitalGoodsFactoryAsh();
+  ~DigitalGoodsFactoryAsh() override;
+
+  void BindReceiver(
+      mojo::PendingReceiver<crosapi::mojom::DigitalGoodsFactory> receiver);
+
+  // crosapi::mojom::DigitalGoodsFactory overrides.
+  void CreateDigitalGoods(const std::string& payment_method,
+                          const std::string& web_app_id,
+                          CreateDigitalGoodsCallback callback) override;
+
+ private:
+  DigitalGoodsAsh digital_goods_;
+  mojo::ReceiverSet<crosapi::mojom::DigitalGoodsFactory> receiver_set_;
+};
+
+}  // namespace apps
+
+#endif  // CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_ASH_H_
diff --git a/chrome/browser/apps/digital_goods/digital_goods_factory_stub.h b/chrome/browser/apps/digital_goods/digital_goods_factory_stub.h
index 736f2817..cfca2487 100644
--- a/chrome/browser/apps/digital_goods/digital_goods_factory_stub.h
+++ b/chrome/browser/apps/digital_goods/digital_goods_factory_stub.h
@@ -17,7 +17,7 @@
 
 // A stub implementation that returns an error trying to create a digital goods
 // instance.
-// TODO(crbug.com/1203666): remove when Digital Goods is supported in Lacros.
+// TODO(crbug.com/1203666): Remove when Lacros is permanently enabled.
 class DigitalGoodsFactoryStub : public payments::mojom::DigitalGoodsFactory {
  public:
   DigitalGoodsFactoryStub();
diff --git a/chrome/browser/apps/digital_goods/digital_goods_impl.h b/chrome/browser/apps/digital_goods/digital_goods_impl.h
index 5ebbe1b..a9d2f15 100644
--- a/chrome/browser/apps/digital_goods/digital_goods_impl.h
+++ b/chrome/browser/apps/digital_goods/digital_goods_impl.h
@@ -16,6 +16,7 @@
 
 namespace apps {
 
+// TODO(crbug.com/1203666): Remove when Lacros is permanently enabled.
 class DigitalGoodsImpl : public content::DocumentUserData<DigitalGoodsImpl>,
                          public payments::mojom::DigitalGoods {
  public:
diff --git a/chrome/browser/apps/digital_goods/digital_goods_lacros.cc b/chrome/browser/apps/digital_goods/digital_goods_lacros.cc
new file mode 100644
index 0000000..2ac80842
--- /dev/null
+++ b/chrome/browser/apps/digital_goods/digital_goods_lacros.cc
@@ -0,0 +1,209 @@
+// Copyright 2022 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 "chrome/browser/apps/digital_goods/digital_goods_lacros.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "chromeos/lacros/lacros_service.h"
+#include "components/digital_goods/mojom/digital_goods.mojom.h"
+#include "content/public/browser/render_frame_host.h"
+#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
+
+namespace apps {
+
+namespace {
+
+absl::optional<std::pair<web_app::AppId, GURL>> GetWebAppIdAndScopeForDocument(
+    content::RenderFrameHost& render_frame_host) {
+  web_app::WebAppProvider* provider = web_app::WebAppProvider::GetForWebApps(
+      Profile::FromBrowserContext(render_frame_host.GetBrowserContext()));
+  if (!provider) {
+    return absl::nullopt;
+  }
+
+  const web_app::WebAppRegistrar& registrar = provider->registrar();
+  absl::optional<web_app::AppId> app_id = registrar.FindAppWithUrlInScope(
+      render_frame_host.GetMainFrame()->GetLastCommittedURL());
+  if (!app_id) {
+    return absl::nullopt;
+  }
+  return std::make_pair(*app_id, registrar.GetAppScope(*app_id));
+}
+
+}  // namespace
+
+// DigitalGoodsLacros implementation.
+
+DigitalGoodsLacros::~DigitalGoodsLacros() = default;
+
+mojo::PendingRemote<payments::mojom::DigitalGoods>
+DigitalGoodsLacros::BindRequest() {
+  mojo::PendingRemote<payments::mojom::DigitalGoods> pending_remote;
+  mojo::PendingReceiver<payments::mojom::DigitalGoods> pending_receiver =
+      pending_remote.InitWithNewPipeAndPassReceiver();
+  receiver_set_.Add(this, std::move(pending_receiver));
+  return pending_remote;
+}
+
+void DigitalGoodsLacros::GetDetails(const std::vector<std::string>& item_ids,
+                                    GetDetailsCallback callback) {
+  auto id_and_scope = GetWebAppIdAndScopeForDocument(render_frame_host());
+  if (!id_and_scope) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*item_detail_list=*/{});
+    return;
+  }
+  const auto& [app_id, scope] = *id_and_scope;
+  digital_goods_->GetDetails(app_id, scope, item_ids, std::move(callback));
+}
+
+void DigitalGoodsLacros::ListPurchases(ListPurchasesCallback callback) {
+  auto id_and_scope = GetWebAppIdAndScopeForDocument(render_frame_host());
+  if (!id_and_scope) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+  const auto& [app_id, scope] = *id_and_scope;
+  digital_goods_->ListPurchases(app_id, scope, std::move(callback));
+}
+
+void DigitalGoodsLacros::ListPurchaseHistory(
+    ListPurchaseHistoryCallback callback) {
+  auto id_and_scope = GetWebAppIdAndScopeForDocument(render_frame_host());
+  if (!id_and_scope) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable,
+        /*purchase_reference_list=*/{});
+    return;
+  }
+  const auto& [app_id, scope] = *id_and_scope;
+  digital_goods_->ListPurchaseHistory(app_id, scope, std::move(callback));
+}
+
+void DigitalGoodsLacros::Consume(const std::string& purchase_token,
+                                 ConsumeCallback callback) {
+  auto id_and_scope = GetWebAppIdAndScopeForDocument(render_frame_host());
+  if (!id_and_scope) {
+    std::move(callback).Run(
+        payments::mojom::BillingResponseCode::kClientAppUnavailable);
+    return;
+  }
+  const auto& [app_id, scope] = *id_and_scope;
+  digital_goods_->Consume(app_id, scope, purchase_token, std::move(callback));
+}
+
+DigitalGoodsLacros::DigitalGoodsLacros(
+    content::RenderFrameHost* render_frame_host,
+    mojo::PendingRemote<crosapi::mojom::DigitalGoods> remote)
+    : content::DocumentUserData<DigitalGoodsLacros>(render_frame_host),
+      digital_goods_(std::move(remote)) {}
+
+DOCUMENT_USER_DATA_KEY_IMPL(DigitalGoodsLacros);
+
+// DigitalGoodsFactoryLacros implementation.
+
+DigitalGoodsFactoryLacros::~DigitalGoodsFactoryLacros() = default;
+
+// static
+void DigitalGoodsFactoryLacros::Bind(
+    content::RenderFrameHost* render_frame_host,
+    mojo::PendingReceiver<payments::mojom::DigitalGoodsFactory> receiver) {
+  DigitalGoodsFactoryLacros::GetOrCreateForCurrentDocument(render_frame_host)
+      ->BindRequest(std::move(receiver));
+}
+
+void DigitalGoodsFactoryLacros::CreateDigitalGoods(
+    const std::string& payment_method,
+    CreateDigitalGoodsCallback callback) {
+  if (!render_frame_host().IsFeatureEnabled(
+          blink::mojom::PermissionsPolicyFeature::kPayment)) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
+        mojo::NullRemote());
+    return;
+  }
+
+  if (auto* digital_goods =
+          DigitalGoodsLacros::GetForCurrentDocument(&render_frame_host())) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kOk,
+        digital_goods->BindRequest());
+    return;
+  }
+
+  pending_callbacks_.push_back(std::move(callback));
+  if (pending_callbacks_.size() > 1) {
+    // A crosapi call is already in flight, just wait for it to return.
+    return;
+  }
+
+  auto id_and_scope = GetWebAppIdAndScopeForDocument(render_frame_host());
+  if (!id_and_scope) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
+        mojo::NullRemote());
+    return;
+  }
+  const auto& [app_id, scope] = *id_and_scope;
+
+  auto* lacros_service = chromeos::LacrosService::Get();
+  if (!(lacros_service &&
+        lacros_service->IsAvailable<crosapi::mojom::DigitalGoodsFactory>())) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kError,
+        mojo::NullRemote());
+    return;
+  }
+
+  lacros_service->GetRemote<crosapi::mojom::DigitalGoodsFactory>()
+      ->CreateDigitalGoods(
+          payment_method, app_id,
+          base::BindOnce(&DigitalGoodsFactoryLacros::OnCreateDigitalGoods,
+                         weak_ptr_factory_.GetWeakPtr()));
+}
+
+DigitalGoodsFactoryLacros::DigitalGoodsFactoryLacros(
+    content::RenderFrameHost* render_frame_host)
+    : content::DocumentUserData<DigitalGoodsFactoryLacros>(render_frame_host) {}
+
+void DigitalGoodsFactoryLacros::BindRequest(
+    mojo::PendingReceiver<payments::mojom::DigitalGoodsFactory> receiver) {
+  receiver_.Bind(std::move(receiver));
+}
+
+void DigitalGoodsFactoryLacros::OnCreateDigitalGoods(
+    payments::mojom::CreateDigitalGoodsResponseCode code,
+    mojo::PendingRemote<crosapi::mojom::DigitalGoods> remote) {
+  if (code != payments::mojom::CreateDigitalGoodsResponseCode::kOk) {
+    for (auto& callback : pending_callbacks_) {
+      std::move(callback).Run(code, mojo::NullRemote());
+    }
+    pending_callbacks_.clear();
+    return;
+  }
+  DigitalGoodsLacros::CreateForCurrentDocument(&render_frame_host(),
+                                               std::move(remote));
+  auto* digital_goods =
+      DigitalGoodsLacros::GetForCurrentDocument(&render_frame_host());
+  DCHECK(digital_goods);
+  for (auto& callback : pending_callbacks_) {
+    std::move(callback).Run(
+        payments::mojom::CreateDigitalGoodsResponseCode::kOk,
+        digital_goods->BindRequest());
+  }
+  pending_callbacks_.clear();
+}
+
+DOCUMENT_USER_DATA_KEY_IMPL(DigitalGoodsFactoryLacros);
+
+}  // namespace apps
diff --git a/chrome/browser/apps/digital_goods/digital_goods_lacros.h b/chrome/browser/apps/digital_goods/digital_goods_lacros.h
new file mode 100644
index 0000000..263e394
--- /dev/null
+++ b/chrome/browser/apps/digital_goods/digital_goods_lacros.h
@@ -0,0 +1,95 @@
+// Copyright 2022 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 CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_LACROS_H_
+#define CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_LACROS_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/weak_ptr.h"
+#include "chromeos/crosapi/mojom/digital_goods.mojom.h"
+#include "content/public/browser/document_user_data.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/public/mojom/digital_goods/digital_goods.mojom.h"
+
+namespace content {
+class RenderFrameHost;
+}
+
+namespace apps {
+
+// Created in lacros-chrome browser. Receives Digital Goods API calls from the
+// renderer and forwards them to ash-chrome.
+class DigitalGoodsLacros : public content::DocumentUserData<DigitalGoodsLacros>,
+                           public payments::mojom::DigitalGoods {
+ public:
+  ~DigitalGoodsLacros() override;
+
+  mojo::PendingRemote<payments::mojom::DigitalGoods> BindRequest();
+
+  // payments::mojom::DigitalGoods overrides:
+  void GetDetails(const std::vector<std::string>& item_ids,
+                  GetDetailsCallback callback) override;
+  void ListPurchases(ListPurchasesCallback callback) override;
+  void ListPurchaseHistory(ListPurchaseHistoryCallback callback) override;
+  void Consume(const std::string& purchase_token,
+               ConsumeCallback callback) override;
+
+ private:
+  DigitalGoodsLacros(content::RenderFrameHost* render_frame_host,
+                     mojo::PendingRemote<crosapi::mojom::DigitalGoods> remote);
+  friend class content::DocumentUserData<DigitalGoodsLacros>;
+  DOCUMENT_USER_DATA_KEY_DECL();
+
+  mojo::ReceiverSet<payments::mojom::DigitalGoods> receiver_set_;
+  mojo::Remote<crosapi::mojom::DigitalGoods> digital_goods_;
+};
+
+class DigitalGoodsFactoryLacros
+    : public content::DocumentUserData<DigitalGoodsFactoryLacros>,
+      public payments::mojom::DigitalGoodsFactory {
+ public:
+  ~DigitalGoodsFactoryLacros() override;
+
+  static void Bind(
+      content::RenderFrameHost* render_frame_host,
+      mojo::PendingReceiver<payments::mojom::DigitalGoodsFactory> receiver);
+
+  // payments::mojom::DigitalGoodsFactory overrides:
+  void CreateDigitalGoods(const std::string& payment_method,
+                          CreateDigitalGoodsCallback callback) override;
+
+ private:
+  explicit DigitalGoodsFactoryLacros(
+      content::RenderFrameHost* render_frame_host);
+  friend class content::DocumentUserData<DigitalGoodsFactoryLacros>;
+  DOCUMENT_USER_DATA_KEY_DECL();
+
+  void BindRequest(
+      mojo::PendingReceiver<payments::mojom::DigitalGoodsFactory> receiver);
+
+  void OnCreateDigitalGoods(
+      payments::mojom::CreateDigitalGoodsResponseCode code,
+      mojo::PendingRemote<crosapi::mojom::DigitalGoods> digital_goods);
+
+  // A list of callbacks waiting for a single crosapi call response.
+  // There may be multiple calls to CreateDigitalGoods from the renderer at the
+  // same time, which need to be bound to a single browser-side object. It could
+  // take time between user document data being checked for an existing Digital
+  // Goods object and being assigned one from a crosapi callback, resulting in
+  // multiple crosapi calls attempting to assign user document data multiple
+  // times.
+  std::vector<CreateDigitalGoodsCallback> pending_callbacks_;
+
+  mojo::Receiver<payments::mojom::DigitalGoodsFactory> receiver_{this};
+  base::WeakPtrFactory<DigitalGoodsFactoryLacros> weak_ptr_factory_{this};
+};
+
+}  // namespace apps
+
+#endif  // CHROME_BROWSER_APPS_DIGITAL_GOODS_DIGITAL_GOODS_LACROS_H_
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc
index d98e403..c25bd2d 100644
--- a/chrome/browser/ash/crosapi/browser_util.cc
+++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -231,7 +231,7 @@
 }
 
 static_assert(
-    crosapi::mojom::Crosapi::Version_ == 75,
+    crosapi::mojom::Crosapi::Version_ == 76,
     "if you add a new crosapi, please add it to kInterfaceVersionEntries");
 
 }  // namespace
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index 2547020..44c98f5 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/apps/app_service/publishers/web_apps_crosapi_factory.h"
 #include "chrome/browser/apps/app_service/subscriber_crosapi.h"
 #include "chrome/browser/apps/app_service/subscriber_crosapi_factory.h"
+#include "chrome/browser/apps/digital_goods/digital_goods_ash.h"
 #include "chrome/browser/ash/crosapi/arc_ash.h"
 #include "chrome/browser/ash/crosapi/authentication_ash.h"
 #include "chrome/browser/ash/crosapi/automation_ash.h"
@@ -155,6 +156,8 @@
       desk_template_ash_(std::make_unique<DeskTemplateAsh>()),
       device_attributes_ash_(std::make_unique<DeviceAttributesAsh>()),
       device_settings_ash_(std::make_unique<DeviceSettingsAsh>()),
+      digital_goods_factory_ash_(
+          std::make_unique<apps::DigitalGoodsFactoryAsh>()),
       dlp_ash_(std::make_unique<DlpAsh>()),
       download_controller_ash_(std::make_unique<DownloadControllerAsh>()),
       drive_integration_service_ash_(
@@ -554,6 +557,11 @@
   device_settings_ash_->BindReceiver(std::move(receiver));
 }
 
+void CrosapiAsh::BindDigitalGoodsFactory(
+    mojo::PendingReceiver<mojom::DigitalGoodsFactory> receiver) {
+  digital_goods_factory_ash_->BindReceiver(std::move(receiver));
+}
+
 void CrosapiAsh::BindDlp(mojo::PendingReceiver<mojom::Dlp> receiver) {
   dlp_ash_->BindReceiver(std::move(receiver));
 }
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h
index de726d7..b23308d 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.h
+++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -24,6 +24,10 @@
 }  // namespace media
 #endif  // BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC)
 
+namespace apps {
+class DigitalGoodsFactoryAsh;
+}
+
 namespace crosapi {
 
 class ArcAsh;
@@ -143,6 +147,8 @@
       mojo::PendingReceiver<mojom::DeviceAttributes> receiver) override;
   void BindDeviceSettingsService(
       mojo::PendingReceiver<mojom::DeviceSettingsService> receiver) override;
+  void BindDigitalGoodsFactory(
+      mojo::PendingReceiver<mojom::DigitalGoodsFactory> receiver) override;
   void BindDlp(mojo::PendingReceiver<mojom::Dlp> receiver) override;
   void BindHoldingSpaceService(
       mojo::PendingReceiver<mojom::HoldingSpaceService> receiver) override;
@@ -366,6 +372,7 @@
   std::unique_ptr<DeskTemplateAsh> desk_template_ash_;
   std::unique_ptr<DeviceAttributesAsh> device_attributes_ash_;
   std::unique_ptr<DeviceSettingsAsh> device_settings_ash_;
+  std::unique_ptr<apps::DigitalGoodsFactoryAsh> digital_goods_factory_ash_;
   std::unique_ptr<DlpAsh> dlp_ash_;
   std::unique_ptr<DownloadControllerAsh> download_controller_ash_;
   std::unique_ptr<DriveIntegrationServiceAsh> drive_integration_service_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index dbe38931..7ee4d30 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -48,6 +48,7 @@
 #include "chromeos/crosapi/mojom/desk_template.mojom.h"
 #include "chromeos/crosapi/mojom/device_attributes.mojom.h"
 #include "chromeos/crosapi/mojom/device_settings_service.mojom.h"
+#include "chromeos/crosapi/mojom/digital_goods.mojom.h"
 #include "chromeos/crosapi/mojom/dlp.mojom.h"
 #include "chromeos/crosapi/mojom/download_controller.mojom.h"
 #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h"
@@ -204,6 +205,7 @@
     MakeInterfaceVersionEntry<crosapi::mojom::DeskTemplate>(),
     MakeInterfaceVersionEntry<crosapi::mojom::DeviceAttributes>(),
     MakeInterfaceVersionEntry<crosapi::mojom::DeviceSettingsService>(),
+    MakeInterfaceVersionEntry<crosapi::mojom::DigitalGoodsFactory>(),
     MakeInterfaceVersionEntry<crosapi::mojom::Dlp>(),
     MakeInterfaceVersionEntry<crosapi::mojom::DownloadController>(),
     MakeInterfaceVersionEntry<crosapi::mojom::DriveIntegrationService>(),
diff --git a/chrome/browser/ash/eche_app/eche_app_notification_controller.cc b/chrome/browser/ash/eche_app/eche_app_notification_controller.cc
index db45bc5d..b99042f 100644
--- a/chrome/browser/ash/eche_app/eche_app_notification_controller.cc
+++ b/chrome/browser/ash/eche_app/eche_app_notification_controller.cc
@@ -39,9 +39,6 @@
 // some point.
 const char kEcheAppLearnMoreUrl[] = "https://support.google.com/chromebook";
 
-// TODO(b/193583292): Wait for UX to build help site.
-const char kEcheAppHelpUrl[] = "https://support.google.com/chromebook";
-
 namespace {
 
 // Convenience function for creating a Notification.
@@ -87,11 +84,6 @@
   relaunch_callback_.Run(profile_);
 }
 
-void EcheAppNotificationController::LaunchHelp() {
-  NewWindowDelegate::GetPrimary()->OpenUrl(
-      GURL(kEcheAppHelpUrl), NewWindowDelegate::OpenUrlFrom::kUserInteraction);
-}
-
 void EcheAppNotificationController::ShowNotificationFromWebUI(
     const absl::optional<std::u16string>& title,
     const absl::optional<std::u16string>& message,
@@ -105,9 +97,10 @@
       message_center::RichNotificationData rich_notification_data;
       rich_notification_data.buttons.push_back(
           message_center::ButtonInfo(l10n_util::GetStringUTF16(
+              IDS_ECHE_APP_NOTIFICATION_LEARN_MORE_BUTTON)));
+      rich_notification_data.buttons.push_back(
+          message_center::ButtonInfo(l10n_util::GetStringUTF16(
               IDS_ECHE_APP_NOTIFICATION_TRY_AGAIN_BUTTON)));
-      rich_notification_data.buttons.push_back(message_center::ButtonInfo(
-          l10n_util::GetStringUTF16(IDS_ECHE_APP_NOTIFICATION_HELP_BUTTON)));
       ShowNotification(CreateNotification(
           kEcheAppRetryConnectionNotifierId,
           NotificationCatalogName::kEcheAppRetryConnection, title.value(),
@@ -205,10 +198,10 @@
     }
   } else if (notification_id_ == kEcheAppRetryConnectionNotifierId) {
     if (*button_index == 0) {
-      notification_controller_->LaunchTryAgain();
+      notification_controller_->LaunchLearnMore();
     } else {
       DCHECK_EQ(1, *button_index);
-      notification_controller_->LaunchHelp();
+      notification_controller_->LaunchTryAgain();
     }
   } else if (notification_id_ == kEcheAppInactivityNotifierId) {
     if (*button_index == 0) {
diff --git a/chrome/browser/ash/eche_app/eche_app_notification_controller.h b/chrome/browser/ash/eche_app/eche_app_notification_controller.h
index a69ce40..9e40cca 100644
--- a/chrome/browser/ash/eche_app/eche_app_notification_controller.h
+++ b/chrome/browser/ash/eche_app/eche_app_notification_controller.h
@@ -22,7 +22,6 @@
 extern const char kEcheAppInactivityNotifierId[];
 extern const char kEcheAppFromWebWithoutButtonNotifierId[];
 extern const char kEcheAppLearnMoreUrl[];
-extern const char kEcheAppHelpUrl[];
 
 // Controller class to show notifications.
 class EcheAppNotificationController {
@@ -58,7 +57,6 @@
   virtual void LaunchSettings();
   virtual void LaunchLearnMore();
   virtual void LaunchTryAgain();
-  virtual void LaunchHelp();
 
  private:
   // NotificationDelegate implementation for handling click events.
diff --git a/chrome/browser/ash/eche_app/eche_app_notification_controller_unittest.cc b/chrome/browser/ash/eche_app/eche_app_notification_controller_unittest.cc
index 4760d0a8..bce1e55 100644
--- a/chrome/browser/ash/eche_app/eche_app_notification_controller_unittest.cc
+++ b/chrome/browser/ash/eche_app/eche_app_notification_controller_unittest.cc
@@ -82,14 +82,14 @@
     ASSERT_EQ(2u, notification->buttons().size());
     EXPECT_EQ(message_center::SYSTEM_PRIORITY, notification->priority());
 
-    // Clicking the first notification button should launch try again.
-    EXPECT_CALL(*notification_controller_, LaunchTryAgain());
+    // Clicking the first notification button should launch learn more.
+    EXPECT_CALL(*new_window_delegate_,
+                OpenUrl(GURL(kEcheAppLearnMoreUrl),
+                        NewWindowDelegate::OpenUrlFrom::kUserInteraction));
     notification->delegate()->Click(0, absl::nullopt);
 
-    // Clicking the second notification button should launch help.
-    EXPECT_CALL(*new_window_delegate_,
-                OpenUrl(GURL(kEcheAppHelpUrl),
-                        NewWindowDelegate::OpenUrlFrom::kUserInteraction));
+    // Clicking the second notification button should launch try again.
+    EXPECT_CALL(*notification_controller_, LaunchTryAgain());
     notification->delegate()->Click(1, absl::nullopt);
   }
 
@@ -112,14 +112,14 @@
   EXPECT_EQ(notification->title(), title);
   EXPECT_EQ(notification->message(), message);
 
-  // Clicking the first notification button should relaunch again.
-  EXPECT_CALL(*notification_controller_, LaunchTryAgain());
+  // Clicking the first notification button should launch learn more.
+  EXPECT_CALL(*new_window_delegate_,
+              OpenUrl(GURL(kEcheAppLearnMoreUrl),
+                      NewWindowDelegate::OpenUrlFrom::kUserInteraction));
   notification->delegate()->Click(0, absl::nullopt);
 
-  // Clicking the second notification button should launch help.
-  EXPECT_CALL(*new_window_delegate_,
-              OpenUrl(GURL(kEcheAppHelpUrl),
-                      NewWindowDelegate::OpenUrlFrom::kUserInteraction));
+  // Clicking the second notification button should relaunch again.
+  EXPECT_CALL(*notification_controller_, LaunchTryAgain());
   notification->delegate()->Click(1, absl::nullopt);
 
   title = u"Connection Lost Title";
@@ -134,14 +134,14 @@
   EXPECT_EQ(notification->title(), title);
   EXPECT_EQ(notification->message(), message);
 
-  // Clicking the first notification button should relaunch again.
-  EXPECT_CALL(*notification_controller_, LaunchTryAgain());
+  // Clicking the first notification button should launch learn more.
+  EXPECT_CALL(*new_window_delegate_,
+              OpenUrl(GURL(kEcheAppLearnMoreUrl),
+                      NewWindowDelegate::OpenUrlFrom::kUserInteraction));
   notification->delegate()->Click(0, absl::nullopt);
 
-  // Clicking the second notification button should launch help.
-  EXPECT_CALL(*new_window_delegate_,
-              OpenUrl(GURL(kEcheAppHelpUrl),
-                      NewWindowDelegate::OpenUrlFrom::kUserInteraction));
+  // Clicking the second notification button should relaunch again.
+  EXPECT_CALL(*notification_controller_, LaunchTryAgain());
   notification->delegate()->Click(1, absl::nullopt);
 
   title = u"Inactivity Title";
diff --git a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
index 0f7ced9b..f611285 100644
--- a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
+++ b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
@@ -236,7 +236,7 @@
 bool ComponentExtensionIMEManagerDelegateImpl::IsIMEExtensionID(
     const std::string& id) {
   for (auto& extension : allowlisted_component_extensions) {
-    if (base::LowerCaseEqualsASCII(id, extension.id))
+    if (base::EqualsCaseInsensitiveASCII(id, extension.id))
       return true;
   }
   return false;
diff --git a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
index 4edaecb..88ae10b3 100644
--- a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
@@ -93,7 +93,7 @@
   if (browser_context->IsOffTheRecord())
     return nullptr;
 
-  if (!navigation->IsInMainFrame())
+  if (!navigation->IsInPrimaryMainFrame())
     return nullptr;
 
   return std::make_unique<navigation_interception::InterceptNavigationThrottle>(
diff --git a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle_unittest.cc b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle_unittest.cc
index 5fff387..a3c0ae9 100644
--- a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle_unittest.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle_unittest.cc
@@ -134,4 +134,21 @@
   base::RunLoop().RunUntilIdle();
 }
 
+TEST_F(BrowserSwitcherNavigationThrottleTest,
+       DoNotCreateThrottleOnNonPrimaryMainFrame) {
+  std::unique_ptr<MockNavigationHandle> handle =
+      CreateMockNavigationHandle(GURL("https://fencedframe.com/"));
+  handle->set_has_committed(true);
+  handle->set_is_in_primary_main_frame(false);
+
+  std::unique_ptr<NavigationThrottle> throttle_non_primary_main_frame =
+      CreateNavigationThrottle(handle.get());
+  EXPECT_EQ(nullptr, throttle_non_primary_main_frame.get());
+
+  handle->set_is_in_primary_main_frame(true);
+  std::unique_ptr<NavigationThrottle> throttle_in_primary_main_frame =
+      CreateNavigationThrottle(handle.get());
+  EXPECT_NE(nullptr, throttle_in_primary_main_frame.get());
+}
+
 }  // namespace browser_switcher
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index b5af864..1a4688f 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -43,6 +43,7 @@
 #include "chrome/browser/ui/webui/segmentation_internals/segmentation_internals_ui.h"
 #include "chrome/browser/ui/webui/usb_internals/usb_internals.mojom.h"
 #include "chrome/browser/ui/webui/usb_internals/usb_internals_ui.h"
+#include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/services/speech/buildflags/buildflags.h"
@@ -279,6 +280,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 #include "chrome/browser/apps/digital_goods/digital_goods_factory_stub.h"
+#include "chrome/browser/apps/digital_goods/digital_goods_lacros.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
@@ -718,9 +720,13 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(crbug.com/1203666): replace with a real implementation for Lacros.
-  map->Add<payments::mojom::DigitalGoodsFactory>(
-      base::BindRepeating(&apps::DigitalGoodsFactoryStub::Bind));
+  if (web_app::IsWebAppsCrosapiEnabled()) {
+    map->Add<payments::mojom::DigitalGoodsFactory>(
+        base::BindRepeating(&apps::DigitalGoodsFactoryLacros::Bind));
+  } else {
+    map->Add<payments::mojom::DigitalGoodsFactory>(
+        base::BindRepeating(&apps::DigitalGoodsFactoryStub::Bind));
+  }
 #endif
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index c899eec..2a01333 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5432,6 +5432,16 @@
     "expiry_milestone": 84
   },
   {
+    "name": "shelf-palm-rejection-swipe-offset",
+    "owners": ["anasalazar", "//ash/shelf/OWNERS"],
+    "expiry_milestone": 105
+  },
+  {
+    "name": "shelf-palm-rejection-touch-area",
+    "owners": ["anasalazar", "//ash/shelf/OWNERS"],
+    "expiry_milestone": 105
+  },
+  {
     "name": "shimless-rma-enable-standalone",
     "owners": [ "zentaro", "gavinwill", "cros-peripherals@google.com" ],
     "expiry_milestone": 108
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index c5e330e..8efc383c3 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2359,6 +2359,19 @@
     "Shows previews of the open windows for a given running app when hovering "
     "over the shelf.";
 
+const char kShelfPalmRejectionSwipeOffsetName[] =
+    "Shelf Palm Rejection: Swipe Offset";
+const char kShelfPalmRejectionSwipeOffsetDescription[] =
+    "Enables palm rejection in the shelf by setting an offset for the swipe "
+    "gesture that drags the hotseat to a extended state.";
+
+const char kShelfPalmRejectionTouchAreaName[] =
+    "Shelf Palm Rejection: Touch Area";
+const char kShelfPalmRejectionTouchAreaDescription[] =
+    "Enables palm rejection in the shelf by setting the touch area size within "
+    "the shelf for triggering the swipe gesture that drags the hotseat to a "
+    "extended state.";
+
 const char kShowAutofillSignaturesName[] = "Show autofill signatures.";
 const char kShowAutofillSignaturesDescription[] =
     "Annotates web forms with Autofill signatures as HTML attributes. Also "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 371df64..9fedd71 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1327,6 +1327,12 @@
 extern const char kShelfHoverPreviewsName[];
 extern const char kShelfHoverPreviewsDescription[];
 
+extern const char kShelfPalmRejectionSwipeOffsetName[];
+extern const char kShelfPalmRejectionSwipeOffsetDescription[];
+
+extern const char kShelfPalmRejectionTouchAreaName[];
+extern const char kShelfPalmRejectionTouchAreaDescription[];
+
 extern const char kShowAutofillSignaturesName[];
 extern const char kShowAutofillSignaturesDescription[];
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 1c8b563..bb563fc 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1835,11 +1835,6 @@
   syncer::ClearObsoleteSyncDecoupledFromAndroidMasterSync(profile_prefs);
 #endif  // BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Added 02/2022.
-  web_app::WebAppProvider::MigrateProfilePrefs(profile);
-#endif
-
   // Added 02/2022
   profile_prefs->ClearPref(kFlocIdValuePrefKey);
   profile_prefs->ClearPref(kFlocIdStatusPrefKey);
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
index bfb19da..5d983e5a 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
@@ -1137,7 +1137,7 @@
 <translation id="8978496506222343566">tltip</translation>
 <translation id="8986362086234534611">Esquecer</translation>
 <translation id="8989104346085848538">Para parar qualquer voz do ChromeVox atual, prima a tecla Control.</translation>
-<translation id="8993737615451556423">Fornece controlos para acelerar, abrandar e colocar em pausa a voz de leitura.</translation>
+<translation id="8993737615451556423">Fornece controlos para acelerar, abrandar e pausar a voz de leitura.</translation>
 <translation id="9014206344398081366">Tutorial do ChromeVox</translation>
 <translation id="9040132695316389094">Título 1</translation>
 <translation id="9061884144798498064">Selecionar uma tabela de braille de 8 pontos:</translation>
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
index fe26a24f..23e216f3 100644
--- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
+++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
@@ -14,7 +14,7 @@
  * multiple.
  */
 @IntDef({LayoutType.NONE, LayoutType.BROWSING, LayoutType.TAB_SWITCHER, LayoutType.TOOLBAR_SWIPE,
-        LayoutType.SIMPLE_ANIMATION})
+        LayoutType.SIMPLE_ANIMATION, LayoutType.START_SURFACE})
 @Retention(RetentionPolicy.SOURCE)
 public @interface LayoutType {
     int NONE = 0;
@@ -22,5 +22,6 @@
     int TAB_SWITCHER = 2;
     int TOOLBAR_SWIPE = 4;
     int SIMPLE_ANIMATION = 8;
-    // Next layout type should be 16.
+    int START_SURFACE = 16;
+    // Next layout type should be 32.
 }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
index 4a91780..8b310f1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Skakel sinkronisering aan om gepersonaliseerde inhoud wat deur Google voorgestel is, te kry</translation>
 <translation id="4214315110991671325">As jy webkoekies toelaat, kan Chrome hulle vir vooraflaai gebruik.</translation>
 <translation id="4225895483398857530">Nutsbalkkortpad</translation>
+<translation id="4227318652298512614">Volg enige werwe wat jy wil</translation>
 <translation id="4242533952199664413">Maak instellings oop</translation>
 <translation id="4248098802131000011">Beskerm jou wagwoorde teen dataskendings en ander sekuriteitsprobleme</translation>
 <translation id="4249955472157341256">Rangskik volgens Jongste</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index 91d0ce4..84920ca 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ስምረትን ማብራት ለማግኘት</translation>
 <translation id="4214315110991671325">ኩኪዎችን ከፈቀዱ Chrome ለቅድሚያ መጫን ሊጠቀምባቸው ይችላል።</translation>
 <translation id="4225895483398857530">የመሣሪያ አሞሌ አቋራጭ</translation>
+<translation id="4227318652298512614">የሚፈልጉትን ማንኛውም ጣቢያዎች ይከተሉ</translation>
 <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
 <translation id="4248098802131000011">የይለፍ ቃላትዎን ከውሂብ ጥሰቶች እና ሌሎች የደህንነት ችግሮች ይጠብቁ</translation>
 <translation id="4249955472157341256">በጊዜ ቅርበት ደርድር</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
index 55c1d99..741ba25c6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">ইনক’গনিট’ টেবত খোলক</translation>
 <translation id="3856096718352044181">অনুগ্ৰহ কৰি এইটো কোনো মান্য প্ৰদানকাৰীৰ বুলি সত্যাপন কৰক অথবা পাছত আকৌ চেষ্টা কৰক</translation>
 <translation id="3858860766373142691">নাম</translation>
+<translation id="3859206958100234503">আপোনাৰ আটাইবোৰ ডিভাইচত নিজৰ পাছৱৰ্ড, বুকমাৰ্ক আৰু অধিক পাবলৈ ছিংক কৰক</translation>
 <translation id="3861633093716975811">জনপ্ৰিয় ভিডিঅ’</translation>
 <translation id="3892148308691398805">পাঠৰ প্ৰতিলিপি কৰক</translation>
 <translation id="3894427358181296146">ফ’ল্ডাৰ যোগ কৰক</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">আপোনাৰ কণ্ঠধ্বনিৰে সন্ধান কৰিবলৈ মাইক্ৰ’ফ’নটোত টিপক</translation>
 <translation id="4844633725025837809">অতিৰিক্ত সুৰক্ষাৰ বাবে, Google পাছৱৰ্ড পৰিচালকত ছেভ কৰাৰ পূৰ্বে আপোনাৰ ডিভাইচত পাছৱৰ্ড এনক্ৰিপ্ট কৰক</translation>
 <translation id="4850886885716139402">চাওক</translation>
+<translation id="4852014461738377247">ছাইন ইন কৰি থকা হৈছে\u2026</translation>
 <translation id="4860895144060829044">কল কৰক</translation>
 <translation id="4864369630010738180">ছাইন ইন কৰি থকা হৈছে…</translation>
 <translation id="4866368707455379617">Chromeৰ কাৰণে <ph name="MODULE" /> ইনষ্টল কৰিব পৰা নগ’ল</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">অফলাইন হৈ আছে। Chromeএ আপোনাৰ পাছৱৰ্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে।</translation>
 <translation id="7313188324932846546">ছিংক ছেট আপ কৰিবলৈ টিপক</translation>
 <translation id="7332075081379534664">সফলভাৱে ছাইন ইন কৰা হ’ল</translation>
+<translation id="7333232495927792353">Googleৰ পৰা আটাইতকৈ প্ৰাসংগিক সমল পাবলৈ ছিংক কৰক</translation>
 <translation id="7339898014177206373">নতুন ৱিণ্ড'</translation>
 <translation id="7340958967809483333">Discoverৰ বিকল্পসমূহ</translation>
 <translation id="7352339641508007922">এটা দীঘল স্ক্ৰীনশ্বট ল’বলৈ টানি আনি এৰক</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">সৰলীকৃত পৃষ্ঠা চাবনে?</translation>
 <translation id="968900484120156207">আপুনি যিবোৰ ছাইট চায় সেইবোৰ ইয়াত দেখা যায়</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> মিনিট বাকী আছে</translation>
+<translation id="978443947993957527">আপোনাৰ বাবে থকা সমল চাওক</translation>
 <translation id="981121421437150478">অফলাইন</translation>
 <translation id="983192555821071799">সকলো টেব বন্ধ কৰক</translation>
 <translation id="987264212798334818">সাধাৰণ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
index 83a9ad3..57f5eb1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Uključite sinhronizaciju da dobijete prilagođeni sadržaj koji predlaže Google</translation>
 <translation id="4214315110991671325">Ako dozvolite kolačiće, Chrome ih može koristiti za predučitavanje.</translation>
 <translation id="4225895483398857530">Prečica za alatnu traku</translation>
+<translation id="4227318652298512614">Pratite sve web-lokacije koje želite</translation>
 <translation id="4242533952199664413">Otvori postavke</translation>
 <translation id="4248098802131000011">Zaštite svoje lozinke od narušavanja podataka i ostalih sigurnosnih problema</translation>
 <translation id="4249955472157341256">Poredaj po najnovijem</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
index 3a87af7..4f850fad 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Για λήψη εξατομικευμένου περιεχομένου που προτείνεται από την Google, ενεργοποιήστε τον συγχρονισμό</translation>
 <translation id="4214315110991671325">Εάν επιτρέψετε τη χρήση cookie, το Chrome μπορεί να τα χρησιμοποιήσει για την προφόρτωση.</translation>
 <translation id="4225895483398857530">Συντόμευση γραμμής εργαλείων</translation>
+<translation id="4227318652298512614">Ακολουθήστε οποιονδήποτε ιστότοπο επιθυμείτε</translation>
 <translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation>
 <translation id="4248098802131000011">Προστατέψτε τους κωδικούς πρόσβασής σας από παραβιάσεις δεδομένων και άλλα ζητήματα ασφαλείας.</translation>
 <translation id="4249955472157341256">Ταξινόμηση με βάση την πιο πρόσφατη</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index e66f03fd..4055ac2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -497,6 +497,7 @@
 <translation id="3687645719033307815">You are viewing a preview of this page</translation>
 <translation id="3690369331356918524">Warns you if passwords are exposed in a data breach</translation>
 <translation id="3692944402865947621"><ph name="FILE_NAME" /> download failed because storage location is not reachable.</translation>
+<translation id="3697705478071004188">Sort by site</translation>
 <translation id="3699022356773522638">Download file?</translation>
 <translation id="371230970611282515">Predicts and warns you about dangerous events before they happen.</translation>
 <translation id="3714981814255182093">Open the Find Bar</translation>
@@ -523,6 +524,7 @@
 <translation id="3845098929839618392">Open in Incognito tab</translation>
 <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation>
 <translation id="3858860766373142691">Name</translation>
+<translation id="3859206958100234503">Sync to get your passwords, bookmarks and more on all your devices</translation>
 <translation id="3861633093716975811">Popular videos</translation>
 <translation id="3892148308691398805">Copy text</translation>
 <translation id="3894427358181296146">Add folder</translation>
@@ -697,6 +699,7 @@
 <translation id="4842515939542199281">To search with your voice, tap the microphone</translation>
 <translation id="4844633725025837809">For added safety, encrypt passwords on your device before they‘re saved to Google Password Manager</translation>
 <translation id="4850886885716139402">View</translation>
+<translation id="4852014461738377247">Signing in\u2026</translation>
 <translation id="4860895144060829044">Call</translation>
 <translation id="4864369630010738180">Signing in...</translation>
 <translation id="4866368707455379617">Unable to install <ph name="MODULE" /> for Chrome</translation>
@@ -1150,6 +1153,7 @@
 <translation id="7304873321153398381">Offline. Chrome can’t check your passwords.</translation>
 <translation id="7313188324932846546">Tap to set up sync</translation>
 <translation id="7332075081379534664">Sign-in succeeded</translation>
+<translation id="7333232495927792353">Sync to get the most relevant content from Google</translation>
 <translation id="7339898014177206373">New window</translation>
 <translation id="7340958967809483333">Options for Discover</translation>
 <translation id="7352339641508007922">Drag to take a long screenshot</translation>
@@ -1305,6 +1309,7 @@
 <translation id="8103578431304235997">Incognito Tab</translation>
 <translation id="8105613260829665809">By continuing, you agree to the <ph name="BEGIN_TOS_LINK" />Terms of Service<ph name="END_TOS_LINK" />.\nTo help improve the app, Chrome sends usage and crash data to Google. <ph name="BEGIN_UMA_LINK" />Manage<ph name="END_UMA_LINK" /></translation>
 <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation>
+<translation id="8107530384992929318">Close sort options</translation>
 <translation id="8109613176066109935">To get your bookmarks on all your devices, turn on sync</translation>
 <translation id="8110024788458304985">Help improve Chrome\u2019s features and performance</translation>
 <translation id="8110087112193408731">Show your Chrome activity in Digital Wellbeing?</translation>
@@ -1378,6 +1383,7 @@
 <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation>
 <translation id="8489271220582375723">Open the history page</translation>
 <translation id="8493948351860045254">Free up space</translation>
+<translation id="8497242791509864205">Open sort options</translation>
 <translation id="8497480609928300907">Privacy guide explanation</translation>
 <translation id="8497726226069778601">Nothing to see here… yet</translation>
 <translation id="8503559462189395349">Chrome Passwords</translation>
@@ -1530,6 +1536,7 @@
 <translation id="96681097142096641">View simplified page?</translation>
 <translation id="968900484120156207">Pages that you visit appear here</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> mins left</translation>
+<translation id="978443947993957527">See content for you</translation>
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Close all tabs</translation>
 <translation id="987264212798334818">General</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index 0834700..62c6b45 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -235,7 +235,7 @@
 <translation id="2230777942707397948">Leiho hutsa</translation>
 <translation id="223356358902285214">Sareko eta aplikazioetako jarduerak</translation>
 <translation id="2239812875700136898">Istorioak kontrolatzeko, sakatu "Discover-en aukerak" botoia</translation>
-<translation id="2248941474044011069">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea atalean gorde aurretik</translation>
+<translation id="2248941474044011069">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik</translation>
 <translation id="2259659629660284697">Esportatu pasahitzak…</translation>
 <translation id="2276696007612801991">Hasi saioa Google-ko kontuan pasahitzak egiaztatzeko</translation>
 <translation id="2278052315791335171">Pasahitza ezabatzen baduzu ere, ez da ezabatuko <ph name="SITE" /> webguneko kontua</translation>
@@ -676,7 +676,7 @@
 <translation id="4758061975920522644">Partekatu irudia soilik</translation>
 <translation id="4759238208242260848">Deskargak</translation>
 <translation id="4763480195061959176">video</translation>
-<translation id="4766313118839197559">Pasahitzak gailu honetan soilik gordetzen dira, Pasahitz-kudeatzailea aplikazioan</translation>
+<translation id="4766313118839197559">Pasahitzak gailu honetan soilik gordetzen dira, Pasahitz-kudeatzailea zerbitzuan</translation>
 <translation id="4766678251456904326">Gehitu kontu bat gailuan</translation>
 <translation id="4791358705705538979">Lagungarria da sarean zereginak egiteko (adibidez, ordainketak)</translation>
 <translation id="4794291718671962615">(<ph name="MEGABYTES" />) <ph name="URL" /></translation>
@@ -694,7 +694,7 @@
 <translation id="4837753911714442426">Ireki orria inprimatzeko aukerak</translation>
 <translation id="4842092870884894799">Pasahitza sortzeko leiho gainerakorra erakusten</translation>
 <translation id="4842515939542199281">Ahotsa erabilita bilatzeko, sakatu mikrofonoa</translation>
-<translation id="4844633725025837809">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea atalean gorde aurretik</translation>
+<translation id="4844633725025837809">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik</translation>
 <translation id="4850886885716139402">Ikusi</translation>
 <translation id="4860895144060829044">Deitu</translation>
 <translation id="4864369630010738180">Saioa hasten…</translation>
@@ -936,7 +936,7 @@
 <translation id="6162892189396105610">Aurrez kargatzen dira Chrome-ren ustez bisitatuko dituzun orriak.</translation>
 <translation id="6186394685773237175">Ez da aurkitu arriskuan dagoen pasahitzik</translation>
 <translation id="6192907950379606605">Lortu irudi-deskribapenak</translation>
-<translation id="6196315980958524839">Pasahitzak gailu honetan gordetzen dira, Google-ren Pasahitz-kudeatzailea aplikazioan</translation>
+<translation id="6196315980958524839">Pasahitzak gailu honetan gordetzen dira, Google-ren Pasahitz-kudeatzailea zerbitzuan</translation>
 <translation id="620197886010707372"><ph name="APPNAME" /> aplikazioa ireki nahi duzu Google Play-rekin?</translation>
 <translation id="6203593061661911168">Wifira konektatzean hasiko da deskargatzen</translation>
 <translation id="6210748933810148297">Ez al zara <ph name="EMAIL" />?</translation>
@@ -1268,7 +1268,7 @@
 <translation id="7961015016161918242">Inoiz ez</translation>
 <translation id="7961926449547174351">Memoriarako sarbidea desgaitu duzu. Joan ezarpenetara hura berriro gaitzeko.</translation>
 <translation id="7963646190083259054">Saltzailea:</translation>
-<translation id="7965838025086216108">Gordetako pasahitzak edozein gailutan erabil ditzakezu. <ph name="ACCOUNT" /> kontuan saioa hasita zeneukala gorde dituzunak Google-ren Pasahitz-kudeatzailea aplikazioan gordetzen dira.</translation>
+<translation id="7965838025086216108">Gordetako pasahitzak edozein gailutan erabil ditzakezu. <ph name="ACCOUNT" /> kontuan saioa hasita zeneukala gorde dituzunak Google-ren Pasahitz-kudeatzailea zerbitzuan gordetzen dira.</translation>
 <translation id="7968014550143838305">Gehitu da irakurketa-zerrendan</translation>
 <translation id="7971136598759319605">Aktibo duela 1 egun</translation>
 <translation id="7975379999046275268">Aurreikusi orria <ph name="BEGIN_NEW" />Berria<ph name="END_NEW" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
index 289e44a9..294e05f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -120,9 +120,9 @@
 <translation id="1571304935088121812">کپی کردن نام کاربری</translation>
 <translation id="1592864538817356322">محافظت استاندارد:</translation>
 <translation id="1594635596540195766"><ph name="SUGGESTIONS_COUNT" /> مورد پیشنهادی در فهرست زیر.</translation>
-<translation id="161647866166517041">کاهش هرزنامه و تقلب برای کمک به سایت‌ها در مبارزه با تقلب و تشخیص روبات‌ها از افراد، به کدهای اطمینان اتکا می‌کند.
+<translation id="161647866166517041">کاهش هرزنامه و تقلب برای کمک به سایت‌ها در مبارزه با تقلب و تشخیص ربات‌ها از افراد، به کدهای اطمینان اتکا می‌کند.
 
-براساس تعاملتان با سایت‌ها، مثلاً ورود به سیستم مداوم در حسابی خاص، این سایت‌ها می‌توانند کد اطمینان به مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کنند، احتمال اینکه با شما مثل یک انسان (و نه روبات) برخورد کنند بیشتر است.
+براساس تعاملتان با سایت‌ها، مثلاً ورود به سیستم مداوم در حسابی خاص، این سایت‌ها می‌توانند کد اطمینان به مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کنند، احتمال اینکه با شما مثل یک انسان (و نه ربات) برخورد کنند بیشتر است.
 
 کدهای اطمینان حریم‌خصوصی را در وب افزایش می‌دهد و نمی‌توان از آن‌ها برای پی بردن به هویت شما استفاده کرد.</translation>
 <translation id="1627304841979541023">‏<ph name="BEGIN_BOLD" />چگونه می‌توانید داده‌هایتان را مدیریت کنید:<ph name="END_BOLD" /> برای محافظت از حریم‌خصوصی شما، علایقی را که قدیمی‌تر از ۴ هفته باشد به‌طور خودکار حذف می‌کنیم. وقتی به مرور کردن ادامه می‌دهید، ممکن است علاقه‌ای مجدداً به فهرست اضافه شود. یا می‌توانید علایقی را که نمی‌خواهید Chrome مدنظر قرار دهد حذف کنید.</translation>
@@ -968,9 +968,9 @@
 <translation id="6363990818884053551">برای شروع همگام‌سازی، هویتتان را به‌تأیید برسانید</translation>
 <translation id="6364438453358674297">پیشنهاد از سابقه حذف شود؟</translation>
 <translation id="6380100320871303656">‏صفحاتی که Chrome فکر می‌کند ممکن است بازدید کنید، دفعات بیشتری پیش‌بارگیری می‌شوند. این تنظیم ممکن است منجر به استفاده از داده بیشتر شود.</translation>
-<translation id="6385407407546870227">وقتی نسخه آزمایشی روشن باشد، «کاهش هرزنامه و تقلب» برای کمک به سایت‌ها در مبارزه با تقلب و تشخیص روبات‌ها از انسان، به کدهای اطمینان اتکا می‌کند.
+<translation id="6385407407546870227">وقتی نسخه آزمایشی روشن باشد، «کاهش هرزنامه و تقلب» برای کمک به سایت‌ها در مبارزه با تقلب و تشخیص ربات‌ها از انسان، به کدهای اطمینان اتکا می‌کند.
 
-براساس تعاملتان با یک سایت (مثلاً مرتباً وارد شدن به سیستم حسابی خاص)، این سایت می‌تواند کد اطمینان برای مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کند، احتمال اینکه با شما مثل یک انسان (و نه روبات) برخورد کند بیشتر است.
+براساس تعاملتان با یک سایت (مثلاً مرتباً وارد شدن به سیستم حسابی خاص)، این سایت می‌تواند کد اطمینان برای مرورگرتان صادر کنند. بعداً، اگر سایت‌های دیگری که از آن‌ها بازدید می‌کنید کد اطمینان معتبری را جستجو و پیدا کند، احتمال اینکه با شما مثل یک انسان (و نه ربات) برخورد کند بیشتر است.
 
 کدهای اطمینان حریم‌خصوصی را در وب بهبود می‌بخشد و نمی‌توان از آن‌ها برای پی بردن به هویت شما استفاده کرد.</translation>
 <translation id="6395288395575013217">پیوند</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index 1b087bec..ec5ba55 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Google દ્વારા સૂચવેલ વ્યક્તિગત કરેલ કન્ટેન્ટ મેળવવા માટે, સિંક કરવાનું ચાલુ કરો</translation>
 <translation id="4214315110991671325">જો તમે કુકીને મંજૂરી આપો, તો Chrome પહેલેથી લોડ કરવા માટે તેમનો ઉપયોગ કરી શકે છે.</translation>
 <translation id="4225895483398857530">ટૂલબારનો શૉર્ટકટ</translation>
+<translation id="4227318652298512614">તમને જોઈતી કોઈપણ સાઇટ ફૉલો કરો</translation>
 <translation id="4242533952199664413">સેટિંગ ખોલો</translation>
 <translation id="4248098802131000011">ડેટા ઉલ્લંઘનો અને અન્ય સુરક્ષા સંબંધિત સમસ્યાઓથી તમારા પાસવર્ડને સલામત રાખો</translation>
 <translation id="4249955472157341256">નવીનતમ મુજબ સૉર્ટ કરો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
index 280c9d2..2748d96 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">गुप्त टैब में खोलें</translation>
 <translation id="3856096718352044181">कृपया पुष्टि करें कि यह एक मान्य डीएनएस सेवा है या थोड़ी देर बाद कोशिश करें</translation>
 <translation id="3858860766373142691">नाम</translation>
+<translation id="3859206958100234503">सभी डिवाइसों पर अपने पासवर्ड, बुकमार्क वगैरह पाने के लिए, सिंक करें</translation>
 <translation id="3861633093716975811">लोकप्रिय वीडियो</translation>
 <translation id="3892148308691398805">टेक्स्ट कॉपी करें</translation>
 <translation id="3894427358181296146">फ़ोल्डर जोड़ें</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">बोलकर खोजने के लिए, माइक्रोफ़ोन पर टैप करें</translation>
 <translation id="4844633725025837809">ज़्यादा सुरक्षा के लिए, Google पासवर्ड मैनेजर में पासवर्ड सेव होने से पहले, अपने डिवाइस पर पासवर्ड को एन्क्रिप्ट (सुरक्षित) करें</translation>
 <translation id="4850886885716139402">देखें</translation>
+<translation id="4852014461738377247">साइन इन किया जा रहा है\u2026</translation>
 <translation id="4860895144060829044">कॉल करें</translation>
 <translation id="4864369630010738180">प्रवेश कर रहा है...</translation>
 <translation id="4866368707455379617">Chrome के लिए <ph name="MODULE" /> इंस्टॉल नहीं किया जा सका</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">ऑफ़लाइन. Chrome आपके पासवर्ड की जांच नहीं कर सकता.</translation>
 <translation id="7313188324932846546">सिंक करने की प्रक्रिया को सेट अप करने के लिए टैप करें</translation>
 <translation id="7332075081379534664">साइन इन हो गया</translation>
+<translation id="7333232495927792353">Google से काम का कॉन्टेंट पाने के लिए, सिंक करें</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
 <translation id="7340958967809483333">'डिस्कवर' के लिए विकल्प</translation>
 <translation id="7352339641508007922">लंबा स्क्रीनशॉट लेने के लिए खींचें और छोड़ें</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">क्या आप सरल बनाए गए पेज को देखना चाहते हैं?</translation>
 <translation id="968900484120156207">आप जिन पेजों पर जाएंगे वे यहां दिखाई देंगे</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> मिनट शेष</translation>
+<translation id="978443947993957527">अपने काम का कॉन्टेंट पाएं</translation>
 <translation id="981121421437150478">ऑफ़लाइन</translation>
 <translation id="983192555821071799">सभी टैब बंद करें</translation>
 <translation id="987264212798334818">सामान्य</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
index d76e1a65..ffb416b1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Uključite sinkronizaciju ako želite da vam Google predlaže prilagođene sadržaje</translation>
 <translation id="4214315110991671325">Ako dopustite kolačiće, Chrome ih može koristiti za predučitavanje.</translation>
 <translation id="4225895483398857530">Prečac alatne trake</translation>
+<translation id="4227318652298512614">Pratite sve web-lokacije koje želite</translation>
 <translation id="4242533952199664413">Otvori postavke</translation>
 <translation id="4248098802131000011">Osigurajte svoje zaporke od povreda podataka i drugih sigurnosnih problema</translation>
 <translation id="4249955472157341256">Poredaj po najnovijem</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 2dcb16e6..24cb078 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -581,6 +581,7 @@
 <translation id="4209895695669353772">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、同期を有効にします</translation>
 <translation id="4214315110991671325">Cookie を許可すると、Chrome がプリロードの際に Cookie を使用します。</translation>
 <translation id="4225895483398857530">ツールバー ショートカット</translation>
+<translation id="4227318652298512614">お気に入りのサイトをフォロー</translation>
 <translation id="4242533952199664413">設定を開く</translation>
 <translation id="4248098802131000011">データ侵害などのセキュリティの問題からパスワードを保護します</translation>
 <translation id="4249955472157341256">最新で並べ替え</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
index 26c2a70..cf10583 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">បើកនៅក្នុង​ផ្ទាំងឯកជន</translation>
 <translation id="3856096718352044181">សូមផ្ទៀងផ្ទាត់ថា នេះគឺជាក្រុមហ៊ុនផ្ដល់សេវាត្រឹមត្រូវ ឬព្យាយាមម្ដងទៀតនៅពេលក្រោយ</translation>
 <translation id="3858860766373142691">ឈ្មោះ</translation>
+<translation id="3859206958100234503">ធ្វើសមកាលកម្ម ដើម្បីទទួល​បាន​ពាក្យ​សម្ងាត់ ចំណាំ និងអ្វីៗជា​ច្រើនទៀត​នៅលើគ្រប់ឧបករណ៍របស់អ្នក</translation>
 <translation id="3861633093716975811">វីដេអូ​ពេញ​និយម​</translation>
 <translation id="3892148308691398805">ចម្លង​អត្ថបទ</translation>
 <translation id="3894427358181296146">បន្ថែមថតឯកសារ</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">ដើម្បីស្វែងរកដោយប្រើសំឡេងរបស់អ្នក សូមចុចមីក្រូហ្វូន</translation>
 <translation id="4844633725025837809">សម្រាប់​សុវត្ថិភាពបន្ថែម សូមអ៊ីនគ្រីប​ពាក្យសម្ងាត់នៅលើ​ឧបករណ៍​របស់អ្នក មុនពេលរក្សាទុក​ពាក្យសម្ងាត់​ទាំងនោះទៅ​កម្មវិធីគ្រប់គ្រង​ពាក្យសម្ងាត់ Google</translation>
 <translation id="4850886885716139402">មើល</translation>
+<translation id="4852014461738377247">កំពុង​ចូលគណនី\u2026</translation>
 <translation id="4860895144060829044">ហៅ</translation>
 <translation id="4864369630010738180">កំពុង​ចូល...</translation>
 <translation id="4866368707455379617">មិនអាចដំឡើង <ph name="MODULE" /> សម្រាប់ Chrome បានទេ</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">គ្មានអ៊ីនធឺណិត។ Chrome មិន​អាចពិនិត្យ​ពាក្យសម្ងាត់របស់អ្នកបានទេ។</translation>
 <translation id="7313188324932846546">ចុច ដើម្បីរៀបចំ​សមកាលកម្ម</translation>
 <translation id="7332075081379534664">បានចូលគណនីដោយជោគជ័យ</translation>
+<translation id="7333232495927792353">ធ្វើសមកាលកម្ម ដើម្បីទទួល​បាន​ខ្លឹមសារ​ដែល​ពាក់ព័ន្ធបំផុតពី Google</translation>
 <translation id="7339898014177206373">ផ្ទាំងថ្មី</translation>
 <translation id="7340958967809483333">ជម្រើសសម្រាប់ Discover</translation>
 <translation id="7352339641508007922">អូសដើម្បីថតរូបអេក្រង់វែង</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">មើលទំព័រសាមញ្ញឬ?</translation>
 <translation id="968900484120156207">ទំព័រ​ដែលអ្នកចូលមើល​បង្ហាញនៅទីនេះ</translation>
 <translation id="970715775301869095">នៅសល់ <ph name="MINUTES" /> នាទីទៀត</translation>
+<translation id="978443947993957527">មើល​ឃើញ​ខ្លឹមសារ​សម្រាប់អ្នក</translation>
 <translation id="981121421437150478">ក្រៅបណ្តាញ</translation>
 <translation id="983192555821071799">បិទផ្ទាំងទាំងអស់</translation>
 <translation id="987264212798334818">ទូទៅ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
index c060678..1949d314 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Google ಸಲಹೆ ನೀಡಿದ ವೈಯಕ್ತೀಕರಿಸಲಾದ ವಿಷಯವನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation>
 <translation id="4214315110991671325">ನೀವು ಕುಕೀಗಳನ್ನು ಅನುಮತಿಸಿದರೆ, ಮುಂಚಿತವಾಗಿ ಲೋಡ್ ಮಾಡುವುದಕ್ಕಾಗಿ Chrome ಅವುಗಳನ್ನು ಬಳಸಬಹುದು.</translation>
 <translation id="4225895483398857530">Toolbar ಶಾರ್ಟ್‌ಕಟ್</translation>
+<translation id="4227318652298512614">ನಿಮಗೆ ಬೇಕಾದ ಸೈಟ್‌ಗಳನ್ನು ಫಾಲೋ ಮಾಡಿ</translation>
 <translation id="4242533952199664413">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆ</translation>
 <translation id="4248098802131000011">ಡೇಟಾ ಉಲ್ಲಂಘನೆಗಳು ಮತ್ತು ಇತರ ಸುರಕ್ಷತೆ ಸಮಸ್ಯೆಗಳಿಂದಾಗಿ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಇರಿಸಿಕೊಳ್ಳಿ</translation>
 <translation id="4249955472157341256">ಇತ್ತೀಚಿನ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
index 2f04db9..c0352912 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">Отвори во картичка „Инкогнито“</translation>
 <translation id="3856096718352044181">Потврдете дека ова е вистински давател на услуги или обидете се повторно подоцна</translation>
 <translation id="3858860766373142691">Име</translation>
+<translation id="3859206958100234503">Синхронизирајте ги лозинките, обележувачите и друго на сите ваши уреди</translation>
 <translation id="3861633093716975811">Популарни видеа</translation>
 <translation id="3892148308691398805">Копирај текст</translation>
 <translation id="3894427358181296146">Додај папка</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">За да пребарувате со гласот, допрете го микрофонот</translation>
 <translation id="4844633725025837809">За дополнителна безбедност, шифрирајте ги лозинките на уредот пред да се зачуваат во „Управникот со лозинки на Google“</translation>
 <translation id="4850886885716139402">Приказ</translation>
+<translation id="4852014461738377247">Се најавува…</translation>
 <translation id="4860895144060829044">Повикајте</translation>
 <translation id="4864369630010738180">Се најавува…</translation>
 <translation id="4866368707455379617">Не може да се инсталира <ph name="MODULE" /> за Chrome</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">Офлајн. Chrome не може да ги провери вашите лозинки.</translation>
 <translation id="7313188324932846546">Допрете за да поставите синхронизација</translation>
 <translation id="7332075081379534664">Успешно најавување</translation>
+<translation id="7333232495927792353">Синхронизирајте за да ги добиете најрелевантните содржини од Google</translation>
 <translation id="7339898014177206373">Нов прозорец</translation>
 <translation id="7340958967809483333">Опции за Discover</translation>
 <translation id="7352339641508007922">Повлечете за да зачувате долга слика од екранот</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">Да се прикаже поедноставена страница?</translation>
 <translation id="968900484120156207">Страниците што ги посетувате се појавуваат тука</translation>
 <translation id="970715775301869095">Останаа <ph name="MINUTES" /> минути</translation>
+<translation id="978443947993957527">Видете содржини за вас</translation>
 <translation id="981121421437150478">Без мрежа</translation>
 <translation id="983192555821071799">Затвори ги сите картички</translation>
 <translation id="987264212798334818">Општо</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
index 9680dd9..03afc482 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">അദൃശ്യ ടാബിൽ തുറക്കുക</translation>
 <translation id="3856096718352044181">ഇത് സാധുതയുള്ളൊരു ദാതാവാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക അല്ലെങ്കിൽ പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="3858860766373142691">പേര്</translation>
+<translation id="3859206958100234503">പാസ്‌വേഡുകൾ, ബുക്ക്‌മാർക്കുകൾ എന്നിവയും മറ്റും നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ലഭിക്കാൻ അവ സമന്വയിപ്പിക്കുക.</translation>
 <translation id="3861633093716975811">ജനപ്രിയ വീഡിയോകൾ</translation>
 <translation id="3892148308691398805">ടെക്‌സ്‌റ്റ് പകർത്തുക</translation>
 <translation id="3894427358181296146">ഫോൾഡർ ചേർക്കുക</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">നിങ്ങളുടെ ശബ്‌ദം ഉപയോഗിച്ച് തിരയാൻ മൈക്രോഫോൺ ടാപ്പ് ചെയ്യുക</translation>
 <translation id="4844633725025837809">അധിക സുരക്ഷയ്ക്ക്, Google പാസ്‌വേഡ് മാനേജറിലേക്ക് സംരക്ഷിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്‌വേഡുകൾ എൻക്രിപ്റ്റ് ചെയ്യുക</translation>
 <translation id="4850886885716139402">കാണുക</translation>
+<translation id="4852014461738377247">സൈൻ ഇൻ ചെയ്യുന്നു\u2026</translation>
 <translation id="4860895144060829044">വിളിക്കുക</translation>
 <translation id="4864369630010738180">സൈൻ ഇൻ ചെയ്യുന്നു...</translation>
 <translation id="4866368707455379617">Chrome-നായി <ph name="MODULE" /> ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">ഓഫ്‌ലൈൻ. Chrome-ന് നിങ്ങളുടെ പാസ്‌വേഡുകൾ പരിശോധിക്കാനാകുന്നില്ല.</translation>
 <translation id="7313188324932846546">സമന്വയം സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക</translation>
 <translation id="7332075081379534664">സൈൻ ഇൻ ചെയ്തു</translation>
+<translation id="7333232495927792353">Google-ൽ നിന്നുള്ള ഏറ്റവും പ്രസക്തമായ ഉള്ളടക്കം ലഭിക്കാൻ സമന്വയിപ്പിക്കുക</translation>
 <translation id="7339898014177206373">പുതിയ വിന്‍ഡോ</translation>
 <translation id="7340958967809483333">Discover-നുള്ള ഓപ്ഷനുകൾ</translation>
 <translation id="7352339641508007922">നീളത്തിലുള്ള സ്ക്രീന്‍ഷോട്ട് എടുക്കാൻ വലിച്ചിടുക</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">ലളിതമാക്കിയ പേജ് കാണണോ?</translation>
 <translation id="968900484120156207">നിങ്ങൾ സന്ദർശിക്കുന്ന പേജുകൾ ഇവിടെ ദൃശ്യമാകും</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
+<translation id="978443947993957527">നിങ്ങൾക്കുള്ള ഉള്ളടക്കം കാണുക</translation>
 <translation id="981121421437150478">ഓഫ്‌ലൈൻ</translation>
 <translation id="983192555821071799">ടാബെല്ലാം അടയ്‌ക്കൂ</translation>
 <translation id="987264212798334818">പൊതുവായ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
index 912f65e..e0e83be5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Google-с санал болгосон хувийн болгосон агуулгыг авахын тулд синкийг асаана уу</translation>
 <translation id="4214315110991671325">Та күүкиг зөвшөөрсөн тохиолдолд тэдгээрийг Chrome урьдчилан ачаалахад ашиглаж магадгүй.</translation>
 <translation id="4225895483398857530">Самбарын товчлол</translation>
+<translation id="4227318652298512614">Хүссэн сайтаа дагаарай</translation>
 <translation id="4242533952199664413">Нээлттэй тохиргоо</translation>
 <translation id="4248098802131000011">Нууц үгээ өгөгдлийн зөрчил болон бусад аюулгүй байдлын асуудлаас хамгаалаарай</translation>
 <translation id="4249955472157341256">Сүүлийн үеийнхээр нь эрэмбэлэх</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
index bf929ee..3614ca4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Google ने सुचवलेला पर्सनलाइझ केलेला आशय मिळवण्यासाठी, सिंक सुरू करा</translation>
 <translation id="4214315110991671325">तुम्ही कुकीना अनुमती दिल्यास, Chrome प्रीलोडिंगसाठी त्यांचा वापर करू शकते.</translation>
 <translation id="4225895483398857530">टूलबार शॉर्टकट</translation>
+<translation id="4227318652298512614">तुम्हाला हव्या असलेल्या कोणत्याही साइट फॉलो करा</translation>
 <translation id="4242533952199664413">सेटिंग्ज उघडा</translation>
 <translation id="4248098802131000011">डेटा भंग आणि इतर सुरक्षितता समस्यांपासून तुमचे पासवर्ड सुरक्षित ठेवा</translation>
 <translation id="4249955472157341256">नवीनतम यानुसार क्रमाने लावा</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
index 507014d9..68241e7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation>
 <translation id="4214315110991671325">Hvis du tillater informasjonskapsler, kan Chrome bruke dem ved forhåndslasting.</translation>
 <translation id="4225895483398857530">Verktøylinje-snarvei</translation>
+<translation id="4227318652298512614">Følg de nettstedene du vil</translation>
 <translation id="4242533952199664413">Åpne innstillingene</translation>
 <translation id="4248098802131000011">Beskytt passordene dine mot databrudd og andre sikkerhetsproblemer</translation>
 <translation id="4249955472157341256">Sorter etter nyeste</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
index 9a2d8cf..6274b834 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Google ଦ୍ୱାରା ପ୍ରସ୍ତାବିତ ବ୍ୟକ୍ତିଗତକୃତ ବିଷୟବସ୍ତୁ ପ୍ରାପ୍ତ କରିବା ପାଇଁ, ସିଙ୍କ ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="4214315110991671325">ଯଦି ଆପଣ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତି, ତେବେ Chrome ସେଗୁଡ଼ିକୁ ପ୍ରିଲୋଡ କରିବା ପାଇଁ ବ୍ୟବହାର କରିପାରେ।</translation>
 <translation id="4225895483398857530">ଟୁଲବାର୍ ସର୍ଟକଟ୍</translation>
+<translation id="4227318652298512614">ଆପଣ ଚାହୁଁଥିବା ଯେ କୌଣସି ସାଇଟକୁ ଅନୁସରଣ କରନ୍ତୁ</translation>
 <translation id="4242533952199664413">ସେଟିଂସ୍‌ ଖୋଲନ୍ତୁ</translation>
 <translation id="4248098802131000011">ଡାଟା ଉଲ୍ଲଙ୍ଘନ ଏବଂ ଅନ୍ୟ ସୁରକ୍ଷା ସମସ୍ୟାଗୁଡ଼ିକରୁ ଆପଣଙ୍କର ପାସୱାର୍ଡଗୁଡ଼ିକୁ ସୁରକ୍ଷିତ ରଖନ୍ତୁ</translation>
 <translation id="4249955472157341256">ନବୀନତମ ଅନୁସାରେ ସର୍ଟ କରନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
index 183dc35..e428bdd 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">ਇਨਕੋਗਨਿਟੋ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation>
 <translation id="3856096718352044181">ਕਿਰਪਾ ਕਰਕੇ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਇਹ ਇੱਕ ਵੈਧ ਪ੍ਰਦਾਨਕ ਹੈ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation>
 <translation id="3858860766373142691">ਨਾਮ</translation>
+<translation id="3859206958100234503">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ, ਬੁੱਕਮਾਰਕ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation>
 <translation id="3861633093716975811">ਪ੍ਰਸਿੱਧ ਵੀਡੀਓ</translation>
 <translation id="3892148308691398805">ਲਿਖਤ ਕਾਪੀ ਕਰੋ</translation>
 <translation id="3894427358181296146">ਫੋਲਡਰ ਜੋੜੋ</translation>
@@ -696,6 +697,7 @@
 <translation id="4842515939542199281">ਆਪਣੀ ਅਵਾਜ਼ ਨਾਲ ਖੋਜ ਕਰਨ ਲਈ, ਮਾਈਕ੍ਰੋਫ਼ੋਨ 'ਤੇ ਟੈਪ ਕਰੋ</translation>
 <translation id="4844633725025837809">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ, Google ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ 'ਤੇ ਰੱਖਿਅਤ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਇਨਕ੍ਰਿਪਟ ਕਰੋ</translation>
 <translation id="4850886885716139402">ਦੇਖੋ</translation>
+<translation id="4852014461738377247">ਸਾਈਨ-ਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ\u2026</translation>
 <translation id="4860895144060829044">ਕਾਲ ਕਰੋ</translation>
 <translation id="4864369630010738180">ਸਾਈਨ ਇਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation>
 <translation id="4866368707455379617">Chrome ਲਈ <ph name="MODULE" /> ਨੂੰ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation>
@@ -1149,6 +1151,7 @@
 <translation id="7304873321153398381">ਆਫ਼ਲਾਈਨ। Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ।</translation>
 <translation id="7313188324932846546">ਸਿੰਕ ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ</translation>
 <translation id="7332075081379534664">ਸਾਈਨ-ਇਨ ਕਰਨਾ ਸਫਲ ਰਿਹਾ</translation>
+<translation id="7333232495927792353">Google ਤੋਂ ਸਭ ਤੋਂ ਢੁਕਵੀਂ ਸਮੱਗਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation>
 <translation id="7339898014177206373">ਨਵੀਂ window</translation>
 <translation id="7340958967809483333">'ਡਿਸਕਵਰ' ਲਈ ਵਿਕਲਪ</translation>
 <translation id="7352339641508007922">ਇੱਕ ਲੰਬਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਲਈ ਘਸੀਟੋ</translation>
@@ -1529,6 +1532,7 @@
 <translation id="96681097142096641">ਕੀ ਸਰਲ ਬਣਾਏ ਪੰਨੇ ਨੂੰ ਦੇਖਣਾ ਹੈ?</translation>
 <translation id="968900484120156207">ਜਿਨ੍ਹਾਂ ਪੰਨਿਆਂ 'ਤੇ ਤੁਸੀਂ ਜਾਂਦੇ ਹੋ ਉਹ ਇੱਥੇ ਦਿਖਾਈ ਦਿੰਦੇ ਹਨ</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> ਮਿੰਟ ਬਾਕੀ</translation>
+<translation id="978443947993957527">ਆਪਣੇ ਲਈ ਸਮੱਗਰੀ ਦੇਖੋ</translation>
 <translation id="981121421437150478">ਆਫ਼ਲਾਈਨ</translation>
 <translation id="983192555821071799">ਸਾਰੀਆਂ ਟੈਬਸ ਬੰਦ ਕਰੋ</translation>
 <translation id="987264212798334818">ਸਧਾਰਨ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index d5ab3a8..bab1f15 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">Pentru a obține sugestii de conținut personalizat de la Google, activează sincronizarea</translation>
 <translation id="4214315110991671325">Dacă permiți cookie-uri, Chrome le va folosi probabil pentru preîncărcare.</translation>
 <translation id="4225895483398857530">Comanda rapidă spre bara de instrumente</translation>
+<translation id="4227318652298512614">Urmărește orice site-uri dorești</translation>
 <translation id="4242533952199664413">Deschide setările</translation>
 <translation id="4248098802131000011">Protejează-ți parolele împotriva încălcării securității datelor și a altor probleme de securitate</translation>
 <translation id="4249955472157341256">Sortează după cele mai recente</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
index 2067660..53fd0bf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">Otvoriť na karte inkognito</translation>
 <translation id="3856096718352044181">Overte, že ide o platného poskytovateľa, alebo to skúste znova</translation>
 <translation id="3858860766373142691">Názov</translation>
+<translation id="3859206958100234503">Zapnite synchronizáciu a získajte tak heslá, záložky a ďalší obsah zo všetkých svojich zariadení.</translation>
 <translation id="3861633093716975811">Populárne videá</translation>
 <translation id="3892148308691398805">Kopírovať text</translation>
 <translation id="3894427358181296146">Pridanie priečinka</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">Ak chcete vyhľadávať hlasom, klepnite na mikrofón</translation>
 <translation id="4844633725025837809">Šifrujte heslá v zariadení ešte pred ich uložením do správcu hesiel Google, čím zvýšite zabezpečenie</translation>
 <translation id="4850886885716139402">Zobraziť</translation>
+<translation id="4852014461738377247">Prihlasuje sa\u2026</translation>
 <translation id="4860895144060829044">Volajte</translation>
 <translation id="4864369630010738180">Prebieha prihlasovanie...</translation>
 <translation id="4866368707455379617">Modul <ph name="MODULE" /> pre Chrome sa nepodarilo nainštalovať</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">Offline. Chrome nemôže skontrolovať heslá.</translation>
 <translation id="7313188324932846546">Klepnutím nastavte synchronizáciu</translation>
 <translation id="7332075081379534664">Prihlásenie je úspešné</translation>
+<translation id="7333232495927792353">Zapnite synchronizáciu a získajte tak najrelevantnejší obsah z Googlu</translation>
 <translation id="7339898014177206373">Nové okno</translation>
 <translation id="7340958967809483333">Možnosti kanála Objaviť</translation>
 <translation id="7352339641508007922">Presunutím vytvoríte dlhú snímku obrazovky</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">Chcete zobraziť zjednodušenú stránku?</translation>
 <translation id="968900484120156207">Tu sa zobrazia vami navštívené stránky</translation>
 <translation id="970715775301869095">Zostáva: <ph name="MINUTES" /> min</translation>
+<translation id="978443947993957527">Pozrite si obsah pre vás</translation>
 <translation id="981121421437150478">Offline</translation>
 <translation id="983192555821071799">Zavrieť všetky karty</translation>
 <translation id="987264212798334818">Všeobecné</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
index 4edcecf..fd74b24 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">అజ్ఞాత ట్యాబ్‌లో తెరువు</translation>
 <translation id="3856096718352044181">దయచేసి ఇది చెల్లుబాటు అయ్యే ప్రొవైడర్ అని వెరిఫై చేయండి లేదా తర్వాత మళ్లీ ట్రై చేయండి</translation>
 <translation id="3858860766373142691">పేరు</translation>
+<translation id="3859206958100234503">మీ పరికరాలన్నిటిలో మీ పాస్‌వర్డ్‌లు, బుక్‌మార్క్‌లు ఇంకా మరిన్నింటిని పొందడానికి సింక్ చేయండి.</translation>
 <translation id="3861633093716975811">జనాదరణ పొందిన వీడియోలు</translation>
 <translation id="3892148308691398805">టెక్స్ట్‌ను కాపీ చేయి</translation>
 <translation id="3894427358181296146">ఫోల్డర్‌ను జోడించండి</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">మీ వాయిస్‌తో సెర్చ్ చేయడానికి, మైక్రోఫోన్‌ను ట్యాప్ చేయండి</translation>
 <translation id="4844633725025837809">అదనపు భద్రత కోసం, పాస్‌వర్డ్‌లు Google పాస్‌వర్డ్ మేనేజర్‌లో సేవ్ కావడానికి ముందు, వాటిని మీ పరికరంలో ఎన్‌క్రిప్ట్ చేయండి</translation>
 <translation id="4850886885716139402">వీక్షణ</translation>
+<translation id="4852014461738377247">సైన్ ఇన్ అవుతోంది\u2026</translation>
 <translation id="4860895144060829044">కాల్ చేయండి</translation>
 <translation id="4864369630010738180">సైన్ ఇన్ అవుతోంది...</translation>
 <translation id="4866368707455379617">Chromeలో <ph name="MODULE" />ని ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">ఆఫ్‌లైన్‌లో ఉన్నారు. Chrome మీ పాస్‌వర్డ్‌లను చెక్ చేయలేదు.</translation>
 <translation id="7313188324932846546">సింక్‌ను సెటప్ చేయడానికి ట్యాప్ చేయండి</translation>
 <translation id="7332075081379534664">సైన్ ఇన్ విజయవంతమైంది</translation>
+<translation id="7333232495927792353">Google నుండి అత్యంత సందర్భోచితంగా ఉండే కంటెంట్‌ను పొందడానికి సింక్ చేయండి</translation>
 <translation id="7339898014177206373">కొత్త విండో</translation>
 <translation id="7340958967809483333">Discover కోసం ఆప్షన్‌లు</translation>
 <translation id="7352339641508007922">పొడవైన స్క్రీన్‌షాట్‌ను తీయడానికి లాగండి</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">సరళంగా తయారయిన పేజీని చూపించాలా?</translation>
 <translation id="968900484120156207">మీరు సందర్శించే పేజీలు ఇక్కడ కనిపిస్తాయి</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> నిమిషాలు మిగిలి ఉంది</translation>
+<translation id="978443947993957527">మీ కోసం అనుకూలీకరించిన కంటెంట్‌ను చూడండి</translation>
 <translation id="981121421437150478">ఆఫ్‌లైన్</translation>
 <translation id="983192555821071799">అన్ని ట్యాబ్‌లను మూసివేయి</translation>
 <translation id="987264212798334818">సాధారణం</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
index bce1a78..00379dc 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -580,6 +580,7 @@
 <translation id="4209895695669353772">เปิดการซิงค์เพื่อรับคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณจาก Google</translation>
 <translation id="4214315110991671325">Chrome อาจใช้คุกกี้เพื่อโหลดล่วงหน้าหากคุณอนุญาต</translation>
 <translation id="4225895483398857530">ทางลัดแถบเครื่องมือ</translation>
+<translation id="4227318652298512614">ติดตามเว็บไซต์ที่คุณต้องการ</translation>
 <translation id="4242533952199664413">เปิดการตั้งค่า</translation>
 <translation id="4248098802131000011">รักษารหัสผ่านให้ปลอดภัยจากการละเมิดข้อมูลและปัญหาด้านความปลอดภัยอื่นๆ</translation>
 <translation id="4249955472157341256">จัดเรียงตามล่าสุด</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
index 2c6e054..136c631 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -523,6 +523,7 @@
 <translation id="3845098929839618392">Vula kuthebhu ye-incognito</translation>
 <translation id="3856096718352044181">Sicela uqinisekise ukuthi lo ngumhlinzeki wangempela noma uzame futhi kamuva</translation>
 <translation id="3858860766373142691">Igama</translation>
+<translation id="3859206958100234503">Vumelanisa ukuze uthole amaphasiwedi akho, amabhukhimakhi nokuningi kuwo wonke amanye amadivayisi wakho</translation>
 <translation id="3861633093716975811">Amavidiyo adumile</translation>
 <translation id="3892148308691398805">Kopisha umbhalo</translation>
 <translation id="3894427358181296146">Engeza ifolda</translation>
@@ -697,6 +698,7 @@
 <translation id="4842515939542199281">Ukuze useshe ngezwi lakho, thepha imakrofoni</translation>
 <translation id="4844633725025837809">Ukuze uthole ukuphepha okwengeziwe, bethela amaphasiwedi kudivayisi yakho ngaphambi kokuthi alondolozwe ku-Google Password Manager</translation>
 <translation id="4850886885716139402">Buka</translation>
+<translation id="4852014461738377247">Ingena ngemvume\u2026</translation>
 <translation id="4860895144060829044">Shaya</translation>
 <translation id="4864369630010738180">Iyangena ngemvume...</translation>
 <translation id="4866368707455379617">Ayikwazi ukufaka i-<ph name="MODULE" /> ye-Chrome</translation>
@@ -1150,6 +1152,7 @@
 <translation id="7304873321153398381">Okungaxhunyiwe ku-inthanethi. I-Chrome ayikwazi ukuhlola amaphasiwedi akho.</translation>
 <translation id="7313188324932846546">Thepha ukuze uvumelanise</translation>
 <translation id="7332075081379534664">Ukungena ngemvume kuphumelele</translation>
+<translation id="7333232495927792353">Vumelanisa ukuze uthole okuqukethwe okuhambisana kakhulu kusuka ku-Google</translation>
 <translation id="7339898014177206373">Iwindi elisha</translation>
 <translation id="7340958967809483333">Izinketho zokuthola</translation>
 <translation id="7352339641508007922">Hudula ukuze uthathe isithombe-skrini eside</translation>
@@ -1530,6 +1533,7 @@
 <translation id="96681097142096641">Bona ikhasi elenziwe laba lula?</translation>
 <translation id="968900484120156207">Amakhasi owavakashelayo avela lapha</translation>
 <translation id="970715775301869095"><ph name="MINUTES" /> amaminithi asele</translation>
+<translation id="978443947993957527">Bona okuqukethwe kwakho</translation>
 <translation id="981121421437150478">Ayixhunyiwe ku-inthanethi</translation>
 <translation id="983192555821071799">Vala wonke amathebhu</translation>
 <translation id="987264212798334818">Okujwayelekile</translation>
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
index ba931e1..5f63929 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
@@ -77,7 +77,8 @@
 }
 
 bool IsSuggestionChip(const std::string& app_id) {
-  return base::LowerCaseEqualsASCII(app_id, ash::kInternalAppIdContinueReading);
+  return base::EqualsCaseInsensitiveASCII(app_id,
+                                          ash::kInternalAppIdContinueReading);
 }
 
 const InternalApp* FindInternalApp(const std::string& app_id) {
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc b/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
index 97f7c92..561b254 100644
--- a/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
+++ b/chrome/browser/ui/views/extensions/extensions_request_access_button_hover_card.cc
@@ -16,6 +16,7 @@
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/dialog_model.h"
+#include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/bubble/bubble_dialog_model_host.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/layout/flex_layout_view.h"
@@ -33,38 +34,25 @@
           .AsImageSkia());
 }
 
-class ExtensionItemFactory
-    : public views::BubbleDialogModelHost::CustomViewFactory {
- public:
-  ExtensionItemFactory(const std::u16string& name, const ui::ImageModel& icon)
-      : name_(std::move(name)), icon_(icon) {}
-  ~ExtensionItemFactory() override = default;
+std::unique_ptr<views::BubbleDialogModelHost::CustomView> CreateExtensionItem(
+    const std::u16string& name,
+    const ui::ImageModel& icon) {
+  const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
+  const gfx::Insets content_insets = provider->GetDialogInsetsForContentType(
+      views::DialogContentType::kText, views::DialogContentType::kText);
 
-  // views::BubbleDialogModelHost::CustomViewFactory:
-  std::unique_ptr<views::View> CreateView() override {
-    const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
-    const gfx::Insets content_insets = provider->GetDialogInsetsForContentType(
-        views::DialogContentType::kText, views::DialogContentType::kText);
-
-    return views::Builder<views::FlexLayoutView>()
-        .SetOrientation(views::LayoutOrientation::kHorizontal)
-        .SetMainAxisAlignment(views::LayoutAlignment::kStart)
-        .SetCrossAxisAlignment(views::LayoutAlignment::kCenter)
-        .SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR(
-            0, content_insets.left(), 0, content_insets.right())))
-        .AddChildren(views::Builder<views::ImageView>().SetImage(icon_),
-                     views::Builder<views::Label>().SetText(name_))
-        .Build();
-  }
-
-  views::BubbleDialogModelHost::FieldType GetFieldType() const override {
-    return views::BubbleDialogModelHost::FieldType::kMenuItem;
-  }
-
- private:
-  const std::u16string name_;
-  const ui::ImageModel icon_;
-};
+  return std::make_unique<views::BubbleDialogModelHost::CustomView>(
+      views::Builder<views::FlexLayoutView>()
+          .SetOrientation(views::LayoutOrientation::kHorizontal)
+          .SetMainAxisAlignment(views::LayoutAlignment::kStart)
+          .SetCrossAxisAlignment(views::LayoutAlignment::kCenter)
+          .SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR(
+              0, content_insets.left(), 0, content_insets.right())))
+          .AddChildren(views::Builder<views::ImageView>().SetImage(icon),
+                       views::Builder<views::Label>().SetText(name))
+          .Build(),
+      views::BubbleDialogModelHost::FieldType::kMenuItem);
+}
 
 }  // namespace
 
@@ -98,7 +86,7 @@
         IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_TOOLTIP_MULTIPLE_EXTENSIONS,
         url)));
     for (auto* action : actions) {
-      dialog_builder.AddCustomField(std::make_unique<ExtensionItemFactory>(
+      dialog_builder.AddCustomField(CreateExtensionItem(
           action->GetActionName(), GetIcon(action, web_contents)));
     }
   }
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
index c39dbc27..033291c 100644
--- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -98,33 +98,14 @@
   return button;
 }
 
-class MenuItemFactory : public views::BubbleDialogModelHost::CustomViewFactory {
- public:
-  MenuItemFactory(const std::u16string& name,
-                  views::Button::PressedCallback callback,
-                  const gfx::VectorIcon* icon = nullptr)
-      : name_(std::move(name)), callback_(std::move(callback)), icon_(icon) {}
-  ~MenuItemFactory() override = default;
-
-  // views::BubbleDialogModelHost::CustomViewFactory:
-  std::unique_ptr<views::View> CreateView() override {
-    // TODO(pbos): See if dialog_model()->host()->Close(); can be handled by the
-    // menu item itself (after calling callback_). All menu-item actions close
-    // the dialog. We should be able to chain some calls if we have access to
-    // DialogModelDelegate here.
-
-    return CreateMenuItem(-1, name_, callback_, icon_);
-  }
-
-  views::BubbleDialogModelHost::FieldType GetFieldType() const override {
-    return views::BubbleDialogModelHost::FieldType::kMenuItem;
-  }
-
- private:
-  const std::u16string name_;
-  const views::Button::PressedCallback callback_;
-  const raw_ptr<const gfx::VectorIcon> icon_;
-};
+std::unique_ptr<views::BubbleDialogModelHost::CustomView>
+CreateMenuItemCustomView(const std::u16string& name,
+                         views::Button::PressedCallback callback,
+                         const gfx::VectorIcon* icon = nullptr) {
+  return std::make_unique<views::BubbleDialogModelHost::CustomView>(
+      CreateMenuItem(-1, name, std::move(callback), icon),
+      views::BubbleDialogModelHost::FieldType::kMenuItem);
+}
 
 class TabGroupEditorBubbleDelegate : public ui::DialogModelDelegate {
  public:
@@ -227,7 +208,7 @@
     dialog_builder.OverrideShowCloseButton(false)
         .AddSeparator()
         .AddCustomField(
-            std::make_unique<MenuItemFactory>(
+            CreateMenuItemCustomView(
                 l10n_util::GetStringUTF16(
                     IDS_TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP),
                 base::BindRepeating(
@@ -236,7 +217,7 @@
                 &kNewTabInGroupIcon),
             TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP)
         .AddCustomField(
-            std::make_unique<MenuItemFactory>(
+            CreateMenuItemCustomView(
                 l10n_util::GetStringUTF16(IDS_TAB_GROUP_HEADER_CXMENU_UNGROUP),
                 base::BindRepeating(
                     &TabGroupEditorBubbleDelegate::UngroupPressed,
@@ -244,7 +225,7 @@
                 &kUngroupIcon),
             TAB_GROUP_HEADER_CXMENU_UNGROUP)
         .AddCustomField(
-            std::make_unique<MenuItemFactory>(
+            CreateMenuItemCustomView(
                 l10n_util::GetStringUTF16(
                     IDS_TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP),
                 base::BindRepeating(
@@ -253,7 +234,7 @@
                 &kCloseGroupIcon),
             TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP)
         .AddCustomField(
-            std::make_unique<MenuItemFactory>(
+            CreateMenuItemCustomView(
                 l10n_util::GetStringUTF16(
                     IDS_TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW),
                 base::BindRepeating(
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
index 17096021..403865e 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
@@ -25,9 +25,9 @@
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/base/models/dialog_model.h"
 #include "ui/base/models/dialog_model_field.h"
 #include "ui/gfx/image/image_skia.h"
-#include "ui/views/bubble/bubble_dialog_model_host.h"
 #include "ui/views/window/dialog_delegate.h"
 
 namespace chrome {
@@ -77,10 +77,7 @@
           .OverrideShowCloseButton(false)
           .Build();
 
-  auto dialog = views::BubbleDialogModelHost::CreateModal(
-      std::move(dialog_model), ui::MODAL_TYPE_CHILD);
-
-  constrained_window::ShowWebModalDialogViews(dialog.release(), web_contents);
+  constrained_window::ShowWebModal(std::move(dialog_model), web_contents);
 }
 
 }  // namespace chrome
diff --git a/chrome/browser/web_applications/test/fake_web_app_provider.cc b/chrome/browser/web_applications/test/fake_web_app_provider.cc
index f97cc1b..678f6f2 100644
--- a/chrome/browser/web_applications/test/fake_web_app_provider.cc
+++ b/chrome/browser/web_applications/test/fake_web_app_provider.cc
@@ -267,6 +267,7 @@
 std::unique_ptr<KeyedService> FakeWebAppProviderCreator::CreateWebAppProvider(
     content::BrowserContext* context) {
   Profile* profile = Profile::FromBrowserContext(context);
+  DCHECK(!WebAppProviderFactory::IsServiceCreatedForProfile(profile));
   if (!AreWebAppsEnabled(profile) || !callback_)
     return nullptr;
   return callback_.Run(profile);
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc
index dedb2fc0..f85e875b 100644
--- a/chrome/browser/web_applications/web_app_provider.cc
+++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -349,6 +349,7 @@
 
   ExternallyInstalledWebAppPrefs::MigrateExternalPrefData(profile_->GetPrefs(),
                                                           sync_bridge_.get());
+  DoMigrateProfilePrefs(profile_);
 
   registrar_->Start();
   install_finalizer_->Start();
@@ -385,17 +386,6 @@
   RegisterDailyWebAppMetricsProfilePrefs(registry);
 }
 
-// static
-void WebAppProvider::MigrateProfilePrefs(Profile* profile) {
-  WebAppProvider* provider = WebAppProvider::GetForLocalAppsUnchecked(profile);
-  if (provider) {
-    provider->on_registry_ready_.Post(
-        FROM_HERE,
-        base::BindOnce(&WebAppProvider::DoMigrateProfilePrefs,
-                       provider->weak_ptr_factory_.GetWeakPtr(), profile));
-  }
-}
-
 void WebAppProvider::DoMigrateProfilePrefs(Profile* profile) {
   std::map<AppId, int> sources =
       TakeAllWebAppInstallSources(profile->GetPrefs());
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h
index 853384b..6b8cda6 100644
--- a/chrome/browser/web_applications/web_app_provider.h
+++ b/chrome/browser/web_applications/web_app_provider.h
@@ -140,11 +140,6 @@
 
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
-  // Kicks off a migration of some entries from the `web_app_ids` pref
-  // dictionary to the web app database. This should be safe to delete one year
-  // after 02-2022.
-  static void MigrateProfilePrefs(Profile* profile);
-
   // Signals when app registry becomes ready.
   const base::OneShotEvent& on_registry_ready() const {
     return on_registry_ready_;
@@ -171,6 +166,9 @@
 
   void CheckIsConnected() const;
 
+  // Performs a migration of some entries from the `web_app_ids` pref
+  // dictionary to the web app database. This should be safe to delete one year
+  // after 02-2022.
   void DoMigrateProfilePrefs(Profile* profile);
 
   std::unique_ptr<AbstractWebAppDatabaseFactory> database_factory_;
diff --git a/chrome/browser/web_applications/web_app_provider_factory.cc b/chrome/browser/web_applications/web_app_provider_factory.cc
index b3d6c60a..13e8625 100644
--- a/chrome/browser/web_applications/web_app_provider_factory.cc
+++ b/chrome/browser/web_applications/web_app_provider_factory.cc
@@ -26,6 +26,12 @@
   return base::Singleton<WebAppProviderFactory>::get();
 }
 
+// static
+bool WebAppProviderFactory::IsServiceCreatedForProfile(Profile* profile) {
+  return WebAppProviderFactory::GetInstance()->GetServiceForBrowserContext(
+             profile, /*create=*/false) != nullptr;
+}
+
 WebAppProviderFactory::WebAppProviderFactory()
     : BrowserContextKeyedServiceFactory(
           "WebAppProvider",
diff --git a/chrome/browser/web_applications/web_app_provider_factory.h b/chrome/browser/web_applications/web_app_provider_factory.h
index 66a8224..eabb1b8 100644
--- a/chrome/browser/web_applications/web_app_provider_factory.h
+++ b/chrome/browser/web_applications/web_app_provider_factory.h
@@ -29,6 +29,8 @@
 
   static WebAppProviderFactory* GetInstance();
 
+  static bool IsServiceCreatedForProfile(Profile* profile);
+
  private:
   friend struct base::DefaultSingletonTraits<WebAppProviderFactory>;
   friend class WebAppProvider;
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 4b60759..1328b18 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1653069473-c040bb250835d032615d6d63df28c13871949daf.profdata
+chrome-linux-main-1653155042-e5bceadb34eff8598deaaa27b5ae5672fa9b4079.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 0973b703..5d537d69 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1653069473-65534882503242043ea466875dd1339cb47370bb.profdata
+chrome-mac-arm-main-1653155042-ddf4733bb6644de2e657ac0ccdbbc70db7741c35.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 5592f13..6f2feef 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1653069473-da301b51e9adc109fb0d8f0696a94ab40579dfe7.profdata
+chrome-mac-main-1653155042-6b65703489e20751a8b6a2614775f0ec938d6c85.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 0d1565c2..1bff641b 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1653080329-91bf123bcb3e9ba70b94f02ea7e7350b2125a93e.profdata
+chrome-win32-main-1653165281-6e0270f77ee0e10be62b76c1c49763e311b2d7ad.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 0542033..173bb36 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1653080329-7935f15a2d49d4c91b84af35c70659205f234f2a.profdata
+chrome-win64-main-1653165281-6aa6083d9119626f8ddc4a3a34a69f196998adee.profdata
diff --git a/chrome/renderer/media/media_feeds.cc b/chrome/renderer/media/media_feeds.cc
index 60a7f77..a38d7a2 100644
--- a/chrome/renderer/media/media_feeds.cc
+++ b/chrome/renderer/media/media_feeds.cc
@@ -47,7 +47,7 @@
 
     // The <link> rel must be media-feed.
     std::string rel = elem.GetAttribute("rel").Utf8();
-    if (!base::LowerCaseEqualsASCII(rel, "media-feed"))
+    if (!base::EqualsCaseInsensitiveASCII(rel, "media-feed"))
       continue;
 
     WebString href = elem.GetAttribute("href");
diff --git a/chrome/test/base/web_ui_browser_test_browsertest.cc b/chrome/test/base/web_ui_browser_test_browsertest.cc
index 6fc0f7c..e47c39f26 100644
--- a/chrome/test/base/web_ui_browser_test_browsertest.cc
+++ b/chrome/test/base/web_ui_browser_test_browsertest.cc
@@ -199,15 +199,6 @@
       RunJavascriptAsyncTest("startAsyncTest", base::Value("testFailsAssert")));
 }
 
-// Test that expectations continue the function, but fail the test.
-IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncFailsExpect) {
-  ::testing::InSequence s;
-  EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_));
-  EXPECT_CALL(message_handler_, HandleTestFails(::testing::_));
-  ASSERT_FALSE(
-      RunJavascriptAsyncTest("startAsyncTest", base::Value("testFailsExpect")));
-}
-
 // Test that test continues and passes. (Sync version).
 IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestSyncPasses) {
   EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_));
@@ -252,18 +243,6 @@
       RunJavascriptAsyncTest("startAsyncTest", base::Value("testPasses")));
 }
 
-// Test that testDone() with failure first then sync pass still fails.
-IN_PROC_BROWSER_TEST_F(WebUIBrowserAsyncTest, TestAsyncDoneFailFirstSyncPass) {
-  ::testing::InSequence s;
-  EXPECT_CALL(message_handler_, HandleTestContinues(::testing::_));
-  EXPECT_CALL(message_handler_, HandleTestFails(::testing::_));
-
-  // Call runAsync directly instead of deferring through startAsyncTest. It will
-  // call testDone() on failure, then return.
-  ASSERT_FALSE(RunJavascriptAsyncTest(
-      "runAsync", base::Value("testAsyncDoneFailFirstSyncPass")));
-}
-
 // Test that calling testDone during RunJavascriptAsyncTest still completes
 // when waiting for async result. This is similar to the previous test, but call
 // testDone directly and expect pass result.
diff --git a/chrome/test/data/unit/framework_unittest.gtestjs b/chrome/test/data/unit/framework_unittest.gtestjs
index 874e7303..f1e304d 100644
--- a/chrome/test/data/unit/framework_unittest.gtestjs
+++ b/chrome/test/data/unit/framework_unittest.gtestjs
@@ -13,10 +13,6 @@
   __proto__: testing.Test.prototype,
 };
 
-TEST_F('FrameworkUnitTest', 'ExpectTrueOk', function() {
-  expectTrue(true);
-});
-
 TEST_F('FrameworkUnitTest', 'AssertTrueOk', function() {
   assertTrue(true);
 });
@@ -35,10 +31,6 @@
   testShouldFail: true,
 };
 
-TEST_F('FrameworkUnitTestFail', 'ExpectFailFails', function() {
-  expectNotReached();
-});
-
 TEST_F('FrameworkUnitTestFail', 'AssertFailFails', function() {
   assertNotReached();
-});
\ No newline at end of file
+});
diff --git a/chrome/test/data/unit/framework_unittest.js b/chrome/test/data/unit/framework_unittest.js
index 3eee034..f8e3622 100644
--- a/chrome/test/data/unit/framework_unittest.js
+++ b/chrome/test/data/unit/framework_unittest.js
@@ -12,10 +12,6 @@
   __proto__: testing.Test.prototype,
 };
 
-TEST_F('FrameworkUnitTest', 'testExpectTrueOk', function() {
-  expectTrue(true);
-});
-
 TEST_F('FrameworkUnitTest', 'testAssertTrueOk', function() {
   assertTrue(true);
 });
@@ -33,10 +29,6 @@
   testShouldFail: true,
 };
 
-TEST_F('FrameworkUnitTestFail', 'testExpectFailFails', function() {
-  expectNotReached();
-});
-
 TEST_F('FrameworkUnitTestFail', 'testAssertFailFails', function() {
   assertNotReached();
-});
\ No newline at end of file
+});
diff --git a/chrome/test/data/webui/assertions.js b/chrome/test/data/webui/assertions.js
index 5206a30..d1962ba 100644
--- a/chrome/test/data/webui/assertions.js
+++ b/chrome/test/data/webui/assertions.js
@@ -11,28 +11,6 @@
   browsePreload: DUMMY_URL,
 };
 
-TEST_F('WebUIAssertionsTest', 'testTwoExpects', function() {
-  var result = runTestFunction('testTwoExpects', function() {
-    expectTrue(false);
-    expectFalse(true);
-  }, []);
-  resetTestState();
-  assertFalse(result[0]);
-  assertNotEquals(-1, result[1].indexOf('expected false to be true'));
-  assertNotEquals(-1, result[1].indexOf('expected true to be false'));
-});
-
-TEST_F('WebUIAssertionsTest', 'testTwoIdenticalExpects', function() {
-  var result = runTestFunction('testTwoIdenticalExpects', function() {
-    expectTrue(false, 'message1');
-    expectTrue(false, 'message1');
-  }, []);
-  resetTestState();
-  assertFalse(result[0]);
-  assertEquals(
-      2, result[1].match(/message1: expected false to be true/g).length);
-});
-
 TEST_F('WebUIAssertionsTest', 'testConstructedMessage', function() {
   var message = 'myErrorMessage';
   var result = runTestFunction('testConstructMessage', function() {
@@ -62,11 +40,6 @@
   assertNotReached();
 });
 
-// Test that an expect failure fails test.
-TEST_F('WebUIAssertionsTestFail', 'testExpectFailFails', function() {
-  expectNotReached();
-});
-
 /**
  * Async version of WebUIAssertionsTestFail.
  * @extends WebUIAssertionsTest
diff --git a/chrome/test/data/webui/async.js b/chrome/test/data/webui/async.js
index e21fd63..f0080ff 100644
--- a/chrome/test/data/webui/async.js
+++ b/chrome/test/data/webui/async.js
@@ -13,29 +13,15 @@
 }
 
 /**
- * Records failure.
- */
-function testFailsExpect() {
-  expectNotReached();
-  chrome.send('testContinues');
-  expectNotReached();
-}
-
-/**
  * Passes and sends testDone message for browser_test to call
  * testDone().
  */
 function testPasses() {
-  expectTrue(true);
+  assertTrue(true);
   chrome.send('testContinues');
   assertFalse(false);
 }
 
-function testAsyncDoneFailFirstSyncPass() {
-  expectNotReached();
-  chrome.send('testContinues');
-}
-
 /**
  * Wraps the function represented by |name| similar to the way net_internals
  * tests are wrapped.
diff --git a/chrome/test/data/webui/async_gen.js b/chrome/test/data/webui/async_gen.js
index f8901830..c281ea7c 100644
--- a/chrome/test/data/webui/async_gen.js
+++ b/chrome/test/data/webui/async_gen.js
@@ -22,8 +22,8 @@
 
   /** @inheritDoc */
   tearDown: function() {
-    expectFalse(this.tornDown);
-    expectFalse(this.running);
+    assertFalse(this.tornDown);
+    assertFalse(this.running);
     this.tornDown = true;
     chrome.send('tearDown');
     testing.Test.prototype.tearDown.call(this);
@@ -148,12 +148,12 @@
 
   // Check expectations after mocks have been called.
   window.continueTest2 = this.continueTest(WhenTestDone.ALWAYS, function() {
-    expectEquals('passedVal1', var3);
-    expectEquals('passedVal1', var4);
-    expectEquals('passedVal2', var5);
-    expectEquals('val6', var6);
-    expectEquals('passedVal2', var7);
-    expectEquals('val8', var8);
+    assertEquals('passedVal1', var3);
+    assertEquals('passedVal1', var4);
+    assertEquals('passedVal2', var5);
+    assertEquals('val6', var6);
+    assertEquals('passedVal2', var7);
+    assertEquals('val8', var8);
   });
 
   // Kick off the tests asynchronously.
@@ -205,7 +205,7 @@
   /** @inheritDoc */
   setUp: function() {
     continueTest = this.continueTest(WhenTestDone.DEFAULT, function() {
-      expectFalse(this.ranTest_);
+      assertFalse(this.ranTest_);
       chrome.send('callJS', ['deferRunTest']);
     });
     chrome.send('callJS', ['continueTest']);
@@ -213,7 +213,7 @@
 
   /** @inheritDoc */
   tearDown: function() {
-    expectTrue(this.ranTest_);
+    assertTrue(this.ranTest_);
     WebUIBrowserAsyncGenTest.prototype.tearDown.call(this);
   },
 };
diff --git a/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js b/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
index f9e887f..5593ad9 100644
--- a/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
+++ b/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
@@ -204,22 +204,22 @@
     app.$$('#backup-checkbox > cr-checkbox').click();
     await clickAction();
 
-    expectEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 1);
+    assertEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 1);
     fakeBrowserProxy.page.precheckStatus(
         chromeos.crostiniUpgrader.mojom.UpgradePrecheckStatus.NETWORK_FAILURE);
     await clickAction();
 
-    expectEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 2);
+    assertEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 2);
     fakeBrowserProxy.page.precheckStatus(
         chromeos.crostiniUpgrader.mojom.UpgradePrecheckStatus.LOW_POWER);
     await clickAction();
 
-    expectEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 3);
+    assertEquals(fakeBrowserProxy.handler.getCallCount('startPrechecks'), 3);
     fakeBrowserProxy.page.precheckStatus(
         chromeos.crostiniUpgrader.mojom.UpgradePrecheckStatus.OK);
     await clickAction();
 
-    expectEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), 1);
+    assertEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), 1);
   });
 
   test('upgradeFlowFailureOffersRestore', async () => {
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
index 28e21eb8..acdc6f2 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
@@ -43,7 +43,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'Web App');
@@ -71,7 +71,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'Android App');
@@ -99,7 +99,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'Chrome App');
@@ -127,7 +127,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'Chrome App installed from <a href="#">Chrome Web Store</a>');
@@ -155,7 +155,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'Android App installed from <a href="#">Google Play Store</a>');
@@ -182,7 +182,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'System App');
@@ -209,7 +209,7 @@
     flushTasks();
 
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#type-and-source'));
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#type-and-source')
             .textContent.trim(),
         'ChromeOS System App');
@@ -236,7 +236,7 @@
     fakeHandler.flushPipesForTesting();
     flushTasks();
 
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#version').textContent.trim(),
         'Version: 17.2');
   });
@@ -262,7 +262,7 @@
     fakeHandler.flushPipesForTesting();
     flushTasks();
 
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#version').innerText.trim(),
         'Version: 13.1.52');
   });
@@ -301,7 +301,7 @@
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#app-size'));
     assertFalse(!!appDetailsItem.shadowRoot.querySelector('#data-size'));
 
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#app-size').textContent.trim(),
         'App size: 17 MB');
 
@@ -321,10 +321,10 @@
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#app-size'));
     assertTrue(!!appDetailsItem.shadowRoot.querySelector('#data-size'));
 
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#app-size').textContent.trim(),
         'App size: 17 MB');
-    expectEquals(
+    assertEquals(
         appDetailsItem.shadowRoot.querySelector('#data-size')
             .textContent.trim(),
         'Data stored in app: 124.6 GB');
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
index 0af9619..ca0543cf 100644
--- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -1917,11 +1917,11 @@
                   IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value);
               assertTrue(acIdleSelect.disabled);
               assertTrue(batteryIdleSelect.disabled);
-              expectNotEquals(
+              assertNotEquals(
                   null,
                   powerPage.shadowRoot.querySelector(
                       '#acIdleManagedIndicator'));
-              expectNotEquals(
+              assertNotEquals(
                   null,
                   powerPage.shadowRoot.querySelector(
                       '#batteryIdleManagedIndicator'));
diff --git a/chrome/test/data/webui/test_api.js b/chrome/test/data/webui/test_api.js
index d2a50d1..27fb7cc 100644
--- a/chrome/test/data/webui/test_api.js
+++ b/chrome/test/data/webui/test_api.js
@@ -1209,24 +1209,6 @@
 }
 
 /**
- * Exports expect methods. 'expect*' methods allow tests to run until the end
- * even in the presence of failures.
- */
-function exportExpects() {
-  exports.expectTrue = createExpect(assertTrue);
-  exports.expectFalse = createExpect(assertFalse);
-  exports.expectGE = createExpect(assertGE);
-  exports.expectGT = createExpect(assertGT);
-  exports.expectEquals = createExpect(assertEquals);
-  exports.expectDeepEquals = createExpect(assertDeepEquals);
-  exports.expectLE = createExpect(assertLE);
-  exports.expectLT = createExpect(assertLT);
-  exports.expectNotEquals = createExpect(assertNotEquals);
-  exports.expectNotReached = createExpect(assertNotReached);
-  exports.expectThrows = createExpect(assertThrows);
-}
-
-/**
  * Exports methods related to Mock4JS mocking.
  */
 function exportMock4JsHelpers() {
@@ -1238,7 +1220,6 @@
 testing.Test = Test;
 exports.testDone = testDone;
 exportChaiAsserts();
-exportExpects();
 exportMock4JsHelpers();
 exports.preloadJavascriptLibraries = preloadJavascriptLibraries;
 exports.setWaitUser = setWaitUser;
diff --git a/chromeos/crosapi/DEPS b/chromeos/crosapi/DEPS
index 3278ce5..5d6157e 100644
--- a/chromeos/crosapi/DEPS
+++ b/chromeos/crosapi/DEPS
@@ -4,6 +4,7 @@
 include_rules = [
   "+components/services/app_service/public",
   "+components/webapps/browser",
+  "+components/digital_goods/mojom",
   "+components/policy/core/common",
 ]
 
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn
index b83d380..041fb9d 100644
--- a/chromeos/crosapi/mojom/BUILD.gn
+++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -26,6 +26,7 @@
     "desk_template.mojom",
     "device_attributes.mojom",
     "device_settings_service.mojom",
+    "digital_goods.mojom",
     "dlp.mojom",
     "download_controller.mojom",
     "drive_integration_service.mojom",
@@ -84,6 +85,7 @@
     "//chromeos/components/remote_apps/mojom",
     "//chromeos/components/sensors/mojom",
     "//chromeos/services/machine_learning/public/mojom",
+    "//components/digital_goods/mojom:mojom",
     "//components/metrics/structured/mojom",
     "//components/services/app_service/public/mojom:mojom",
     "//media/capture/mojom:image_capture",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 0551899..541d38d 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -22,6 +22,7 @@
 import "chromeos/crosapi/mojom/desk_template.mojom";
 import "chromeos/crosapi/mojom/device_attributes.mojom";
 import "chromeos/crosapi/mojom/device_settings_service.mojom";
+import "chromeos/crosapi/mojom/digital_goods.mojom";
 import "chromeos/crosapi/mojom/dlp.mojom";
 import "chromeos/crosapi/mojom/download_controller.mojom";
 import "chromeos/crosapi/mojom/drive_integration_service.mojom";
@@ -106,8 +107,8 @@
 // please note the milestone when you added it, to help us reason about
 // compatibility between the client applications and older ash-chrome binaries.
 //
-// Next version: 76
-// Next method id: 79
+// Next version: 77
+// Next method id: 80
 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e",
  RenamedFrom="crosapi.mojom.AshChromeService"]
 interface Crosapi {
@@ -220,6 +221,10 @@
   [MinVersion=55] BindDeviceSettingsService@59(
     pending_receiver<DeviceSettingsService> receiver);
 
+  // Added in M104.
+  [MinVersion=76] BindDigitalGoodsFactory@79(
+    pending_receiver<DigitalGoodsFactory> receiver);
+
   // Binds the DLP (Data Leak Prevention) interface for notifying Ash about
   // content restrictions applied to web content in Lacros.
   // Added in M98.
diff --git a/chromeos/crosapi/mojom/digital_goods.mojom b/chromeos/crosapi/mojom/digital_goods.mojom
new file mode 100644
index 0000000..c066e1d
--- /dev/null
+++ b/chromeos/crosapi/mojom/digital_goods.mojom
@@ -0,0 +1,47 @@
+// Copyright 2022 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.
+
+module crosapi.mojom;
+
+import "components/digital_goods/mojom/digital_goods.mojom";
+import "url/mojom/url.mojom";
+
+// Implemented in ash-chrome. Allows lacros-chrome to perform Digital Goods
+// operations (forwarded to ARC).
+[Stable, Uuid="6f2fbc9e-2ff1-47bd-a15d-08e12c226f61"]
+interface DigitalGoods {
+  // Queries the associated backend for information about one or more items.
+  GetDetails@0(string web_app_id, url.mojom.Url scope, array<string> item_ids)
+      => (payments.mojom.BillingResponseCode code,
+          array<payments.mojom.ItemDetails> item_details_list);
+
+  // Queries the associated backend for information on all items that are
+  // currently owned by the user. May include unconfirmed purchases.
+  ListPurchases@1(string web_app_id, url.mojom.Url scope)
+      => (payments.mojom.BillingResponseCode code,
+          array<payments.mojom.PurchaseReference> purchase_reference_list);
+
+  // Queries the associated backend for information on the latest purchase for
+  // each item type ever purchased by the user. May include expired or consumed
+  // purchases.
+  ListPurchaseHistory@2(string web_app_id, url.mojom.Url scope)
+      => (payments.mojom.BillingResponseCode code,
+          array<payments.mojom.PurchaseReference> purchase_reference_list);
+
+  // Informs the associated backend that the purchase identified by
+  // |purchase_token| was used up.
+  Consume@3(string web_app_id, url.mojom.Url scope, string purchase_token)
+      => (payments.mojom.BillingResponseCode code);
+};
+
+// Implemented in ash-chrome. Allows lacros-chrome to create a |DigitalGoods|
+// instance.
+[Stable, Uuid="1197d2ad-0f33-49e4-b6d6-370e255a9896"]
+interface DigitalGoodsFactory {
+  // Creates a DigitalGoods instance. The |digital_goods| is non-null iff
+  // |code| == kOk.
+  CreateDigitalGoods@0(string payment_method, string web_app_id)
+    => (payments.mojom.CreateDigitalGoodsResponseCode code,
+        pending_remote<DigitalGoods>? digital_goods);
+};
\ No newline at end of file
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc
index b8620c1..d272863 100644
--- a/chromeos/lacros/lacros_service.cc
+++ b/chromeos/lacros/lacros_service.cc
@@ -31,6 +31,7 @@
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
 #include "chromeos/crosapi/mojom/desk_template.mojom.h"
 #include "chromeos/crosapi/mojom/device_settings_service.mojom.h"
+#include "chromeos/crosapi/mojom/digital_goods.mojom.h"
 #include "chromeos/crosapi/mojom/dlp.mojom.h"
 #include "chromeos/crosapi/mojom/download_controller.mojom.h"
 #include "chromeos/crosapi/mojom/drive_integration_service.mojom.h"
@@ -256,6 +257,9 @@
       crosapi::mojom::DeviceSettingsService,
       &Crosapi::BindDeviceSettingsService,
       Crosapi::MethodMinVersions::kBindDeviceSettingsServiceMinVersion>();
+  ConstructRemote<
+      crosapi::mojom::DigitalGoodsFactory, &Crosapi::BindDigitalGoodsFactory,
+      Crosapi::MethodMinVersions::kBindDigitalGoodsFactoryMinVersion>();
   ConstructRemote<crosapi::mojom::Dlp, &Crosapi::BindDlp,
                   Crosapi::MethodMinVersions::kBindDlpMinVersion>();
   ConstructRemote<
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 04d782b..4e332f3 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -78,6 +78,7 @@
 <translation id="1578784163189013834">Choose screensaver background</translation>
 <translation id="1615335640928990664">Data usage since <ph name="FRIENDLY_DATE" /></translation>
 <translation id="1621067168122174824">Run charge test</translation>
+<translation id="1631385268983122904">Don't put the device back together yet</translation>
 <translation id="1639239467298939599">Loading</translation>
 <translation id="1641857168437328880">Document feeder (one-sided)</translation>
 <translation id="1643449475550628585">Change wallpaper image daily</translation>
@@ -85,6 +86,7 @@
 <translation id="1645954272419197032">Please confirm device information</translation>
 <translation id="1662989795263954667">Stopped – out of ink</translation>
 <translation id="1668469839109562275">Built-in VPN</translation>
+<translation id="1676557873873341166">Taking video</translation>
 <translation id="1703835215927279855">Letter</translation>
 <translation id="1706391837335750954">DNS resolver present</translation>
 <translation id="1715359911173058521">There's an issue communicating with the scanner. Check the network or USB connection and try again.</translation>
@@ -159,6 +161,7 @@
 <translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> DPI</translation>
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2338501278241028356">Turn on Bluetooth to discover nearby devices</translation>
+<translation id="2340422556570134524">Write Protect has been turned on unexpectedly. Please turn off Write Protect manually before trying again.</translation>
 <translation id="2346474577291266260">Excellent (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="2359808026110333948">Continue</translation>
 <translation id="2360257214555822463"><ph name="LINK_BEGIN" />Unqualified components<ph name="LINK_END" /> detected. If you choose to confirm this has been installed, please do so now.</translation>
@@ -474,6 +477,7 @@
 <translation id="5372659122375744710">Wi-Fi network is not secure</translation>
 <translation id="5376354385557966694">Automatic light mode</translation>
 <translation id="537872351913703572">Device will go to a different user or organisation</translation>
+<translation id="5389159777326897627">Wallpaper and style</translation>
 <translation id="5389224261615877010">Rainbow</translation>
 <translation id="5395600419410242651">Erase all data</translation>
 <translation id="5400907029458559844">Device is connecting.</translation>
@@ -643,6 +647,7 @@
 <translation id="6961170852793647506">To get started, place your document on the scanner</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6977381486153291903">Firmware revision</translation>
+<translation id="6995564396478647735">Make sure that Write Protect is on</translation>
 <translation id="7028979494427204405"><ph name="MANAGER" /> manages this device and has access to all user activity, including web pages visited, passwords and email.</translation>
 <translation id="7040230719604914234">Operator</translation>
 <translation id="7041549558901442110">Device is not connected.</translation>
@@ -653,6 +658,7 @@
 <translation id="7086440545492620869"><ph name="VALUE" /> <ph name="DISPLAY_NAME" /></translation>
 <translation id="710028965487274708">Failed – authorisation failed</translation>
 <translation id="7103252855940681301">Device <ph name="INDEX" /> of <ph name="COUNT" /> named <ph name="NAME" />.</translation>
+<translation id="7126228745139711113">Write Protect is turned off</translation>
 <translation id="7134436342991564651">{0,plural, =1{Name server}other{Name servers}}</translation>
 <translation id="7143207342074048698">Connecting</translation>
 <translation id="7144878232160441200">Retry</translation>
@@ -744,6 +750,7 @@
 <translation id="80398733265834479">Enable auto colour mode</translation>
 <translation id="8041089156583427627">Send Feedback</translation>
 <translation id="8045012663542226664">Microphone mute</translation>
+<translation id="8063022551652308521">Write Protect is still turned off. To proceed, turn on Write Protect.</translation>
 <translation id="8075838845814659848">Remaining charge</translation>
 <translation id="8082366717211101304">Can't resolve DNS from Android apps</translation>
 <translation id="8083281199617904460">This repair process is intended for a trained repair technician. Start only after replacing the malfunctioning components.</translation>
@@ -814,6 +821,7 @@
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Use the left or right arrow keys to manage this feature.</translation>
 <translation id="8712637175834984815">Got it</translation>
 <translation id="871560550817059752">Failed – Out of ink</translation>
+<translation id="8717030727630712160">Resuming repair process…</translation>
 <translation id="8723108084122415655">Non-default network above latency threshold</translation>
 <translation id="8725066075913043281">Try again</translation>
 <translation id="8726019395068607495">Stopped – door open</translation>
@@ -835,6 +843,7 @@
 <translation id="8868741746785112895">GUID</translation>
 <translation id="8876270629542503161">Device is a tablet.</translation>
 <translation id="8881098542468797602">Test succeeded</translation>
+<translation id="8897267175591692539">You can put the device back together now</translation>
 <translation id="8898840733695078011">Signal strength</translation>
 <translation id="8910721771319628100">Default network above latency threshold</translation>
 <translation id="8918637186205009138"><ph name="GIVEN_NAME" />'s <ph name="DEVICE_TYPE" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
index ce36ea6..cd2d5f8 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Volgende snit</translation>
 <translation id="4149994727733219643">Vereenvoudigde aansig vir webbladsye</translation>
 <translation id="4165986682804962316">Werfinstellings</translation>
+<translation id="4169549551965910670">Aan ’n USB-toestel gekoppel</translation>
 <translation id="4194328954146351878">Vra voor werwe toegelaat word om inligting op NFC-toestelle te sien en te verander (aanbeveel)</translation>
 <translation id="4200726100658658164">Maak ligginginstellings oop</translation>
 <translation id="4226663524361240545">Kennisgewings kan die toestel laat vibreer</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
index 57d275f..a12c1f9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">ቀጣይ ትራክ</translation>
 <translation id="4149994727733219643">ለድረ-ገጾች የተቃለለ እይታ</translation>
 <translation id="4165986682804962316">የጣቢያ ቅንብሮች</translation>
+<translation id="4169549551965910670">ከዩኤስቢ መሣሪያ ጋር ተገናኝቷል</translation>
 <translation id="4194328954146351878">ጣቢያዎች በኤንኤፍሲ መሣሪያዎች ላይ መረጃ እንዲያዩ እና እንዲቀይሩ ከመፈቀዱ በፊት ይጠይቅ (የሚመከር)</translation>
 <translation id="4200726100658658164">የአካባቢ ቅንብሮችን ክፈት</translation>
 <translation id="4226663524361240545">ማሳወቂያዎች መሣሪያውን እንዲነዝር ሊያደርጉት ይችላሉ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
index e96f9ee..da9f319 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Sljedeća pjesma</translation>
 <translation id="4149994727733219643">Pojednostavljeni prikaz za web lokacije</translation>
 <translation id="4165986682804962316">Postavke web-lokacije</translation>
+<translation id="4169549551965910670">Povezano s USB uređajem</translation>
 <translation id="4194328954146351878">Web lokacije moraju tražiti odobrenje za pregled i izmjenu informacija na NFC uređajima (preporučeno)</translation>
 <translation id="4200726100658658164">Otvaranje postavki lokacije</translation>
 <translation id="4226663524361240545">Obavještenja mogu aktivirati vibraciju uređaja</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
index aebb21c..9920c77 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Επόμενο κομμάτι</translation>
 <translation id="4149994727733219643">Απλοποιημένη προβολή για ιστοσελίδες</translation>
 <translation id="4165986682804962316">Ρυθμίσεις ιστότοπου</translation>
+<translation id="4169549551965910670">Συνδέθηκε σε συσκευή USB</translation>
 <translation id="4194328954146351878">Να γίνεται ερώτηση πριν επιτραπεί στους ιστοτόπους να βλέπουν και να αλλάζουν πληροφορίες σε συσκευές NFC (συνιστάται)</translation>
 <translation id="4200726100658658164">Άνοιγμα ρυθμίσεων τοποθεσίας</translation>
 <translation id="4226663524361240545">Κατά τη λήψη ειδοποιήσεων ενδέχεται να δονείται η συσκευή</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
index 26034ed..01faee8 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">આગલો ટ્રૅક</translation>
 <translation id="4149994727733219643">વેબપેજ માટે સરળ દૃશ્ય</translation>
 <translation id="4165986682804962316">સાઇટ સેટિંગ</translation>
+<translation id="4169549551965910670">કોઈ USB ડિવાઇસથી કનેક્ટેડ</translation>
 <translation id="4194328954146351878">NFC ડિવાઇસ પર સાઇટને માહિતી જોવાની અને બદલવાની મંજૂરી આપતા પહેલાં પૂછો (ભલામણ કરવામાં આવે છે)</translation>
 <translation id="4200726100658658164">સ્થાન સેટિંગ ખોલો</translation>
 <translation id="4226663524361240545">સૂચનાઓ ઉપકરણને વાઇબ્રેટ કરી શકે છે</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
index c59bf23..a79c0e0c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Sljedeća pjesma</translation>
 <translation id="4149994727733219643">Pojednostavljeni prikaz za web-stranice</translation>
 <translation id="4165986682804962316">Postavke web-lokacije</translation>
+<translation id="4169549551965910670">Povezano s USB uređajem</translation>
 <translation id="4194328954146351878">Pitaj prije omogućavanja web-lokacijama da vide i mijenjaju podatke na NFC uređajima (preporučeno)</translation>
 <translation id="4200726100658658164">Otvori postavke lokacije</translation>
 <translation id="4226663524361240545">Obavijesti mogu uključiti vibriranje uređaja</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
index f9025057..a24612a7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">次のトラック</translation>
 <translation id="4149994727733219643">ウェブページの簡易表示</translation>
 <translation id="4165986682804962316">サイトの設定</translation>
+<translation id="4169549551965910670">USB デバイスに接続されています</translation>
 <translation id="4194328954146351878">サイトが NFC デバイスの情報を参照および変更することを許可する前に確認する(推奨)</translation>
 <translation id="4200726100658658164">位置情報の設定を開く</translation>
 <translation id="4226663524361240545">通知を受け取るとデバイスが振動します</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
index f24c8ef..c2e31033 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
 <translation id="4149994727733219643">ವೆಬ್ ಪುಟಗಳಿಗಾಗಿ ಸರಳೀಕೃತ ವೀಕ್ಷಣೆ</translation>
 <translation id="4165986682804962316">ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
+<translation id="4169549551965910670">USB ಸಾಧನವೊಂದಕ್ಕೆ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4194328954146351878">NFC ಸಾಧನಗಳಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು ನೋಡಲು ಮತ್ತು ಬದಲಾಯಿಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="4200726100658658164">ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="4226663524361240545">ಪ್ರಕಟಣೆಗಳು ಸಾಧನವನ್ನು ವೈಬ್ರೇಟ್ ಮಾಡಬಹುದು</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
index 5730237b..8d538d7b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Дараагийн бичлэг</translation>
 <translation id="4149994727733219643">Веб хуудасны хялбаршуулсан харагдац</translation>
 <translation id="4165986682804962316">Сайтын тохиргоо</translation>
+<translation id="4169549551965910670">USB төхөөрөмжтэй холбогдлоо</translation>
 <translation id="4194328954146351878">Сайтуудыг NFC төхөөрөмжүүд дээрх мэдээллийг харах болон өөрчлөхийг зөвшөөрөхөөс өмнө асуух (зөвлөсөн)</translation>
 <translation id="4200726100658658164">Байршлын тохиргоог нээх</translation>
 <translation id="4226663524361240545">Мэдэгдэл ирэхэд төхөөрөмж чичрэнэ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
index 3b292498f..1aa1bd0d0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">पुढील ट्रॅक</translation>
 <translation id="4149994727733219643">वेब पेजसाठी सोपा केलेला व्ह्यू</translation>
 <translation id="4165986682804962316">साइट सेटिंग्ज</translation>
+<translation id="4169549551965910670">USB डिव्हाइसशी कनेक्ट केले आहे</translation>
 <translation id="4194328954146351878">साइटना NFC डिव्हाइसवरील माहिती पाहू देण्याची किंवा बदलण्याची अनुमती देण्यापूर्वी विचारा (शिफारस केलेले)</translation>
 <translation id="4200726100658658164">स्थान सेटिंग्ज उघडा</translation>
 <translation id="4226663524361240545">सूचनांमुळे डिव्हाइसचे कंपन होऊ शकते</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
index cd836267..5530107 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Neste spor</translation>
 <translation id="4149994727733219643">Forenklet visning av nettsider</translation>
 <translation id="4165986682804962316">Nettstedsinnstillinger</translation>
+<translation id="4169549551965910670">Koblet til en USB-enhet</translation>
 <translation id="4194328954146351878">Spør før nettsteder får lov til å se og endre informasjon på NFC-enheter (anbefales)</translation>
 <translation id="4200726100658658164">Åpne posisjonsinnstillingene</translation>
 <translation id="4226663524361240545">Varsler kan gjøre at enheten vibrerer</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
index 4f5582970..f9bdae7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">ପରବର୍ତ୍ତୀ ଟ୍ରାକ୍</translation>
 <translation id="4149994727733219643">ୱେବ୍ ପୃଷ୍ଠାଗୁଡ଼ିକ ପାଇଁ ସରଳୀକୃତ ଭ୍ୟୁ</translation>
 <translation id="4165986682804962316">ସାଇଟ୍‍ ସେଟିଂସ୍‌</translation>
+<translation id="4169549551965910670">ଏକ USB ଡିଭାଇସ ସହ କନେକ୍ଟ କରାଯାଇଛି</translation>
 <translation id="4194328954146351878">NFC ଡିଭାଇସଗୁଡ଼ିକରେ ସୂଚନା ଦେଖିବା ଏବଂ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକୁ ଅନୁମତି ଦେବା ପୂର୍ବରୁ ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
 <translation id="4200726100658658164">ଲୋକେସନ୍ ସେଟିଂସ୍ ଖୋଲନ୍ତୁ</translation>
 <translation id="4226663524361240545">ବିଜ୍ଞପ୍ତି ଡିଭାଇସ୍‍କୁ ଭାଇବ୍ରେଟ୍ କରିପାରେ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
index cbcf517..d0a5db3c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">Melodia următoare</translation>
 <translation id="4149994727733219643">Afișare simplificată pentru paginile web</translation>
 <translation id="4165986682804962316">Setări pentru site-uri</translation>
+<translation id="4169549551965910670">Conectat la un dispozitiv USB</translation>
 <translation id="4194328954146351878">Întreabă înainte de a permite site-urilor să vadă și să modifice informații de pe dispozitive NFC (recomandat)</translation>
 <translation id="4200726100658658164">Deschide setările privind locația</translation>
 <translation id="4226663524361240545">Notificările pot face dispozitivul să vibreze</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
index 14c9140..3c4756f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -128,6 +128,7 @@
 <translation id="4046123991198612571">แทร็กถัดไป</translation>
 <translation id="4149994727733219643">มุมมองอย่างง่ายสำหรับหน้าเว็บ</translation>
 <translation id="4165986682804962316">การตั้งค่าเว็บไซต์</translation>
+<translation id="4169549551965910670">เชื่อมต่ออยู่กับอุปกรณ์ USB</translation>
 <translation id="4194328954146351878">ถามก่อนที่จะอนุญาตให้เว็บไซต์ดูและเปลี่ยนแปลงข้อมูลในอุปกรณ์ NFC (แนะนำ)</translation>
 <translation id="4200726100658658164">เปิดการตั้งค่าตำแหน่ง</translation>
 <translation id="4226663524361240545">การแจ้งเตือนอาจทำให้อุปกรณ์สั่น</translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 9433719..61d9d0da 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "9.18",
-  "log_list_timestamp": "2022-05-20T12:54:44Z",
+  "version": "9.19",
+  "log_list_timestamp": "2022-05-21T12:55:19Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/constrained_window/constrained_window_views.cc b/components/constrained_window/constrained_window_views.cc
index 82df5a3..df70e533 100644
--- a/components/constrained_window/constrained_window_views.cc
+++ b/components/constrained_window/constrained_window_views.cc
@@ -267,4 +267,13 @@
       ->Show();
 }
 
+void ShowWebModal(std::unique_ptr<ui::DialogModel> dialog_model,
+                  content::WebContents* web_contents) {
+  constrained_window::ShowWebModalDialogViews(
+      views::BubbleDialogModelHost::CreateModal(std::move(dialog_model),
+                                                ui::MODAL_TYPE_CHILD)
+          .release(),
+      web_contents);
+}
+
 }  // namespace constrained_window
diff --git a/components/constrained_window/constrained_window_views.h b/components/constrained_window/constrained_window_views.h
index b3f1732e..c24827b 100644
--- a/components/constrained_window/constrained_window_views.h
+++ b/components/constrained_window/constrained_window_views.h
@@ -92,6 +92,10 @@
 void ShowBrowserModal(std::unique_ptr<ui::DialogModel> dialog_model,
                       gfx::NativeWindow parent);
 
+// Shows a web/tab-modal dialog based on `dialog_model`.
+void ShowWebModal(std::unique_ptr<ui::DialogModel> dialog_model,
+                  content::WebContents* web_contents);
+
 }  // namespace constrained_window
 
 #endif  // COMPONENTS_CONSTRAINED_WINDOW_CONSTRAINED_WINDOW_VIEWS_H_
diff --git a/components/reporting/proto/synced/interface.proto b/components/reporting/proto/synced/interface.proto
index b08f61e8..87892ad4 100644
--- a/components/reporting/proto/synced/interface.proto
+++ b/components/reporting/proto/synced/interface.proto
@@ -89,6 +89,12 @@
   // public values in the next response. It corresponds to the
   // "attachEncryptionSettings" field in the payload.
   optional bool need_encryption_keys = 2;
+
+  // The remaining storage capacity in bytes.
+  optional uint64_t remaining_storage_capacity = 3;
+
+  // The rate (bytes/sec) at which new events are added to the storage.
+  optional uint64_t new_events_rate = 4;
 }
 
 message UploadEncryptedRecordResponse {
diff --git a/components/services/storage/public/cpp/quota_error_or.h b/components/services/storage/public/cpp/quota_error_or.h
index 8908fbe6..cb7ba06 100644
--- a/components/services/storage/public/cpp/quota_error_or.h
+++ b/components/services/storage/public/cpp/quota_error_or.h
@@ -16,6 +16,7 @@
   kNotFound,
   kEntryExistsError,
   kFileOperationError,
+  kIllegalOperation,
 };
 
 // Helper for methods which perform database operations which may fail. Objects
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 3373608..ef39feec 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -2136,6 +2136,7 @@
 <translation id="6897140037006041989">User agent</translation>
 <translation id="6898699227549475383">Organisation (O)</translation>
 <translation id="6899000063526916106">Enter <ph name="NUMBER_OF_DIGITS" />-digit code</translation>
+<translation id="6903437476849497868">Opt out</translation>
 <translation id="6907293445143367439">Allow <ph name="SITE_NAME" /> to:</translation>
 <translation id="6907458757809079309">Fitness</translation>
 <translation id="6910240653697687763"><ph name="URL" /> wants to get full control of your MIDI devices</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index d3daa7cfb..08e36912 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -1272,7 +1272,7 @@
 <translation id="4441832193888514600">Ez ikusi egin zaio hodeiko erabiltzaile-gidalerro gisa soilik ezar daitekeelako gidalerroa.</translation>
 <translation id="4450893287417543264">Ez erakutsi berriro</translation>
 <translation id="4451135742916150903">HID gailuetara konektatzea eska dezake</translation>
-<translation id="4452328064229197696">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Kontuak babesteko, Google-ren Pasahitz-kudeatzailea eginbideak gordeta dauzkazun pasahitzak seguruak direla egiaztatzea gomendatzen du.</translation>
+<translation id="4452328064229197696">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Kontuak babesteko, Google-ren Pasahitz-kudeatzailea zerbitzuak gordeta dauzkazun pasahitzak seguruak direla egiaztatzea gomendatzen du.</translation>
 <translation id="4455222631300069614">Aldatu pasahitza</translation>
 <translation id="4460315069258617173">Baimenduta webgune honetako fitxak ixten dituzun arte</translation>
 <translation id="4464826014807964867">Zure erakundeari buruzko informazioa duten webguneak</translation>
@@ -1823,7 +1823,7 @@
 <translation id="5989320800837274978">Ez da zehaztu proxy-zerbitzari finkorik, ezta .pac scripteko URLrik ere.</translation>
 <translation id="5992691462791905444">Z-erako tolestura laburra</translation>
 <translation id="5995727681868049093">Kudeatu Google-ko kontuko informazioa, pribatutasuna eta segurtasuna</translation>
-<translation id="5997247540087773573">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Kontuak babesteko, Google-ren Pasahitz-kudeatzailea aplikazioak pasahitza orain aldatzea gomendatzen du, eta gordeta dauzkazun pasahitzak seguruak direla egiaztatzea.</translation>
+<translation id="5997247540087773573">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Kontuak babesteko, Google-ren Pasahitz-kudeatzailea zerbitzuak pasahitza orain aldatzea gomendatzen du, eta gordeta dauzkazun pasahitzak seguruak direla egiaztatzea.</translation>
 <translation id="6000758707621254961">"<ph name="SEARCH_TEXT" />" bilaketak <ph name="RESULT_COUNT" /> emaitza ditu</translation>
 <translation id="6006484371116297560">Klasikoa</translation>
 <translation id="6008122969617370890">N-tik 1erako ordena</translation>
@@ -1854,7 +1854,7 @@
 <translation id="6051221802930200923">Une honetan ezin zara joan <ph name="SITE" /> webgunera, ziurtagiri-ainguratzea baitarabil. Sareko erroreak eta erasoak aldi baterakoak izan ohi dira; beraz, geroago funtzionatuko du orriak, segur aski.</translation>
 <translation id="6051898664905071243">Orri kopurua:</translation>
 <translation id="6052284303005792909">•</translation>
-<translation id="6052319569711353666">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Google-ren Pasahitz-kudeatzailea eginbideak pasahitza orain aldatzea gomendatzen du.</translation>
+<translation id="6052319569711353666">Erabili berri duzun pasahitza datuen isilpekotasunaren urratze batean aurkitu da. Google-ren Pasahitz-kudeatzailea zerbitzuak pasahitza orain aldatzea gomendatzen du.</translation>
 <translation id="6055888660316801977">Ordainketak egiteko kredentzial segurua bat ez datorrela dioen kredentzial-orria</translation>
 <translation id="6058977677006700226">Gailu guztietan erabili nahi dituzu txartelak?</translation>
 <translation id="6059925163896151826">USB bidezko ailuak</translation>
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index a07be30a..dc30ed6 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -908,21 +908,11 @@
 
 }  // namespace
 
-
 ////////////////////////////////////////////////////////////////////////////////
 //
 // GpuInternalsUI
 //
 ////////////////////////////////////////////////////////////////////////////////
-
-GpuInternalsUIConfig::GpuInternalsUIConfig()
-    : WebUIConfig(kChromeUIScheme, kChromeUIGpuHost) {}
-
-std::unique_ptr<WebUIController> GpuInternalsUIConfig::CreateWebUIController(
-    WebUI* web_ui) {
-  return std::make_unique<GpuInternalsUI>(web_ui);
-}
-
 GpuInternalsUI::GpuInternalsUI(WebUI* web_ui)
     : WebUIController(web_ui) {
   web_ui->AddMessageHandler(std::make_unique<GpuMessageHandler>());
diff --git a/content/browser/gpu/gpu_internals_ui.h b/content/browser/gpu/gpu_internals_ui.h
index 625fb70c..b1039f7 100644
--- a/content/browser/gpu/gpu_internals_ui.h
+++ b/content/browser/gpu/gpu_internals_ui.h
@@ -8,16 +8,16 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/web_ui_controller.h"
 #include "content/public/browser/webui_config.h"
+#include "content/public/common/url_constants.h"
 
 namespace content {
 
-class GpuInternalsUIConfig : public WebUIConfig {
- public:
-  GpuInternalsUIConfig();
+class GpuInternalsUI;
 
-  // WebUIConfig
-  std::unique_ptr<WebUIController> CreateWebUIController(
-      WebUI* web_ui) override;
+class GpuInternalsUIConfig : public DefaultWebUIConfig<GpuInternalsUI> {
+ public:
+  GpuInternalsUIConfig()
+      : DefaultWebUIConfig(kChromeUIScheme, kChromeUIGpuHost) {}
 };
 
 class GpuInternalsUI : public WebUIController {
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index ae6a7c0..d379a1b 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -118,7 +118,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
   }
 
   bool MaybeCreateLoaderForResponse(
diff --git a/content/public/browser/webui_config.h b/content/public/browser/webui_config.h
index ad8484cbe..6a9341c 100644
--- a/content/public/browser/webui_config.h
+++ b/content/public/browser/webui_config.h
@@ -64,6 +64,22 @@
   const std::string host_;
 };
 
+// Templated class with an implementation for CreateWebUIController. Prefer
+// to use this over WebUIConfig if the WebUIController can be created with
+// a single WebUI argument.
+template <typename T>
+class CONTENT_EXPORT DefaultWebUIConfig : public WebUIConfig {
+ public:
+  explicit DefaultWebUIConfig(base::StringPiece scheme, base::StringPiece host)
+      : WebUIConfig(scheme, host) {}
+  ~DefaultWebUIConfig() override = default;
+
+  std::unique_ptr<WebUIController> CreateWebUIController(
+      WebUI* web_ui) override {
+    return std::make_unique<T>(web_ui);
+  }
+};
+
 }  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_WEBUI_CONFIG_H_
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
index 6205ed6..3017c55 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
+++ b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
@@ -1,3 +1,3 @@
 # AUTOGENERATED FILE - DO NOT EDIT
 # SEE roll_webgl_conformance.py
-Current webgl revision d4d598789af1e73a1bdd6c9eec246e75ff43551a
+Current webgl revision bb289ce3cb15bbabd42fdcb01439367846d9069d
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
index 5cbc6c2c..96ed859 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
@@ -48,7 +48,7 @@
 <translation id="3639997914391704523">Saioa Google-ko kontu batekin hasten baduzu, Chromium-ek pasahitzak egiazta ditzake.</translation>
 <translation id="3650632991272923014"><ph name="USER_EMAIL1" /> Chromium-en erabiltzailea zenez, laster-markak, pasahitzak eta beste ezarpena batzuk utzi ditu gailuan.</translation>
 <translation id="3805899903892079518">Chromium-ek ez du argazki eta bideoetarako sarbiderik. Gaitu sarbidea iOS sistemako Settings &gt; Privacy &gt; Photos atalean.</translation>
-<translation id="4043291146360695975">Pasahitzak gailu honetan soilik gordetzen dira Pasahitz-kudeatzailea atalean.</translation>
+<translation id="4043291146360695975">Pasahitzak gailu honetan soilik gordetzen dira Pasahitz-kudeatzailea zerbitzuan.</translation>
 <translation id="4099085513035183040">Ez da bateragarria Chromium Beta-rekin</translation>
 <translation id="4432744876818348753">Hasi saioa Chromium-i etekinik handiena ateratzeko.</translation>
 <translation id="4555020257205549924">Eginbide hau aktibatuta dagoenean, Chromium-ek beste hizkuntzetan idatzita dauden orriak Google Translate bidez itzultzea proposatuko dizu. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation>
@@ -86,7 +86,7 @@
 <translation id="6625409903340039086">Orain, Chromium-ek kontu kudeaturako erabiltzaile-gidalerroak onartzen ditu</translation>
 <translation id="6752854822223394465">Zure erakundea Chromium konfiguratzen ari da…</translation>
 <translation id="6820823224820483452">Chromium-ek ezin izan ditu egiaztatu pasahitz guztiak. Saiatu berriro bihar.</translation>
-<translation id="7006920032187763988">iPad-eko beste aplikazio batzuk erabiltzen ari zinela Pasahitz-kudeatzailea atalean gorde zenituen pasahitzak erabil ditzakezu.</translation>
+<translation id="7006920032187763988">iPad-eko beste aplikazio batzuk erabiltzen ari zinela Pasahitz-kudeatzailea zerbitzuan gorde zenituen pasahitzak erabil ditzakezu.</translation>
 <translation id="7018284295775193585">Ezin da eguneratu Chromium</translation>
 <translation id="7045244423563602563">Pertsonalizatu Chromium</translation>
 <translation id="7099326575020694068">Chromium-ek ezin du erabili kamera Ikuspegi zatitua moduan</translation>
@@ -99,7 +99,7 @@
 <translation id="7313655110045230863">Chromium arakatzaile lehenetsi gisa ezartzeko, ireki Ezarpenak. Sakatu Arakatzaile lehenetsia eta, gero, hautatu Chromium.</translation>
 <translation id="7337881442233988129">Chromium</translation>
 <translation id="7357211569052832586">Kendu dira hautatutako datuak Chromium-etik eta sinkronizatutako gailuetatik. Baliteke Google-ko kontuak arakatze-historiako bestelako datu batzuk (adibidez, bilaketak eta Google-ren beste zerbitzu batzuetako jarduerak) edukitzea history.google.com webgunean.</translation>
-<translation id="7395825497086981028"><ph name="EMAIL" /> kontuko pasahitza Pasahitz-kudeatzailea atalean gordeko da.</translation>
+<translation id="7395825497086981028"><ph name="EMAIL" /> kontuko pasahitza Pasahitz-kudeatzailea zerbitzuan gordeko da.</translation>
 <translation id="7400689562045506105">Erabili Chromium edonon</translation>
 <translation id="766897673682622022">Pasahitza arriskuan jarri da, datuen isilpekotasuna urratu delako. Pasahitza berehala aldatzea gomendatzen du Chromium-ek.</translation>
 <translation id="7674213385180944843">Ireki Ezarpenak &gt; Pribatutasuna &gt; Kamera &gt; Chromium, eta aktibatu kamera.</translation>
@@ -115,7 +115,7 @@
 <translation id="8073677936375100957">Gailu honetan dituzun Chromium-eko datuak garbitu nahi dituzu?</translation>
 <translation id="8175055321229419309">Aholkua: <ph name="BEGIN_LINK" />ainguratu Chromium dock-ean<ph name="END_LINK" /></translation>
 <translation id="8240981428553046115">Chromium-ek ezin izan ditu bilatu eguneratzeak. Saiatu berriro geroago.</translation>
-<translation id="858114650497379505">iPhone-ko beste aplikazio batzuk erabiltzen ari zinela Pasahitz-kudeatzailea atalean gorde zenituen pasahitzak erabil ditzakezu.</translation>
+<translation id="858114650497379505">iPhone-ko beste aplikazio batzuk erabiltzen ari zinela Pasahitz-kudeatzailea zerbitzuan gorde zenituen pasahitzak erabil ditzakezu.</translation>
 <translation id="8586442755830160949">Copyright <ph name="YEAR" /> Chromium-en egileak. Eskubide guztiak erreserbatuta.</translation>
 <translation id="865600487977764604">Babestuta mantentzen zaitu Chromium-en, eta segurtasuna areagotzeko erabil daiteke Google-ren beste aplikazio batzuetan saioa hasita daukazunean.</translation>
 <translation id="8663480472502753423">Mantendu Chromium eguneratuta</translation>
@@ -129,7 +129,7 @@
 <translation id="8776843108004031667">Kontu hau eta gorde gabeko datuak kendu egingo dira Chromium-etik.</translation>
 <translation id="894437814105052438">Saioa amaitzen duzunean, Chromium-ek ez du datu berririk sinkronizatuko Google-ko kontuarekin. Lehendik sinkronizatuta dauden datuak kontuan geratuko dira.</translation>
 <translation id="9022552996538154597">Hasi saioa Chromium-en</translation>
-<translation id="9059693977935746710">Ez duzu pasahitza gogoratu beharko. <ph name="EMAIL" /> kontuko Pasahitz-kudeatzailea atalean gordeko da.</translation>
+<translation id="9059693977935746710">Ez duzu pasahitza gogoratu beharko. <ph name="EMAIL" /> kontuko Pasahitz-kudeatzailea zerbitzuan gordeko da.</translation>
 <translation id="9089354809943900324">Chromium zaharkituta dago</translation>
 <translation id="9110075932708282655">Erabili Chromium modu lehenetsian</translation>
 <translation id="921174536258924340">Chromium-ek ezin izan ditu egiaztatu pasahitz guztiak. Saiatu berriro bihar edo <ph name="BEGIN_LINK" />egiaztatu pasahitzak Google-ko kontuan<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
index 2e6750d..cf6e13de 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_eu.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="eu">
-<translation id="1143896152279775643"><ph name="EMAIL" /> kontuko pasahitza Google-ren Pasahitz-kudeatzailea atalean gordeko da.</translation>
+<translation id="1143896152279775643"><ph name="EMAIL" /> kontuko pasahitza Google-ren Pasahitz-kudeatzailea zerbitzuan gordeko da.</translation>
 <translation id="1282031177488366470">Lagundu Chrome-ren eginbideak eta funtzionamendua hobetzen</translation>
 <translation id="1462727070346936664">Hasi saioa Chrome-ri etekinik handiena ateratzeko.</translation>
 <translation id="1479202195792305274">Saioa Google-ko kontu batekin hasten baduzu, Chrome-k pasahitzak egiazta ditzake.</translation>
@@ -27,7 +27,7 @@
 <translation id="2574249610672786438">Chrome erabiltzen duzun gailu guztietan zure fitxak eskura izateko, hasi saioa gailu guztietan</translation>
 <translation id="2576431527583832481">Chrome hobetu egin dugu! Bertsio berria duzu erabilgarri.</translation>
 <translation id="257708665678654955">Webgune honetara zatozen hurrengo aldian Google Chrome-k <ph name="LANGUAGE_NAME" /> hizkuntzan dauden orriak itzultzea eskaintzea nahi duzu?</translation>
-<translation id="2671426118752779020">iPhone-ko beste aplikazio batzuk erabiltzen ari zinela Google-ren Pasahitz-kudeatzailea atalean gorde zenituen pasahitzak erabil ditzakezu.</translation>
+<translation id="2671426118752779020">iPhone-ko beste aplikazio batzuk erabiltzen ari zinela Google-ren Pasahitz-kudeatzailea zerbitzuan gorde zenituen pasahitzak erabil ditzakezu.</translation>
 <translation id="2695886661449553974">Chrome-k ezin izan ditu bilatu eguneratzeak. Saiatu berriro geroago.</translation>
 <translation id="2732745070297234559">Chrome-k ezin izan ditu egiaztatu pasahitz guztiak. Saiatu berriro bihar.</translation>
 <translation id="2869959624320573933">Hasi saioa Chrome-n</translation>
@@ -78,14 +78,14 @@
 <translation id="6063091872902370735">Eman Chrome-n saioa hasteko baimena</translation>
 <translation id="6181930887571472871">Aldatu Chrome-ra</translation>
 <translation id="6238746320622508509">Utzi Chrome-ri ezkutuko moduko fitxak blokeatzen.</translation>
-<translation id="6387994324662817823">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation>
+<translation id="6387994324662817823">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan.</translation>
 <translation id="6412673304250309937">URLak Chrome-n gordetako webgune ez-seguruen zerrendan dauden ala ez egiaztatzen du. Webguneren bat pasahitza lapurtzen saiatzen bada, edo fitxategi kaltegarriren bat deskargatzen baduzu, baliteke Chrome-k URLak ere bidaltzea (orriko edukiaren zati batzuk barne) Arakatze segurua eginbideari.</translation>
 <translation id="6427126399757991875">Zure erakundea Chrome konfiguratzen ari da…</translation>
 <translation id="6600954340915313787">Chrome-n kopiatu da</translation>
 <translation id="6634107063912726160">Saioa amaitzen duzunean, Chrome-k ez du datu berririk sinkronizatuko Google-ko kontuarekin. Lehendik sinkronizatuta dauden datuak kontuan geratuko dira.</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> domeinuak kudeatutako kontu batekin hasi duzu saioa eta Chrome datuen kontrola administratzaileari eman diozu. Datuak betiko lotuko dira kontu honekin. Saioa amaitzen baduzu Chrome-ko datuak ezabatu egingo dira gailutik, baina Google-ko kontuan izango dituzu gordeta.</translation>
 <translation id="6676840375528380067">Gailu honetan dituzun Chrome-ko datuak garbitu nahi dituzu?</translation>
-<translation id="6709398533399187136">Pasahitza arriskuan jarri da, datuen isilpekotasuna urratu delako. Google-ren Pasahitz-kudeatzailea eginbideak hura orain aldatzea gomendatzen du.</translation>
+<translation id="6709398533399187136">Pasahitza arriskuan jarri da, datuen isilpekotasuna urratu delako. Google-ren Pasahitz-kudeatzailea zerbitzuak hura orain aldatzea gomendatzen du.</translation>
 <translation id="6822673484890854830">Chrome-k ezin izan ditu egiaztatu pasahitz guztiak. Saiatu berriro geroago.</translation>
 <translation id="6964931465519938134">Orain, mezuetan, dokumentuetan eta aplikazioetan estekak sakatzen dituzunean, Chrome erabili ahalko duzu.</translation>
 <translation id="7059914902409643750">Pertsonalizatu Chrome</translation>
@@ -95,7 +95,7 @@
 <translation id="7172660552945675509">Aholkua: <ph name="BEGIN_LINK" />ainguratu Chrome dock-ean<ph name="END_LINK" /></translation>
 <translation id="7173660919484573146">Chrome-k aurpegi bidezko identifikazioa erabiltzen du pasahitzak baimena dutenek bakarrik atzitzen dituztela ziurtatzeko.</translation>
 <translation id="7187993566681480880">Babestuta mantentzen zaitu Chrome-n, eta segurtasuna hobetzeko erabil daiteke Google-ren beste aplikazio batzuetan saioa hasita daukazunean.</translation>
-<translation id="72119412072970160">iPad-eko beste aplikazio batzuk erabiltzen ari zinela Google-ren Pasahitz-kudeatzailea atalean gorde zenituen pasahitzak erabil ditzakezu.</translation>
+<translation id="72119412072970160">iPad-eko beste aplikazio batzuk erabiltzen ari zinela Google-ren Pasahitz-kudeatzailea zerbitzuan gorde zenituen pasahitzak erabil ditzakezu.</translation>
 <translation id="7261678641327190792">Chrome-k ezin ditu egiaztatu pasahitzak</translation>
 <translation id="7272930098487145294">Irudiak gordetzeko, sakatu Ezarpenak eta eman argazkiak gehitzeko baimena Chrome-ri</translation>
 <translation id="7275945473750112644">Kontua <ph name="HOSTED_DOMAIN" /> domeinuak kudeatzen duenez, Chrome-ko datuak garbitu egingo dira gailu honetatik</translation>
@@ -125,7 +125,7 @@
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8736550665979974340">Egon babestuta Google Chrome-rekin</translation>
 <translation id="8772179140489533211">Chrome-n saioa hasteko onarpen-mezuak erakusten ditu.</translation>
-<translation id="8788269841521769222">Ez duzu pasahitza gogoratu beharko. <ph name="EMAIL" /> kontuko Google-ren Pasahitz-kudeatzailea atalean gordeko da.</translation>
+<translation id="8788269841521769222">Ez duzu pasahitza gogoratu beharko. <ph name="EMAIL" /> kontuko Google-ren Pasahitz-kudeatzailea zerbitzuan gordeko da.</translation>
 <translation id="8969290730818637510">Aktibatuta dagoenean:
 <ph name="BEGIN_INDENT" />  • Chrome zuk bezala erabiltzen dutenentzat hobetzen laguntzen duzu.<ph name="END_INDENT" />
 
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index bd0cbf4cc..4d17202 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -151,7 +151,7 @@
 <translation id="2271351792809375263">Erabili Chrome-n gordetako pasahitzak gailuko beste aplikazio batzuetan</translation>
 <translation id="2273327106802955778">"Gehiago" menua</translation>
 <translation id="2286505070150039482">Nabarmendutako testua</translation>
-<translation id="2299218006564889602">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea atalean gorde aurretik.</translation>
+<translation id="2299218006564889602">Pasahitzak gailuan bertan enkriptatzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik.</translation>
 <translation id="2302742851632557585">Aldatu pasahitza webgunean</translation>
 <translation id="2316709634732130529">Erabili iradokitako pasahitza</translation>
 <translation id="2320166752086256636">Ezkutatu teklatua</translation>
@@ -701,7 +701,7 @@
 <translation id="6801927553864092214">Sarea modu pribatuan arakatzeko, ireki ezkutuko moduko fitxa bat</translation>
 <translation id="6807889908376551050">Erakutsi guztiak…</translation>
 <translation id="681368974849482173">Elementua sortu da</translation>
-<translation id="683022620450280906">Gordetako pasahitzak edozein gailutan erabil ditzakezu. <ph name="EMAIL" /> kontuko Google-ren Pasahitz-kudeatzailea atalean dauzkazu gordeta.</translation>
+<translation id="683022620450280906">Gordetako pasahitzak edozein gailutan erabil ditzakezu. <ph name="EMAIL" /> kontuko Google-ren Pasahitz-kudeatzailea zerbitzuan dauzkazu gordeta.</translation>
 <translation id="6831043979455480757">Itzuli</translation>
 <translation id="6842136130964845393">Gordetako pasahitzak edonoiz atzitu ahal izango dituzula ziurtatzeko, egiaztatu zeu zarela</translation>
 <translation id="6851516051005285358">Eskatu ordenagailuetarako webgunea</translation>
@@ -831,7 +831,7 @@
 <translation id="797413074872316787">Gailu guztiak sinkronizatu eta pertsonalizatzeko, aktibatu sinkronizazioa.</translation>
 <translation id="7978018860671536736">3. Sakatu AutoFill Passwords (pasahitzak automatikoki betetzeko aukera).</translation>
 <translation id="7982789257301363584">Sarea</translation>
-<translation id="7987685713885608670">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea atalean gorde aurretik.</translation>
+<translation id="7987685713885608670">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik.</translation>
 <translation id="7993619969781047893">Baliteke webgune batzuetako eginbideek ez funtzionatzea</translation>
 <translation id="800361585186029508">Idatzitako URLak Google Chrome-n irekitzen ditu.</translation>
 <translation id="802154636333426148">Ezin izan da deskargatu</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
index 1ae0804..de0eedf 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
@@ -11,14 +11,14 @@
 <translation id="1977167321677356409">Pasahitza</translation>
 <translation id="2211969839027957773">Google-ren Pasahitz-kudeatzailea</translation>
 <translation id="2320166752086256636">Ezkutatu teklatua</translation>
-<translation id="2489483078139081050">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. Gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation>
+<translation id="2489483078139081050">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. Gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan.</translation>
 <translation id="2677128368066534822">Pasahitzak bizkorrago eskuratzeko, desautatu iCloud keychain</translation>
 <translation id="2712586044587587728">Chrome-ko zure pasahitzak beste aplikazio batzuetan erabili ahal izango dituzu. Aukera hori desaktibatzeko, joan Ezarpenak aplikaziora.</translation>
 <translation id="2747003861858887689">Aurreko eremua</translation>
 <translation id="3280734926621805458">Erabili</translation>
 <translation id="3580107423202590938">Ez dago pasahitzik Chrome-n</translation>
 <translation id="368844171100841558">Ordeztu</translation>
-<translation id="3739920431472254679">Google-ren Pasahitz-kudeatzailea atalean gordetzen dira pasahitzak, eta edozein gailutan erabil ditzakezu.</translation>
+<translation id="3739920431472254679">Google-ren Pasahitz-kudeatzailea zerbitzuan gordetzen dira pasahitzak, eta edozein gailutan erabil ditzakezu.</translation>
 <translation id="3753678329684433031">Bete automatikoki Chrome-n gordetako pasahitzarekin</translation>
 <translation id="3789385946721385622">Erabiltzaile-izena</translation>
 <translation id="3830647155781949426">Chrome-ra itzultzen zarenean, pasahitza Google-ren Pasahitz-kudeatzailean gordeko da (<ph name="EMAIL" />).</translation>
@@ -28,10 +28,10 @@
 <translation id="5118084770294029567">Pasahitz guztiak</translation>
 <translation id="5148402015874782921">Utzi</translation>
 <translation id="5824290706342306555">Hasteko, gorde zenbait pasahitz Chrome-n edo hasi saioa Google-ko kontuarekin.</translation>
-<translation id="6002340317268558779">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. <ph name="EMAIL" /> kontuan saioa hasita zeneukala gorde dituzunak Google-ren Pasahitz-kudeatzailea atalean gordetzen dira.</translation>
+<translation id="6002340317268558779">Gordetako pasahitzak gailuko beste aplikazio batzuetan erabil ditzakezu. <ph name="EMAIL" /> kontuan saioa hasita zeneukala gorde dituzunak Google-ren Pasahitz-kudeatzailea zerbitzuan gordetzen dira.</translation>
 <translation id="6159839020698489198">aukerakoa</translation>
 <translation id="6216401132953873625">Gehitu beste pasahitz bat</translation>
-<translation id="6387994324662817823">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation>
+<translation id="6387994324662817823">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan.</translation>
 <translation id="6539092367496845964">Arazo bat izan da. Saiatu berriro geroago.</translation>
 <translation id="6657585470893396449">Pasahitza</translation>
 <translation id="666236282349601348">Betetze automatikoa aktibatuta dago</translation>
@@ -56,5 +56,5 @@
 <translation id="8730621377337864115">Eginda</translation>
 <translation id="8877181643142698531">URLa</translation>
 <translation id="9069288651897538648">Webgunea: <ph name="URL" /></translation>
-<translation id="9168839987494597225">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea atalean.</translation>
+<translation id="9168839987494597225">Pasahitzak gailu honetan soilik gordetzen dira Google-ren Pasahitz-kudeatzailea zerbitzuan.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
index c64aaae..5d56c09 100644
--- a/media/gpu/vaapi/vaapi_wrapper.cc
+++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -3317,15 +3317,15 @@
   {
     TRACE_EVENT0("media,gpu",
                  "VaapiWrapper::SubmitBuffer_Locked_vaCreateBuffer");
-    const VAStatus va_res =
-        vaCreateBuffer(va_display_, va_context_id_, va_buffer.type,
-                       va_buffer_size, 1, nullptr, &buffer_id);
+    // The type of |data| in vaCreateBuffer() is void*, though a driver must not
+    // change the |data| buffer. We execute const_cast to limit the type
+    // mismatch. https://github.com/intel/libva/issues/597
+    const VAStatus va_res = vaCreateBuffer(
+        va_display_, va_context_id_, va_buffer.type, va_buffer_size, 1,
+        const_cast<void*>(va_buffer.data), &buffer_id);
     VA_SUCCESS_OR_RETURN(va_res, VaapiFunctions::kVACreateBuffer, false);
   }
 
-  if (!MapAndCopy_Locked(buffer_id, va_buffer))
-    return false;
-
   pending_va_buffers_.push_back(buffer_id);
   pending_buffers_destroyer_on_failure.ReplaceClosure(base::DoNothing());
   return true;
diff --git a/net/base/load_flags_list.h b/net/base/load_flags_list.h
index 96d1a51..6466deac 100644
--- a/net/base/load_flags_list.h
+++ b/net/base/load_flags_list.h
@@ -101,3 +101,12 @@
 // is considered privileged, and therefore this flag must only be set from a
 // trusted process.
 LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH, 1 << 16)
+
+// True if the request should attempt to use the single-keyed cache to satisfy
+// the request. The single-keyed cache will only be used if the "unusable" flag
+// on the cache entry is not true. Otherwise it will fall back to the
+// partitioned cache. This flag also enables checksumming of the response to set
+// the "unusable" flag if necessary.
+//
+// Cannot be used together with BYPASS_CACHE, ONLY_FROM_CACHE, or DISABLE_CACHE.
+LOAD_FLAG(USE_SINGLE_KEYED_CACHE, 1 << 17)
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index ff26f81f..6a84a403 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -67,6 +67,8 @@
 const char HttpCache::kDoubleKeyPrefix[] = "_dk_";
 const char HttpCache::kDoubleKeySeparator[] = " ";
 const char HttpCache::kSubframeDocumentResourcePrefix[] = "s_";
+const char HttpCache::kSingleKeyPrefix[] = "_sk_";
+const char HttpCache::kSingleKeySeparator[] = " ";
 
 HttpCache::DefaultBackend::DefaultBackend(
     CacheType type,
@@ -366,7 +368,8 @@
       request_info.load_flags |= ~LOAD_DO_NOT_SAVE_COOKIES;
   }
 
-  std::string key = GenerateCacheKey(&request_info);
+  std::string key =
+      GenerateCacheKey(&request_info, /*use_single_keyed_cache=*/false);
   disk_cache_->OnExternalCacheHit(key);
 }
 
@@ -438,6 +441,11 @@
     DCHECK_NE(pos, std::string::npos);
     pos += strlen(kDoubleKeySeparator);
     DCHECK_LE(pos, key.size() - 1);
+  } else if (pos == key.find(kSingleKeyPrefix, pos)) {
+    pos = key.rfind(kSingleKeySeparator);
+    DCHECK_NE(pos, std::string::npos);
+    pos += strlen(kSingleKeySeparator);
+    DCHECK_LE(pos, key.size() - 1);
   }
   return key.substr(pos);
 }
@@ -457,7 +465,10 @@
   request_info.network_isolation_key = network_isolation_key;
   request_info.is_subframe_document_resource = is_subframe;
 
-  std::string key = GenerateCacheKey(&request_info);
+  // TODO(https://crbug.com/1325315): Support looking in the single-keyed cache
+  // for the resource.
+  std::string key =
+      GenerateCacheKey(&request_info, /*use_single_keyed_cache=*/false);
   disk_cache::EntryResult entry_result = disk_cache_->OpenEntry(
       key, net::IDLE,
       base::BindOnce(&HttpCache::ResourceExistenceCheckCallback, GetWeakPtr(),
@@ -471,7 +482,7 @@
 
 // static
 std::string HttpCache::GenerateCacheKeyForTest(const HttpRequestInfo* request) {
-  return GenerateCacheKey(request);
+  return GenerateCacheKey(request, /*use_single_keyed_cache=*/false);
 }
 
 // static
@@ -571,18 +582,35 @@
 
 // static
 // Generate a key that can be used inside the cache.
-std::string HttpCache::GenerateCacheKey(const HttpRequestInfo* request) {
-  const char credential_key = (base::FeatureList::IsEnabled(
-                                   features::kSplitCacheByIncludeCredentials) &&
-                               (request->load_flags & LOAD_DO_NOT_SAVE_COOKIES))
-                                  ? '0'
-                                  : '1';
+std::string HttpCache::GenerateCacheKey(const HttpRequestInfo* request,
+                                        bool use_single_keyed_cache) {
+  // The first character of the key may vary depending on whether or not sending
+  // credentials is permitted for this request. This only happens if the
+  // SplitCacheByIncludeCredentials feature is enabled, or if the single-keyed
+  // cache is enabled. The single-keyed cache must always be split by
+  // credentials in order to make coep:credentialless work safely.
+  const char credential_key =
+      ((base::FeatureList::IsEnabled(
+            features::kSplitCacheByIncludeCredentials) ||
+        use_single_keyed_cache) &&
+       (request->load_flags & LOAD_DO_NOT_SAVE_COOKIES))
+          ? '0'
+          : '1';
 
   const int64_t post_key = request->upload_data_stream
                                ? request->upload_data_stream->identifier()
                                : int64_t(0);
   std::string isolation_key;
-  if (IsSplitCacheEnabled()) {
+  if (use_single_keyed_cache) {
+    DCHECK(IsSplitCacheEnabled());
+    DCHECK(!request->checksum.empty());
+    DCHECK(!(request->load_flags &
+             (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE |
+              net::LOAD_SKIP_CACHE_VALIDATION | net::LOAD_ONLY_FROM_CACHE |
+              net::LOAD_DISABLE_CACHE | net::LOAD_SKIP_VARY_CHECK)));
+    isolation_key = base::StrCat(
+        {kSingleKeyPrefix, request->checksum, kSingleKeySeparator});
+  } else if (IsSplitCacheEnabled()) {
     // Prepend the key with |kDoubleKeyPrefix| = "_dk_" to mark it as
     // double-keyed (and makes it an invalid url so that it doesn't get
     // confused with a single-keyed entry). Separate the origin and url
@@ -679,7 +707,11 @@
   temp_info.method = "GET";
   temp_info.network_isolation_key = isolation_key;
   temp_info.is_subframe_document_resource = is_subframe_document_resource;
-  std::string key = GenerateCacheKey(&temp_info);
+  // This method is always used for "POST" requests, which never use the
+  // single-keyed cache, so therefore it is correct that use_single_keyed_cache
+  // be false.
+  std::string key =
+      GenerateCacheKey(&temp_info, /*use_single_keyed_cache=*/false);
 
   // Defer to DoomEntry if there is an active entry, otherwise call
   // AsyncDoomEntry without triggering a callback.
diff --git a/net/http/http_cache.h b/net/http/http_cache.h
index 48b4795..da330fe42 100644
--- a/net/http/http_cache.h
+++ b/net/http/http_cache.h
@@ -420,7 +420,8 @@
   int GetBackendForTransaction(Transaction* transaction);
 
   // Generates the cache key for this request.
-  static std::string GenerateCacheKey(const HttpRequestInfo*);
+  static std::string GenerateCacheKey(const HttpRequestInfo*,
+                                      bool use_single_keyed_cache);
 
   // Dooms the entry selected by |key|, if it is currently in the list of active
   // entries.
@@ -645,6 +646,10 @@
   static const char kDoubleKeySeparator[];
   static const char kSubframeDocumentResourcePrefix[];
 
+  // Used for single-keyed entries if the cache is split.
+  static const char kSingleKeyPrefix[];
+  static const char kSingleKeySeparator[];
+
   // Variables ----------------------------------------------------------------
 
   raw_ptr<NetLog> net_log_;
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 8ac72b5..56379bb 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -19,6 +19,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/compiler_specific.h"
+#include "base/containers/fixed_flat_set.h"
 #include "base/cxx17_backports.h"
 #include "base/format_macros.h"
 #include "base/location.h"
@@ -34,6 +35,8 @@
 #include "base/trace_event/common/trace_event_common.h"
 #include "base/trace_event/trace_event.h"
 #include "base/values.h"
+#include "crypto/secure_hash.h"
+#include "crypto/sha2.h"
 #include "net/base/auth.h"
 #include "net/base/cache_metrics.h"
 #include "net/base/features.h"
@@ -656,6 +659,20 @@
   }
 }
 
+bool HttpCache::Transaction::ResponseChecksumMatches(
+    std::unique_ptr<crypto::SecureHash> checksum) const {
+  DCHECK(checksum);
+  uint8_t result[crypto::kSHA256Length];
+  checksum->Finish(result, crypto::kSHA256Length);
+  const std::string hex_result = base::HexEncode(result);
+  if (hex_result != request_->checksum) {
+    DVLOG(2) << "Pervasive payload checksum mismatch for \"" << request_->url
+             << "\": got " << hex_result << ", expected " << request_->checksum;
+    return false;
+  }
+  return true;
+}
+
 //-----------------------------------------------------------------------------
 
 // A few common patterns: (Foo* means Foo -> FooComplete)
@@ -970,6 +987,13 @@
       case STATE_NETWORK_READ_COMPLETE:
         rv = DoNetworkReadComplete(rv);
         break;
+      case STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE:
+        DCHECK_EQ(0, rv);  // Here "rv" is a count of bytes.
+        rv = DoMarkSingleKeyedCacheEntryUnusable();
+        break;
+      case STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE:
+        rv = DoMarkSingleKeyedCacheEntryUnusableComplete(rv);
+        break;
       default:
         NOTREACHED() << "bad state " << state;
         rv = ERR_FAILED;
@@ -1010,7 +1034,12 @@
   mode_ = NONE;
 
   if (!ShouldPassThrough()) {
-    cache_key_ = cache_->GenerateCacheKey(request_);
+    // The flag LOAD_USE_SINGLE_KEYED_CACHE will have been changed to false if
+    // the entry was marked unusable and the transaction was restarted in
+    //  DoCacheReadResponseComplete(), so it will no longer match the value in
+    //  `request_`. So we pass it through explicitly.
+    cache_key_ = cache_->GenerateCacheKey(
+        request_, effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
 
     // Requested cache access mode.
     if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) {
@@ -1498,6 +1527,22 @@
     return OnCacheReadError(result, true);
   }
 
+  if (response_.single_keyed_cache_entry_unusable) {
+    // We've read the single keyed entry and it turned out to be unusable. Let's
+    // retry reading from the split cache.
+    if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+      DCHECK(!network_trans_);
+      effective_load_flags_ &= ~LOAD_USE_SINGLE_KEYED_CACHE;
+      DoneWithEntryForRestartWithCache();
+      TransitionToState(STATE_GET_BACKEND);
+      return OK;
+    } else {
+      LOG(WARNING) << "Unusable flag set on non-single-keyed cache entry; "
+                   << "possible disk corruption? (cache key: " << cache_key_
+                   << ")";
+    }
+  }
+
   // TODO(crbug.com/713354) Only get data size if there is no other transaction
   // currently writing the response body due to the data race mentioned in the
   // associated bug.
@@ -1830,6 +1875,17 @@
     return ERR_CACHE_AUTH_FAILURE_AFTER_READ;
   }
 
+  // The single-keyed cache only accepts responses with code 200 or 304.
+  // Anything else is considered unusable.
+  if ((effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) &&
+      !(new_response->headers->response_code() == 200 ||
+        new_response->headers->response_code() == 304)) {
+    // Either the new response will be written back to the cache, in which case
+    // it will not be reused due to the flag, or it will not be, in which case
+    // it will not be reused anyway.
+    mark_single_keyed_cache_entry_unusable_ = true;
+  }
+
   new_response_ = new_response;
   if (!ValidatePartialResponse() && !auth_response_.headers.get()) {
     // Something went wrong with this request and we have to restart it.
@@ -1920,6 +1976,12 @@
   response_.restricted_prefetch = new_response_->restricted_prefetch;
   response_.ssl_info = new_response_->ssl_info;
   response_.dns_aliases = new_response_->dns_aliases;
+
+  // Be careful never to set single_keyed_cache_entry_unusable back to false
+  // from true.
+  if (mark_single_keyed_cache_entry_unusable_) {
+    response_.single_keyed_cache_entry_unusable = true;
+  }
   if (new_response_->vary_data.is_valid()) {
     response_.vary_data = new_response_->vary_data;
   } else if (response_.vary_data.is_valid()) {
@@ -1937,6 +1999,11 @@
     }
     TransitionToState(STATE_UPDATE_CACHED_RESPONSE_COMPLETE);
   } else {
+    if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+      DCHECK_EQ(method_, "GET");
+      ChecksumHeaders();
+    }
+
     // If we are already reading, we already updated the headers for this
     // request; doing it again will change Content-Length.
     if (!reading_) {
@@ -2023,6 +2090,11 @@
 
   SetResponse(*new_response_);
 
+  if (effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE) {
+    DCHECK_EQ(method_, "GET");
+    ChecksumHeaders();
+  }
+
   if (method_ == "HEAD") {
     // This response is replacing the cached one.
     DoneWithEntry(false);
@@ -2070,6 +2142,12 @@
     return OK;
   }
 
+  // Be careful never to set single_keyed_cache_entry_unusable back to false
+  // from true.
+  if (mark_single_keyed_cache_entry_unusable_) {
+    response_.single_keyed_cache_entry_unusable = true;
+  }
+
   TransitionToState(STATE_CACHE_WRITE_RESPONSE_COMPLETE);
   return WriteResponseInfoToEntry(response_, truncated_);
 }
@@ -2187,7 +2265,8 @@
   }
 
   if (network_trans_ && InWriters()) {
-    entry_->writers->SetNetworkTransaction(this, std::move(network_trans_));
+    entry_->writers->SetNetworkTransaction(this, std::move(network_trans_),
+                                           std::move(checksum_));
     moved_network_transaction_to_writers_ = true;
   }
 
@@ -2243,6 +2322,8 @@
     DCHECK(!entry_);
   } else {
     read_offset_ += result;
+    if (checksum_)
+      checksum_->Update(read_buf_->data(), result);
   }
   TransitionToState(STATE_NONE);
   return result;
@@ -2352,7 +2433,14 @@
 
   if (result > 0) {
     read_offset_ += result;
+    if (checksum_)
+      checksum_->Update(read_buf_->data(), result);
   } else if (result == 0) {  // End of file.
+    if (!FinishAndCheckChecksum()) {
+      TransitionToState(STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE);
+      return result;
+    }
+
     DoneWithEntry(true);
   } else {
     return OnCacheReadError(result, false);
@@ -2362,6 +2450,25 @@
   return result;
 }
 
+int HttpCache::Transaction::DoMarkSingleKeyedCacheEntryUnusable() {
+  DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+  response_.single_keyed_cache_entry_unusable = true;
+  TransitionToState(STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE);
+  return WriteResponseInfoToEntry(response_, /*truncated=*/false);
+}
+
+int HttpCache::Transaction::DoMarkSingleKeyedCacheEntryUnusableComplete(
+    int result) {
+  DCHECK_NE(result, ERR_IO_PENDING);
+  TransitionToState(STATE_NONE);
+  DoneWithEntry(/*entry_is_complete=*/true);
+  if (result < 0)
+    return result;
+
+  // Return 0 to indicate that we've finished reading the body.
+  return 0;
+}
+
 //-----------------------------------------------------------------------------
 
 void HttpCache::Transaction::SetRequest(const NetLogWithSource& net_log) {
@@ -3305,6 +3412,16 @@
   mode_ = NONE;  // switch to 'pass through' mode
 }
 
+void HttpCache::Transaction::DoneWithEntryForRestartWithCache() {
+  if (!entry_)
+    return;
+
+  cache_->DoneWithEntry(entry_, this, /*entry_is_complete=*/true,
+                        partial_ != nullptr);
+  entry_ = nullptr;
+  new_entry_ = nullptr;
+}
+
 int HttpCache::Transaction::OnCacheReadError(int result, bool restart) {
   DLOG(ERROR) << "ReadData failed: " << result;
   const int result_for_histogram = std::max(0, -result);
@@ -3758,4 +3875,69 @@
   return;
 }
 
+void HttpCache::Transaction::ChecksumHeaders() {
+  DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+  DCHECK(!checksum_);
+  checksum_ = crypto::SecureHash::Create(crypto::SecureHash::SHA256);
+  // For efficiency and concision, we list known headers matching a wildcard
+  // explicitly rather than doing prefix matching.
+  constexpr auto kHeadersToInclude = base::MakeFixedFlatSet<base::StringPiece>({
+      "access-control-allow-credentials",
+      "access-control-allow-headers",
+      "access-control-allow-methods",
+      "access-control-allow-origin",
+      "access-control-expose-headers",
+      "access-control-max-age",
+      "access-control-request-headers",
+      "access-control-request-method",
+      "clear-site-data",
+      "content-encoding",
+      "content-security-policy",
+      "content-type",
+      "cross-origin-embedder-policy",
+      "cross-origin-opener-policy",
+      "cross-origin-resource-policy",
+      "location"
+      "sec-websocket-accept",
+      "sec-websocket-extensions",
+      "sec-websocket-key",
+      "sec-websocket-protocol",
+      "sec-websocket-version",
+      "upgrade",
+      "vary",
+  });
+  // Iterate the response headers looking for matches.
+  size_t iter = 0;
+  std::string name;
+  std::string value;
+  // Pairs of (lower_case_header_name, header_value).
+  std::vector<std::pair<std::string, std::string>> filtered_headers;
+  // It's good to set the initial allocation size of the vector to the
+  // expected size to avoid a lot of reallocations. This value was chosen as
+  // it is a nice round number.
+  filtered_headers.reserve(16);
+  while (response_.headers->EnumerateHeaderLines(&iter, &name, &value)) {
+    std::string lowered_name = base::ToLowerASCII(name);
+    if (kHeadersToInclude.contains(lowered_name)) {
+      filtered_headers.emplace_back(lowered_name, value);
+    }
+  }
+  std::sort(filtered_headers.begin(), filtered_headers.end());
+  for (const auto& [name, value] : filtered_headers) {
+    checksum_->Update(name.data(), name.size());
+    checksum_->Update(": ", 2);
+    checksum_->Update(value.data(), value.size());
+    checksum_->Update("\n", 1);
+  }
+  checksum_->Update("\n", 1);
+}
+
+bool HttpCache::Transaction::FinishAndCheckChecksum() {
+  if (!checksum_)
+    return true;
+
+  DCHECK(effective_load_flags_ & LOAD_USE_SINGLE_KEYED_CACHE);
+  return ResponseChecksumMatches(std::move(checksum_));
+}
+
 }  // namespace net
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h
index 11af008..0b72fc4 100644
--- a/net/http/http_cache_transaction.h
+++ b/net/http/http_cache_transaction.h
@@ -35,6 +35,10 @@
 #include "net/socket/connection_attempts.h"
 #include "net/websockets/websocket_handshake_stream_base.h"
 
+namespace crypto {
+class SecureHash;
+}  // namespace crypto
+
 namespace net {
 
 class PartialData;
@@ -188,6 +192,11 @@
   // entry has finished writing.
   void WriteModeTransactionAboutToBecomeReader();
 
+  // True if the passed checksum calculated from the response matches the
+  // expected value from the HttpRequestInfo. Consumes `checksum`.
+  bool ResponseChecksumMatches(
+      std::unique_ptr<crypto::SecureHash> checksum) const;
+
  private:
   static const size_t kNumValidationHeaders = 2;
   // Helper struct to pair a header name with its value, for
@@ -281,6 +290,11 @@
     // by the network layer (skipping the cache entirely).
     STATE_NETWORK_READ,
     STATE_NETWORK_READ_COMPLETE,
+
+    // These states are only entered a single-keyed cache entry needs to be
+    // marked unusable.
+    STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE,
+    STATE_MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE,
   };
 
   // Used for categorizing validation triggers in histograms.
@@ -359,6 +373,8 @@
   int DoCacheReadDataComplete(int result);
   int DoNetworkRead();
   int DoNetworkReadComplete(int result);
+  int DoMarkSingleKeyedCacheEntryUnusable();
+  int DoMarkSingleKeyedCacheEntryUnusableComplete(int result);
 
   // Adds time out handling while waiting to be added to entry or after headers
   // phase is complete.
@@ -486,6 +502,10 @@
   // resumed or not.
   void DoneWithEntry(bool entry_is_complete);
 
+  // Informs the HttpCache that this transaction is done with the entry and
+  // resets related fields.
+  void DoneWithEntryForRestartWithCache();
+
   // Dooms the given entry so that it will not be re-used for other requests,
   // then calls `DoneWithEntry()`.
   //
@@ -583,6 +603,15 @@
   // headers.
   bool ShouldDisableCaching(const HttpResponseHeaders& headers) const;
 
+  // Checksum headers in `request_` for matching against the single-keyed cache
+  // checksum. Initializes `checksum_`.
+  void ChecksumHeaders();
+
+  // Finishes the checksum and validates that it matches the expected value.
+  // Returns true if the checksum matches. Returns false if it does not
+  // match. If no checksumming is taking place then returns true.
+  bool FinishAndCheckChecksum();
+
   // 304 revalidations of resources that set security headers and that get
   // forwarded might need to set these headers again to avoid being blocked.
   void UpdateSecurityHeadersBeforeForwarding();
@@ -640,6 +669,9 @@
   bool bypass_lock_after_headers_for_test_;  // A test is exercising the cache
                                              // lock.
   bool fail_conditionalization_for_test_;  // Fail ConditionalizeRequest.
+  bool mark_single_keyed_cache_entry_unusable_ =
+      false;  // Set single_keyed_cache_entry_unusable.
+
   scoped_refptr<IOBuffer> read_buf_;
 
   // Length of the buffer passed in Read().
@@ -687,6 +719,11 @@
   raw_ptr<WebSocketHandshakeStreamBase::CreateHelper>
       websocket_handshake_stream_base_create_helper_;
 
+  // Set if we are currently calculating a checksum of the resource to validate
+  // it against the expected checksum for the single-keyed cache. Accumulates a
+  // hash of selected headers and the body of the response.
+  std::unique_ptr<crypto::SecureHash> checksum_;
+
   BeforeNetworkStartCallback before_network_start_callback_;
   ConnectedCallback connected_callback_;
   RequestHeadersCallback request_headers_callback_;
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index bea17f1..f9a1768b 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -13452,4 +13452,298 @@
   EXPECT_EQ("cross-origin", response_corp_header);
 }
 
+class HttpCacheSingleKeyedCacheTest : public HttpCacheTest {
+ public:
+  void SetUp() override {
+    // The single-keyed cache feature is meaningless when the split cache is not
+    // enabled. The //net layer doesn't care whether or not the
+    // "CacheTransparency" feature is enabled.
+    feature_list_.InitWithFeatureState(
+        net::features::kSplitCacheByNetworkIsolationKey, true);
+    HttpCacheTest::SetUp();
+  }
+
+  void RunTransactionTestForSingleKeyedCache(
+      HttpCache* cache,
+      const MockTransaction& trans_info,
+      const NetworkIsolationKey& network_isolation_key,
+      const std::string& checksum) {
+    MockTransaction transaction(trans_info);
+    transaction.load_flags |= LOAD_USE_SINGLE_KEYED_CACHE;
+
+    AddMockTransaction(&transaction);
+    MockHttpRequest request(transaction);
+    request.network_isolation_key = network_isolation_key;
+    request.checksum = checksum;
+
+    HttpResponseInfo response_info;
+    RunTransactionTestWithRequest(cache, transaction, request, &response_info);
+  }
+
+  void RunSimpleTransactionTestForSingleKeyedCache(
+      HttpCache* cache,
+      const NetworkIsolationKey& network_isolation_key,
+      const std::string& checksum) {
+    RunTransactionTestForSingleKeyedCache(cache, kSimpleGET_Transaction,
+                                          network_isolation_key, checksum);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+constexpr char kChecksumForSimpleGET[] =
+    "80B4C37CEF5CFE69B4A90830282AA2BB772DC4CBC00491A219CE5F2AD75C7B58";
+
+TEST_F(HttpCacheSingleKeyedCacheTest, SuccessfulGET) {
+  MockHttpCache cache;
+  // The first request adds the item to the cache.
+  {
+    const auto site_a = SchemefulSite(GURL("https://a.com/"));
+    RunSimpleTransactionTestForSingleKeyedCache(
+        cache.http_cache(), NetworkIsolationKey(site_a, site_a),
+        kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request verifies that the same cache entry is used with a
+  // different NetworkIsolationKey
+  {
+    const auto site_b = SchemefulSite(GURL("https://b.com/"));
+    RunSimpleTransactionTestForSingleKeyedCache(
+        cache.http_cache(), NetworkIsolationKey(site_b, site_b),
+        kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+}
+
+TEST_F(HttpCacheSingleKeyedCacheTest, GETWithChecksumMismatch) {
+  MockHttpCache cache;
+  const auto site_a = SchemefulSite(GURL("https://a.com/"));
+  // The first request adds the item to the cache.
+  {
+    RunSimpleTransactionTestForSingleKeyedCache(
+        cache.http_cache(), NetworkIsolationKey(site_a, site_a),
+        "000000000000000000000000000000000000000000000000000000000000000");
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request doesn't use the item that was added to the single-keyed
+  // cache, but adds it to the split cache instead.
+  {
+    RunSimpleTransactionTestForSingleKeyedCache(
+        cache.http_cache(), NetworkIsolationKey(site_a, site_a),
+        "000000000000000000000000000000000000000000000000000000000000000");
+
+    // Fetches from the network again, this time into the split cache.
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(2, cache.disk_cache()->create_count());
+  }
+
+  // The third request uses the split cache.
+  {
+    RunSimpleTransactionTestForSingleKeyedCache(
+        cache.http_cache(), NetworkIsolationKey(site_a, site_a),
+        "000000000000000000000000000000000000000000000000000000000000000");
+
+    // Fetches from the split cache.
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(3, cache.disk_cache()->open_count());  // opens both cache entries
+    EXPECT_EQ(2, cache.disk_cache()->create_count());
+  }
+}
+
+TEST_F(HttpCacheSingleKeyedCacheTest, GETWithBadResponseCode) {
+  MockHttpCache cache;
+  MockTransaction transaction = kSimpleGET_Transaction;
+  transaction.status = "HTTP/1.1 404 Not Found";
+  const auto site_a = SchemefulSite(GURL("https://a.com/"));
+  // The first request adds the item to the single-keyed cache.
+  {
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_a, site_a),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request verifies that the cache entry is not re-used
+  // but a new one is created in the split cache.
+  {
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_a, site_a),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(2, cache.disk_cache()->create_count());
+  }
+}
+
+TEST_F(HttpCacheSingleKeyedCacheTest, SuccessfulRevalidation) {
+  MockHttpCache cache;
+  MockTransaction transaction = kSimpleGET_Transaction;
+  // Add a cache control header to permit the entry to be cached, with max-age 0
+  // to force relatidation next time. Add Etag to permit it to be revalidated.
+  transaction.response_headers =
+      "Etag: \"foo\"\n"
+      "Cache-Control: max-age=0\n";
+  {
+    const auto site_a = SchemefulSite(GURL("https://a.com/"));
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_a, site_a),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request revalidates the existing entry.
+  {
+    const auto site_b = SchemefulSite(GURL("https://b.com/"));
+    transaction.status = "HTTP/1.1 304 Not Modified";
+    // Allow it to be reused without validation next time by increasing max-age.
+    transaction.response_headers =
+        "Etag: \"foo\"\n"
+        "Cache-Control: max-age=10000\n";
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_b, site_b),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The third request re-uses the entry.
+  {
+    const auto site_c = SchemefulSite(GURL("https://c.com/"));
+    // Load from cache again.
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_c, site_c),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+}
+
+TEST_F(HttpCacheSingleKeyedCacheTest, RevalidationChangingUncheckedHeader) {
+  MockHttpCache cache;
+  MockTransaction transaction = kSimpleGET_Transaction;
+  // Add a cache control header to permit the entry to be cached, with max-age 0
+  // to force relatidation next time. Add Etag to permit it to be revalidated.
+  transaction.response_headers =
+      "Etag: \"foo\"\n"
+      "Cache-Control: max-age=0\n";
+  {
+    const auto site_a = SchemefulSite(GURL("https://a.com/"));
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_a, site_a),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request revalidates the existing entry.
+  {
+    const auto site_b = SchemefulSite(GURL("https://b.com/"));
+    transaction.status = "HTTP/1.1 304 Not Modified";
+    // Add a response header. This is the only difference from the
+    // SuccessfulRevalidation test.
+    transaction.response_headers =
+        "Etag: \"foo\"\n"
+        "Cache-Control: max-age=10000\n"
+        "X-Unchecked-Header: 1\n";
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_b, site_b),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The third request re-uses the entry.
+  {
+    const auto site_c = SchemefulSite(GURL("https://c.com/"));
+    // Load from cache again.
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_c, site_c),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+}
+
+TEST_F(HttpCacheSingleKeyedCacheTest, RevalidationChangingCheckedHeader) {
+  MockHttpCache cache;
+  MockTransaction transaction = kSimpleGET_Transaction;
+  // Add a cache control header to permit the entry to be cached, with max-age 0
+  // to force relatidation next time. Add Etag to permit it to be revalidated.
+  transaction.response_headers =
+      "Etag: \"foo\"\n"
+      "Cache-Control: max-age=0\n";
+  {
+    const auto site_a = SchemefulSite(GURL("https://a.com/"));
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_a, site_a),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(1, cache.network_layer()->transaction_count());
+    EXPECT_EQ(0, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The second request marks the single-keyed cache entry unusable because the
+  // checksum no longer matches.
+  {
+    const auto site_b = SchemefulSite(GURL("https://b.com/"));
+    transaction.status = "HTTP/1.1 304 Not Modified";
+    // Add the "Vary" response header.
+    transaction.response_headers =
+        "Etag: \"foo\"\n"
+        "Cache-Control: max-age=10000\n"
+        "Vary: Cookie\n";
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_b, site_b),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(2, cache.network_layer()->transaction_count());
+    EXPECT_EQ(1, cache.disk_cache()->open_count());
+    EXPECT_EQ(1, cache.disk_cache()->create_count());
+  }
+
+  // The third request has to go to the network because the single-keyed cache
+  // entry is unusable. It writes a new entry to the split cache.
+  {
+    const auto site_c = SchemefulSite(GURL("https://c.com/"));
+    RunTransactionTestForSingleKeyedCache(cache.http_cache(), transaction,
+                                          NetworkIsolationKey(site_c, site_c),
+                                          kChecksumForSimpleGET);
+
+    EXPECT_EQ(3, cache.network_layer()->transaction_count());
+    EXPECT_EQ(2, cache.disk_cache()->open_count());
+    EXPECT_EQ(2, cache.disk_cache()->create_count());
+  }
+}
+
 }  // namespace net
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 037343d..5569cb7 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -15,6 +15,8 @@
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "crypto/secure_hash.h"
+#include "crypto/sha2.h"
 #include "net/base/net_errors.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/http/http_cache_transaction.h"
@@ -164,12 +166,15 @@
 
 void HttpCache::Writers::SetNetworkTransaction(
     Transaction* transaction,
-    std::unique_ptr<HttpTransaction> network_transaction) {
+    std::unique_ptr<HttpTransaction> network_transaction,
+    std::unique_ptr<crypto::SecureHash> checksum) {
   DCHECK_EQ(1u, all_writers_.count(transaction));
   DCHECK(network_transaction);
   DCHECK(!network_transaction_);
   network_transaction_ = std::move(network_transaction);
   network_transaction_->SetPriority(priority_);
+  DCHECK(!checksum_);
+  checksum_ = std::move(checksum);
 }
 
 void HttpCache::Writers::ResetNetworkTransaction() {
@@ -364,6 +369,14 @@
       case State::CACHE_WRITE_DATA_COMPLETE:
         rv = DoCacheWriteDataComplete(rv);
         break;
+      case State::MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE:
+        // `rv` is bytes here.
+        DCHECK_EQ(0, rv);
+        rv = DoMarkSingleKeyedCacheEntryUnusable();
+        break;
+      case State::MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE:
+        rv = DoMarkSingleKeyedCacheEntryUnusableComplete(rv);
+        break;
       case State::UNSET:
         NOTREACHED() << "bad state";
         rv = ERR_FAILED;
@@ -491,6 +504,20 @@
 int HttpCache::Writers::DoCacheWriteDataComplete(int result) {
   DCHECK(!all_writers_.empty());
   next_state_ = State::NONE;
+  if (checksum_) {
+    if (write_len_ > 0) {
+      checksum_->Update(read_buf_->data(), write_len_);
+    } else {
+      // The write to the cache may have failed if result < 0, but even in that
+      // case we want to check whether the data we've read from the network is
+      // valid or not.
+      CHECK(active_transaction_);
+      if (!active_transaction_->ResponseChecksumMatches(std::move(checksum_))) {
+        next_state_ = State::MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE;
+      }
+    }
+  }
+
   if (result != write_len_) {
     // Note that it is possible for cache write to fail if the size of the file
     // exceeds the per-file limit.
@@ -504,6 +531,40 @@
   return result;
 }
 
+int HttpCache::Writers::DoMarkSingleKeyedCacheEntryUnusable() {
+  // `response_info_truncation_` is not actually truncated.
+  // TODO(ricea): Maybe change the name of the member?
+  response_info_truncation_.single_keyed_cache_entry_unusable = true;
+  next_state_ = State::MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE;
+
+  // Update cache metadata. This is a subset of what
+  // HttpCache::Transaction::WriteResponseInfoToEntry does.
+  auto data = base::MakeRefCounted<PickledIOBuffer>();
+  response_info_truncation_.Persist(data->pickle(),
+                                    /*skip_transient_headers=*/true,
+                                    /*response_truncated=*/false);
+  data->Done();
+  io_buf_len_ = data->pickle()->size();
+  CompletionOnceCallback io_callback = base::BindOnce(
+      &HttpCache::Writers::OnIOComplete, weak_factory_.GetWeakPtr());
+  return entry_->disk_entry->WriteData(kResponseInfoIndex, 0, data.get(),
+                                       io_buf_len_, std::move(io_callback),
+                                       true);
+}
+
+int HttpCache::Writers::DoMarkSingleKeyedCacheEntryUnusableComplete(
+    int result) {
+  next_state_ = State::NONE;
+
+  if (result < 0) {
+    OnCacheWriteFailure();
+  }
+
+  // DoLoop() wants the size of the data write, not the size of the metadata
+  // write.
+  return write_len_;
+}
+
 void HttpCache::Writers::OnDataReceived(int result) {
   DCHECK(!all_writers_.empty());
 
diff --git a/net/http/http_cache_writers.h b/net/http/http_cache_writers.h
index 4638221..344ccca 100644
--- a/net/http/http_cache_writers.h
+++ b/net/http/http_cache_writers.h
@@ -14,6 +14,10 @@
 #include "net/http/http_cache.h"
 #include "net/http/http_response_info.h"
 
+namespace crypto {
+class SecureHash;
+}
+
 namespace net {
 
 class HttpResponseInfo;
@@ -138,10 +142,12 @@
   LoadState GetLoadState() const;
 
   // Sets the network transaction argument to |network_transaction_|. Must be
-  // invoked before Read can be invoked.
+  // invoked before Read can be invoked. If |checksum| is set it will be
+  // validated and the cache entry will be marked unusable if it doesn't match.
   void SetNetworkTransaction(
       Transaction* transaction,
-      std::unique_ptr<HttpTransaction> network_transaction);
+      std::unique_ptr<HttpTransaction> network_transaction,
+      std::unique_ptr<crypto::SecureHash> checksum);
 
   // Resets the network transaction to nullptr. Required for range requests as
   // they might use the current network transaction only for part of the
@@ -163,6 +169,8 @@
     NETWORK_READ_COMPLETE,
     CACHE_WRITE_DATA,
     CACHE_WRITE_DATA_COMPLETE,
+    MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE,
+    MARK_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE_COMPLETE,
   };
 
   // These transactions are waiting on Read. After the active transaction
@@ -192,6 +200,8 @@
   int DoNetworkReadComplete(int result);
   int DoCacheWriteData(int num_bytes);
   int DoCacheWriteDataComplete(int result);
+  int DoMarkSingleKeyedCacheEntryUnusable();
+  int DoMarkSingleKeyedCacheEntryUnusableComplete(int result);
 
   // Helper functions for callback.
   void OnNetworkReadFailure(int result);
@@ -285,6 +295,11 @@
   // written.
   bool should_keep_entry_ = true;
 
+  // Set if we are currently calculating a checksum of the resource to validate
+  // it against the expected checksum for the single-keyed cache. Initialised
+  // with selected headers and accumulates the body of the response.
+  std::unique_ptr<crypto::SecureHash> checksum_;
+
   CompletionOnceCallback callback_;  // Callback for active_transaction_.
 
   // Since cache_ can destroy |this|, |cache_callback_| is only invoked at the
diff --git a/net/http/http_cache_writers_unittest.cc b/net/http/http_cache_writers_unittest.cc
index 700ba1f5..94337894 100644
--- a/net/http/http_cache_writers_unittest.cc
+++ b/net/http/http_cache_writers_unittest.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "crypto/secure_hash.h"
 #include "net/http/http_cache.h"
 #include "net/http/http_cache_transaction.h"
 #include "net/http/http_response_info.h"
@@ -142,7 +143,7 @@
     writers_->AddTransaction(transaction.get(), parallel_writing_pattern_,
                              transaction->priority(), info);
     writers_->SetNetworkTransaction(transaction.get(),
-                                    std::move(network_transaction));
+                                    std::move(network_transaction), nullptr);
     EXPECT_TRUE(writers_->HasTransaction(transaction.get()));
     transactions_.push_back(std::move(transaction));
   }
diff --git a/net/http/http_request_info.h b/net/http/http_request_info.h
index 4292be32..444a9b83 100644
--- a/net/http/http_request_info.h
+++ b/net/http/http_request_info.h
@@ -88,6 +88,10 @@
   // happen multiple times. It is only safe to enable the 0-RTT if it is known
   // that the request is idempotent.
   net::Idempotency idempotency;
+
+  // Checksum of the request body and selected headers, in upper-case
+  // hexadecimal. Only non-empty if the USE_SINGLE_KEYED_CACHE load flag is set.
+  std::string checksum;
 };
 
 }  // namespace net
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc
index cc35dd8..15b2b28c 100644
--- a/net/http/http_response_info.cc
+++ b/net/http/http_response_info.cc
@@ -117,6 +117,10 @@
   // This bit is set if the response has a nonempty `dns_aliases` entry.
   RESPONSE_INFO_HAS_DNS_ALIASES = 1 << 27,
 
+  // This bit is set for an entry in the single-keyed cache that has been marked
+  // unusable due to the checksum not matching.
+  RESPONSE_INFO_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE = 1 << 28,
+
   // TODO(darin): Add other bits to indicate alternate request methods.
   // For now, we don't support storing those.
 };
@@ -194,6 +198,7 @@
       unused_since_prefetch(false),
       restricted_prefetch(false),
       async_revalidation_requested(false),
+      single_keyed_cache_entry_unusable(false),
       connection_info(CONNECTION_INFO_UNKNOWN) {}
 
 HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) = default;
@@ -357,6 +362,9 @@
 
   restricted_prefetch = (flags & RESPONSE_INFO_RESTRICTED_PREFETCH) != 0;
 
+  single_keyed_cache_entry_unusable =
+      (flags & RESPONSE_INFO_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE) != 0;
+
   ssl_info.pkp_bypassed = (flags & RESPONSE_INFO_PKP_BYPASSED) != 0;
 
   // Read peer_signature_algorithm.
@@ -422,6 +430,8 @@
     flags |= RESPONSE_INFO_UNUSED_SINCE_PREFETCH;
   if (restricted_prefetch)
     flags |= RESPONSE_INFO_RESTRICTED_PREFETCH;
+  if (single_keyed_cache_entry_unusable)
+    flags |= RESPONSE_INFO_SINGLE_KEYED_CACHE_ENTRY_UNUSABLE;
   if (ssl_info.pkp_bypassed)
     flags |= RESPONSE_INFO_PKP_BYPASSED;
   if (!stale_revalidate_timeout.is_null())
diff --git a/net/http/http_response_info.h b/net/http/http_response_info.h
index a6d80e49..0b00873d 100644
--- a/net/http/http_response_info.h
+++ b/net/http/http_response_info.h
@@ -187,6 +187,10 @@
   // response is retrieved from the cache.
   bool async_revalidation_requested;
 
+  // True if this entry in the single-keyed cache is unusable due to a checksum
+  // mismatch.
+  bool single_keyed_cache_entry_unusable;
+
   // stale-while-revalidate, if any, will be honored until time given by
   // |stale_revalidate_timeout|. This value is latched the first time
   // stale-while-revalidate is used until the resource is revalidated.
diff --git a/net/http/http_transaction_test_util.cc b/net/http/http_transaction_test_util.cc
index 6c750250..7a4dd508 100644
--- a/net/http/http_transaction_test_util.cc
+++ b/net/http/http_transaction_test_util.cc
@@ -576,7 +576,7 @@
 }
 
 ConnectionAttempts MockNetworkTransaction::GetConnectionAttempts() const {
-  NOTIMPLEMENTED();
+  // TODO(ricea): Replace this with a proper implementation if needed.
   return {};
 }
 
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h
index 4a4d0a8..ce6d47e7 100644
--- a/net/url_request/url_request.h
+++ b/net/url_request/url_request.h
@@ -792,6 +792,14 @@
   void SetIdempotency(Idempotency idempotency) { idempotency_ = idempotency; }
   Idempotency GetIdempotency() const { return idempotency_; }
 
+  const std::string& expected_response_checksum() const {
+    return expected_response_checksum_;
+  }
+
+  void set_expected_response_checksum(const std::string& checksum) {
+    expected_response_checksum_ = checksum;
+  }
+
   static bool DefaultCanUseCookies();
 
   base::WeakPtr<URLRequest> GetWeakPtr();
@@ -1033,6 +1041,12 @@
   ResponseHeadersCallback early_response_headers_callback_;
   ResponseHeadersCallback response_headers_callback_;
 
+  // A SHA-256 checksum of the response and selected headers, stored as
+  // upper-case hexadecimal. This is only used if the
+  // LOAD_USE_SINGLE_KEYED_CACHE flag is set. On failure to match the cache
+  // entry will be marked as unusable and will not be re-used.
+  std::string expected_response_checksum_;
+
   bool upgrade_if_insecure_;
 
   bool send_client_certs_ = true;
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 2db8e1b..33d77d31 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -278,6 +278,7 @@
       net::MutableNetworkTrafficAnnotationTag(request_->traffic_annotation());
   request_info_.socket_tag = request_->socket_tag();
   request_info_.idempotency = request_->GetIdempotency();
+  request_info_.checksum = request_->expected_response_checksum();
 #if BUILDFLAG(ENABLE_REPORTING)
   request_info_.reporting_upload_depth = request_->reporting_upload_depth();
 #endif
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index de6ae3fe..e4b8796a 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -264,6 +264,18 @@
 const base::Feature kOmitCorsClientCert{"OmitCorsClientCert",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Allow pervasive payloads to use a single-keyed cache.
+const base::Feature kCacheTransparency{"CacheTransparency",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
+// The list of pervasive payloads. A comma separated list starting with a
+// version number, followed one or more pairs of URL and checksum. The version
+// number is an integer. The URL is the canonical URL as returned by
+// GURL::spec(). The checksum is the SHA-256 of the payload and selected headers
+// converted to uppercase hexadecimal.
+constexpr base::FeatureParam<std::string> kCacheTransparencyPervasivePayloads{
+    &kCacheTransparency, "pervasive-payloads", ""};
+
 // Read as much of the net::URLRequest as there is space in the Mojo data pipe.
 const base::Feature kOptimizeNetworkBuffers{"OptimizeNetworkBuffers",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 153fa68..a39b128 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -109,6 +109,13 @@
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kOptimizeNetworkBuffers;
 
+COMPONENT_EXPORT(NETWORK_CPP)
+extern const base::Feature kCacheTransparency;
+
+COMPONENT_EXPORT(NETWORK_CPP)
+extern const base::FeatureParam<std::string>
+    kCacheTransparencyPervasivePayloads;
+
 }  // namespace features
 }  // namespace network
 
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 8137159..559ed70 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -12,6 +12,8 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/containers/fixed_flat_set.h"
+#include "base/containers/flat_map.h"
 #include "base/debug/alias.h"
 #include "base/debug/dump_without_crashing.h"
 #include "base/files/file.h"
@@ -21,9 +23,13 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/ranges/algorithm.h"
+#include "base/sequence_checker.h"
 #include "base/strings/strcat.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/thread_pool.h"
+#include "base/thread_annotations.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
@@ -398,6 +404,146 @@
   return remote.is_bound() ? remote.get() : fallback;
 }
 
+// Feature configuration for Cache Transparency is expensive to calculate, so it
+// is cached. Not threadsafe.
+class CacheTransparencySettings {
+ public:
+  // This is not threadsafe, but it doesn't need to be.
+  static const CacheTransparencySettings& Get() {
+    if (!singleton_instance_) {
+      singleton_instance_ = new CacheTransparencySettings();
+    }
+    return *singleton_instance_;
+  }
+
+  static void ResetForTesting() {
+    // `singleton_instance_` needs to be leaked at shutdown but not during
+    // tests.
+    delete singleton_instance_;
+    singleton_instance_ = nullptr;
+  }
+
+  CacheTransparencySettings(CacheTransparencySettings&) = delete;
+  CacheTransparencySettings& operator=(const CacheTransparencySettings&) =
+      delete;
+
+  bool enabled() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return enabled_;
+  }
+
+  absl::optional<std::string> GetChecksumForURL(const GURL& url) const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+    if (!url.is_valid())
+      return absl::nullopt;
+
+    auto it = map_.find(url.spec());
+    if (it == map_.end()) {
+      return absl::nullopt;
+    }
+    return it->second;
+  }
+
+ private:
+  using PervasivePayloadsMap = base::flat_map<std::string, std::string>;
+
+  CacheTransparencySettings()
+      : enabled_(base::FeatureList::IsEnabled(features::kCacheTransparency)),
+        map_(CreateMap()) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  }
+
+  ~CacheTransparencySettings() = default;
+
+  PervasivePayloadsMap CreateMap() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    if (!enabled_)
+      return PervasivePayloadsMap();
+
+    const std::string comma_separated =
+        features::kCacheTransparencyPervasivePayloads.Get();
+    auto split = base::SplitStringPiece(
+        comma_separated, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+    if (split.empty()) {
+      // The code below safely produces an empty map in this case.
+      DLOG(WARNING) << "Pervasive payload list is empty.";
+    } else {
+      const auto version_string = split[0];
+      int version_number = 0;
+      if (StringToInt(version_string, &version_number)) {
+        // TODO(ricea): Do something useful with the version number.
+      } else {
+        LOG(WARNING) << "Could not parse pervasive payload version number";
+      }
+      // The number of items cannot be large, so this O(N) algorithm is
+      // acceptable.
+      split.erase(split.begin());
+    }
+    if (split.size() % 2 == 1) {
+      DLOG(WARNING)
+          << "Pervasive payload list contains an odd number of elements."
+          << comma_separated;
+    }
+    using Container = PervasivePayloadsMap::container_type;
+    Container pairs;
+    pairs.reserve(split.size() / 2);
+    // `split` has to fit in memory, therefore split.size() cannot be the
+    // largest possible value, therefore adding 1 to i will not overflow.
+    for (size_t i = 0; i + 1 < split.size(); i += 2) {
+      pairs.emplace_back(split[i], split[i + 1]);
+    }
+    return PervasivePayloadsMap(std::move(pairs));
+  }
+
+  SEQUENCE_CHECKER(sequence_checker_);
+  const bool enabled_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
+  const PervasivePayloadsMap map_ GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // This is normally leaked to avoid running a destructor. It's only
+  // re-allocated in tests.
+  static CacheTransparencySettings* singleton_instance_;
+};
+
+CacheTransparencySettings* CacheTransparencySettings::singleton_instance_ =
+    nullptr;
+
+bool HasFlagsIncompatibleWithSingleKeyedCache(int load_flags) {
+  return load_flags &
+         (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE |
+          net::LOAD_SKIP_CACHE_VALIDATION | net::LOAD_ONLY_FROM_CACHE |
+          net::LOAD_DISABLE_CACHE | net::LOAD_SKIP_VARY_CHECK);
+}
+
+bool HasHeadersIncompatibleWithSingleKeyedCache(
+    const net::HttpRequestHeaders& headers) {
+  // These are lowercase to permit case-insensitive matching.
+  auto incompatible_headers = base::MakeFixedFlatSet<base::StringPiece>({
+      "accept",
+      "accept-charset",
+      "accept-encoding",
+      "authorization",
+      "cache-control",
+      "if-match",
+      "if-modified-since",
+      "if-none-match",
+      "if-range",
+      "if-unmodified-since",
+      "pragma",
+      "range",
+  });
+  // HttpRequestHeaders::FindHeader() would iterate through the headers for each
+  // name in the above list. To reduce the cost of this function, iterate
+  // manually instead
+  net::HttpRequestHeaders::Iterator it(headers);
+  while (it.GetNext()) {
+    if (incompatible_headers.contains(base::ToLowerASCII(it.name()))) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace
 
 URLLoader::MaybeSyncURLLoaderClient::MaybeSyncURLLoaderClient(
@@ -444,7 +590,8 @@
     mojo::PendingRemote<mojom::URLLoaderNetworkServiceObserver>
         url_loader_network_observer,
     mojo::PendingRemote<mojom::DevToolsObserver> devtools_observer,
-    mojo::PendingRemote<mojom::AcceptCHFrameObserver> accept_ch_frame_observer)
+    mojo::PendingRemote<mojom::AcceptCHFrameObserver> accept_ch_frame_observer,
+    bool third_party_cookies_enabled)
     : url_request_context_(context.GetUrlRequestContext()),
       network_context_client_(context.GetNetworkContextClient()),
       delete_callback_(std::move(delete_callback)),
@@ -495,6 +642,7 @@
       allow_http1_for_streaming_upload_(
           request.request_body &&
           request.request_body->AllowHTTP1ForStreamingUpload()),
+      third_party_cookies_enabled_(third_party_cookies_enabled),
       accept_ch_frame_observer_(std::move(accept_ch_frame_observer)) {
   TRACE_EVENT("loading", "URLLoader::URLLoader",
               perfetto::Flow::FromPointer(this));
@@ -614,7 +762,33 @@
         net::RedirectInfo::FirstPartyURLPolicy::UPDATE_URL_ON_REDIRECT);
   }
 
-  url_request_->SetLoadFlags(request.load_flags);
+  int request_load_flags = request.load_flags;
+
+  if (CacheTransparencySettings::Get().enabled() &&
+      ThirdPartyCookiesEnabled()) {
+    auto checksum =
+        CacheTransparencySettings::Get().GetChecksumForURL(request.url);
+    if (checksum.has_value()) {
+      DVLOG(2) << "Found pervasive payload: " << request.url.spec();
+      if (request.method != net::HttpRequestHeaders::kGetMethod) {
+        DVLOG(2) << "Not using single-keyed-cache; method is "
+                 << request.method;
+      } else if (HasFlagsIncompatibleWithSingleKeyedCache(request_load_flags)) {
+        DVLOG(2) << "Not using single-keyed-cache; flags are "
+                 << request_load_flags;
+      } else if (HasHeadersIncompatibleWithSingleKeyedCache(request.headers)) {
+        DVLOG(2) << "Not using single-keyed-cache; headers are\n"
+                 << request.headers.ToString();
+      } else {
+        DVLOG(2) << "Trying single-keyed cache";
+        request_load_flags |= net::LOAD_USE_SINGLE_KEYED_CACHE;
+
+        url_request_->set_expected_response_checksum(checksum.value());
+      }
+    }
+  }
+
+  url_request_->SetLoadFlags(request_load_flags);
   SetRequestCredentials(request.url);
 
   url_request_->SetRequestHeadersCallback(base::BindRepeating(
@@ -1268,6 +1442,11 @@
          element.As<network::DataElementChunkedDataPipe>().read_only_once();
 }
 
+// static
+void URLLoader::ResetPervasivePayloadsListForTesting() {
+  CacheTransparencySettings::ResetForTesting();
+}
+
 void URLLoader::OnAuthRequired(net::URLRequest* url_request,
                                const net::AuthChallengeInfo& auth_info) {
   if (has_fetch_streaming_upload_body_) {
@@ -2508,4 +2687,10 @@
   return false;
 }
 
+bool URLLoader::ThirdPartyCookiesEnabled() const {
+  return third_party_cookies_enabled_ &&
+         !(options_ & (mojom::kURLLoadOptionBlockThirdPartyCookies |
+                       mojom::kURLLoadOptionBlockAllCookies));
+}
+
 }  // namespace network
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
index abc8ecd..adfcec31 100644
--- a/services/network/url_loader.h
+++ b/services/network/url_loader.h
@@ -148,6 +148,10 @@
   // Pointers from the |url_loader_context| will be used if
   // |dev_tools_observer|, |cookie_access_observer| or
   // |url_loader_network_observer| are not provided.
+  //
+  // |third_party_cookies_enabled| is also false if all cookies are disabled.
+  // The mojom::kURLLoadOptionBlockThirdPartyCookies can be set or unset
+  // independently of this option.
   URLLoader(
       URLLoaderContext& context,
       DeleteCallback delete_callback,
@@ -167,7 +171,8 @@
           url_loader_network_observer,
       mojo::PendingRemote<mojom::DevToolsObserver> devtools_observer,
       mojo::PendingRemote<mojom::AcceptCHFrameObserver>
-          accept_ch_frame_observer);
+          accept_ch_frame_observer,
+      bool third_party_cookies_enabled);
 
   URLLoader(const URLLoader&) = delete;
   URLLoader& operator=(const URLLoader&) = delete;
@@ -276,6 +281,8 @@
 
   static bool HasFetchStreamingUploadBody(const ResourceRequest*);
 
+  static void ResetPervasivePayloadsListForTesting();
+
  private:
   // This class is used to set the URLLoader as user data on a URLRequest. This
   // is used instead of URLLoader directly because SetUserData requires a
@@ -440,6 +447,8 @@
   // send or store credentials for no-cors cross-origin request.
   bool CoepAllowCredentials(const GURL& url);
 
+  bool ThirdPartyCookiesEnabled() const;
+
   raw_ptr<net::URLRequestContext> url_request_context_;
 
   raw_ptr<mojom::NetworkContextClient> network_context_client_;
@@ -615,6 +624,8 @@
   bool emitted_devtools_raw_request_ = false;
   bool emitted_devtools_raw_response_ = false;
 
+  const bool third_party_cookies_enabled_;
+
   mojo::Remote<mojom::AcceptCHFrameObserver> accept_ch_frame_observer_;
 
   base::WeakPtrFactory<URLLoader> weak_ptr_factory_{this};
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
index a7fb621..21966a9 100644
--- a/services/network/url_loader_factory.cc
+++ b/services/network/url_loader_factory.cc
@@ -324,6 +324,18 @@
             url_request.trusted_params->accept_ch_frame_observer));
   }
 
+  // Check for third party cookies being disabled by testing a non-existant
+  // third-party cookie. This will also be false if all cookies are disabled.
+  const auto dummy_cookie = net::CanonicalCookie::Create(
+      GURL("https://does-not-exist./"), "a=n", base::Time::Now(), absl::nullopt,
+      absl::nullopt);
+
+  const bool third_party_cookies_enabled =
+      context_->cookie_manager()->cookie_settings().IsCookieAccessible(
+          *dummy_cookie, GURL("https://also-does-not-exist./"),
+          net::SiteForCookies(net::SchemefulSite(url::Origin())),
+          url::Origin());
+
   auto loader = std::make_unique<URLLoader>(
       *this,
       base::BindOnce(&cors::CorsURLLoaderFactory::DestroyURLLoader,
@@ -334,7 +346,8 @@
       request_id, keepalive_request_size,
       std::move(keepalive_statistics_recorder), std::move(trust_token_factory),
       std::move(cookie_observer), std::move(url_loader_network_observer),
-      std::move(devtools_observer), std::move(accept_ch_frame_observer));
+      std::move(devtools_observer), std::move(accept_ch_frame_observer),
+      third_party_cookies_enabled);
 
   cors_url_loader_factory_->OnURLLoaderCreated(std::move(loader));
 }
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index c2e8137c..3966a4f 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -817,7 +817,8 @@
             : mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer_ ? devtools_observer_->Bind() : mojo::NullRemote(),
         accept_ch_frame_observer_ ? accept_ch_frame_observer_->Bind()
-                                  : mojo::NullRemote());
+                                  : mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     ran_ = true;
     devtools_observer_ = nullptr;
@@ -2436,7 +2437,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   // Run until the response body pipe arrives, to make sure that a live body
   // pipe does not result in keeping the loader alive when the URLLoader pipe is
@@ -2490,7 +2492,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilResponseBodyArrived();
   EXPECT_TRUE(client()->has_received_response());
@@ -2545,7 +2548,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   // Pausing reading response body from network stops future reads from the
   // underlying URLRequest. So no data should be sent using the response body
@@ -2621,7 +2625,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   response_controller.WaitForRequest();
   response_controller.Send(
@@ -2687,7 +2692,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   loader->PauseReadingBodyFromNet();
   loader.FlushForTesting();
@@ -2748,7 +2754,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   // It is okay to call ResumeReadingBodyFromNet() even if there is no prior
   // PauseReadingBodyFromNet().
@@ -3001,7 +3008,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   mojom::NetworkContextClient::OnFileUploadRequestedCallback callback;
   network_context_client->RunUntilUploadRequested(&callback);
@@ -3131,7 +3139,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   mojom::ChunkedDataPipeGetter::GetSizeCallback get_size_callback =
       data_pipe_getter.WaitForGetSize();
@@ -3180,7 +3189,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   mojom::ChunkedDataPipeGetter::GetSizeCallback get_size_callback =
       data_pipe_getter.WaitForGetSize();
@@ -3289,7 +3299,8 @@
       mojo::NullRemote() /* cookie_observer */,
       url_loader_network_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client.RunUntilRedirectReceived();
   ASSERT_TRUE(client.response_head()->ssl_info.has_value());
@@ -3319,7 +3330,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3374,7 +3386,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     client.RunUntilRedirectReceived();
 
@@ -3413,7 +3426,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client.RunUntilRedirectReceived();
 
@@ -3466,7 +3480,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3509,7 +3524,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3556,7 +3572,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3607,7 +3624,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3667,7 +3685,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3733,7 +3752,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3765,7 +3785,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -3868,7 +3889,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loaders.emplace_back(
         std::make_pair(std::move(url_loader), std::move(loader_remote)));
@@ -3891,7 +3913,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   // Make sure that the ResourceScheduler throttles this request.
@@ -3927,7 +3950,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilResponseBodyArrived();
   client()->response_body_release();
@@ -4206,7 +4230,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_auth_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(url_loader);
@@ -4250,7 +4275,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_auth_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(url_loader);
@@ -4294,7 +4320,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_auth_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(url_loader);
@@ -4339,7 +4366,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_auth_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(url_loader);
@@ -4383,7 +4411,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_auth_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(url_loader);
@@ -4424,7 +4453,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilRedirectReceived();
 
@@ -4526,7 +4556,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   EXPECT_EQ(0, client_cert_observer.on_certificate_requested_counter());
   EXPECT_EQ(0, private_key->sign_count());
@@ -4577,7 +4608,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   client_cert_observer.set_url_loader_remote(&loader);
 
   RunUntilIdle();
@@ -4619,7 +4651,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   client_cert_observer.set_url_loader_remote(&loader);
 
   RunUntilIdle();
@@ -4660,7 +4693,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   RunUntilIdle();
   ASSERT_TRUE(url_loader);
@@ -4710,7 +4744,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   RunUntilIdle();
   ASSERT_TRUE(url_loader);
@@ -4764,7 +4799,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   RunUntilIdle();
   ASSERT_TRUE(url_loader);
@@ -4820,7 +4856,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   RunUntilIdle();
   ASSERT_TRUE(url_loader);
@@ -4858,7 +4895,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   EXPECT_FALSE(url_loader->AllowCookies(first_party_url, site_for_cookies));
   EXPECT_FALSE(url_loader->AllowCookies(third_party_url, site_for_cookies));
@@ -4885,7 +4923,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   EXPECT_TRUE(url_loader->AllowCookies(first_party_url, site_for_cookies));
   EXPECT_FALSE(url_loader->AllowCookies(third_party_url, site_for_cookies));
@@ -4911,7 +4950,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   EXPECT_TRUE(url_loader->AllowCookies(first_party_url, site_for_cookies));
   EXPECT_TRUE(url_loader->AllowCookies(third_party_url, site_for_cookies));
@@ -5004,7 +5044,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -5069,7 +5110,8 @@
       mojo::NullRemote() /* cookie_observer */,
       client_cert_observer.Bind() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -5106,7 +5148,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5139,7 +5182,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5172,7 +5216,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5216,7 +5261,8 @@
       cookie_observer.GetRemote(),
       mojo::NullRemote() /* url_loader_network_observer */,
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   loader_client.RunUntilRedirectReceived();
   loader->FollowRedirect({}, {}, {}, absl::nullopt);
@@ -5261,7 +5307,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         client_auth_observer.Bind() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -5308,7 +5355,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5358,7 +5406,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5399,7 +5448,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5443,7 +5493,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5489,7 +5540,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilRedirectReceived();
 
@@ -5541,7 +5593,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilRedirectReceived();
     loader->FollowRedirect({}, {}, {}, absl::nullopt);
@@ -5588,7 +5641,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -5634,7 +5688,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -5675,7 +5730,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         devtools_observer.Bind(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5727,7 +5783,8 @@
       /*cookie_observer=*/mojo::NullRemote(),
       /*url_loader_network_observer=*/mojo::NullRemote(),
       /*devtools_observer=*/mojo::NullRemote(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   delete_run_loop.Run();
   loader_client.RunUntilComplete();
@@ -5777,7 +5834,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5827,7 +5885,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5869,7 +5928,8 @@
         nullptr /* trust_token_helper */, cookie_observer.GetRemote(),
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     delete_run_loop.Run();
     loader_client.RunUntilComplete();
@@ -5963,7 +6023,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -6015,7 +6076,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -6054,7 +6116,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilResponseBodyArrived();
     delete_run_loop.Run();
@@ -6099,7 +6162,8 @@
         mojo::NullRemote() /* cookie_observer */,
         mojo::NullRemote() /* url_loader_network_observer */,
         /*devtools_observer=*/mojo::NullRemote(),
-        /*accept_ch_frame_observer=*/mojo::NullRemote());
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        /*third_party_cookies_enabled=*/true);
 
     loader_client.RunUntilComplete();
     delete_run_loop.Run();
@@ -6393,7 +6457,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -6447,7 +6512,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -6489,7 +6555,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -6531,7 +6598,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -6573,7 +6641,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   client()->RunUntilComplete();
   delete_run_loop.Run();
@@ -6614,7 +6683,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
 
   delete_run_loop.Run();
   client()->RunUntilComplete();
@@ -6658,7 +6728,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   delete_run_loop.Run();
   client()->RunUntilComplete();
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
@@ -6694,7 +6765,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   delete_run_loop.Run();
   client()->RunUntilComplete();
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
@@ -6723,7 +6795,8 @@
       mojo::NullRemote() /* cookie_observer */,
       mojo::NullRemote() /* url_loader_network_observer */,
       devtools_observer.Bind(),
-      /*accept_ch_frame_observer=*/mojo::NullRemote());
+      /*accept_ch_frame_observer=*/mojo::NullRemote(),
+      /*third_party_cookies_enabled=*/true);
   delete_run_loop.Run();
   client()->RunUntilComplete();
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
@@ -7229,4 +7302,146 @@
 
 #endif  // BUILDFLAG(IS_ANDROID)
 
+class URLLoaderCacheTransparencyTest : public URLLoaderTest {
+ public:
+  void SetUp() override {
+    // Needed to start test_server().
+    URLLoaderTest::SetUp();
+
+    pervasive_payload_url_ = test_server()->GetURL(kPervasivePayload);
+    base::FieldTrialParams params;
+    params["pervasive-payloads"] = base::StrCat(
+        {"1,", pervasive_payload_url_.spec(),
+         ",87F6EE26BD9CFC440B4C805AAE79E0A5671F61C00B5E0AF54B8199EAF64AAAC3"});
+    cache_transparency_feature_.InitAndEnableFeatureWithParameters(
+        features::kCacheTransparency, params);
+    split_cache_feature_.InitAndEnableFeature(
+        net::features::kSplitCacheByNetworkIsolationKey);
+
+    // The URL changes for every test, so we have to force the list to be
+    // re-read from the feature parameter.
+    URLLoader::ResetPervasivePayloadsListForTesting();
+  }
+
+  void TearDown() override {
+    URLLoaderTest::TearDown();
+
+    URLLoader::ResetPervasivePayloadsListForTesting();
+  }
+
+  void OnServerReceivedRequest(
+      const net::test_server::HttpRequest& request) override {
+    ++network_request_count_;
+  }
+
+  // The main difference from Load() is that this can be called multiple times.
+  std::unique_ptr<TestURLLoaderClient> SendRequest(
+      base::StringPiece path = kPervasivePayload) {
+    auto client = std::make_unique<TestURLLoaderClient>();
+    ResourceRequest request =
+        CreateResourceRequest(method_.c_str(), test_server()->GetURL(path));
+    request.load_flags = load_flags_;
+    request.headers.AddHeadersFromString(headers_);
+
+    base::RunLoop delete_run_loop;
+    mojo::Remote<mojom::URLLoader> loader;
+    std::unique_ptr<URLLoader> url_loader;
+    context().mutable_factory_params().process_id = mojom::kBrowserProcessId;
+    context().mutable_factory_params().is_corb_enabled = false;
+    url_loader = std::make_unique<URLLoader>(
+        context(), DeleteLoaderCallback(&delete_run_loop, &url_loader),
+        loader.BindNewPipeAndPassReceiver(), mojom::kURLLoadOptionNone, request,
+        client->CreateRemote(), nullptr /* sync_url_loader_client */,
+        TRAFFIC_ANNOTATION_FOR_TESTS, 0 /* request_id */,
+        0 /* keepalive_request_size */, nullptr,
+        nullptr /* trust_token_helper */,
+        mojo::NullRemote() /* cookie_observer */,
+        mojo::NullRemote() /* url_loader_network_observer */,
+        /*devtools_observer=*/mojo::NullRemote(),
+        /*accept_ch_frame_observer=*/mojo::NullRemote(),
+        third_party_cookies_enabled_);
+
+    client->RunUntilComplete();
+    delete_run_loop.Run();
+
+    return client;
+  }
+
+  void SetOrigin(base::StringPiece url) {
+    context().mutable_factory_params().isolation_info =
+        net::IsolationInfo::CreateForInternalRequest(
+            url::Origin::Create(GURL(url)));
+  }
+
+  void SendTwoRequestsWithDifferentOrigins(
+      base::StringPiece path = kPervasivePayload) {
+    SetOrigin("https://a.com/");
+    SendRequest(path);
+    SetOrigin("https://b.com/");
+    SendRequest(path);
+  }
+
+  int network_request_count() { return network_request_count_; }
+
+  void set_third_party_cookies_enabled(bool value) {
+    third_party_cookies_enabled_ = value;
+  }
+
+  void set_method(std::string method) { method_ = std::move(method); }
+
+  void set_load_flags(int flags) { load_flags_ = flags; }
+
+  // Headers are in the format accepted by
+  // HttpRequestHeaders::AddHeadersFromString(), ie. "\r\n" delimited.
+  void set_headers(std::string headers) { headers_ = std::move(headers); }
+
+ private:
+  static constexpr char kPervasivePayload[] = "/pervasive.js";
+
+  base::test::ScopedFeatureList cache_transparency_feature_;
+  base::test::ScopedFeatureList split_cache_feature_;
+  GURL pervasive_payload_url_;
+  int network_request_count_ = 0;
+  bool third_party_cookies_enabled_ = true;
+  std::string method_ = "GET";
+  int load_flags_ = net::LOAD_NORMAL;
+  std::string headers_;
+};
+
+// This test is critical. If it doesn't pass, then the results of the other
+// URLLoaderCacheTransparencyTests are meaningless.
+TEST_F(URLLoaderCacheTransparencyTest, SuccessfulPervasivePayload) {
+  SendTwoRequestsWithDifferentOrigins();
+  EXPECT_EQ(1, network_request_count());
+}
+
+TEST_F(URLLoaderCacheTransparencyTest, ThirdPartyCookiesDisabled) {
+  set_third_party_cookies_enabled(false);
+  SendTwoRequestsWithDifferentOrigins();
+  EXPECT_EQ(2, network_request_count());
+}
+
+TEST_F(URLLoaderCacheTransparencyTest, NotAPervasivePayload) {
+  SendTwoRequestsWithDifferentOrigins("/cacheable.js");
+  EXPECT_EQ(2, network_request_count());
+}
+
+TEST_F(URLLoaderCacheTransparencyTest, NotAGETRequest) {
+  set_method("POST");
+  SendTwoRequestsWithDifferentOrigins();
+  EXPECT_EQ(2, network_request_count());
+}
+
+TEST_F(URLLoaderCacheTransparencyTest, IncompatibleLoadFlags) {
+  set_load_flags(net::LOAD_SKIP_VARY_CHECK);
+  SendTwoRequestsWithDifferentOrigins();
+  EXPECT_EQ(2, network_request_count());
+}
+
+TEST_F(URLLoaderCacheTransparencyTest, IncompatibleHeaders) {
+  set_headers("Range: bytes=0-5\r\n");
+  SendTwoRequestsWithDifferentOrigins();
+  EXPECT_EQ(2, network_request_count());
+}
+
 }  // namespace network
diff --git a/services/test/BUILD.gn b/services/test/BUILD.gn
index 9f50070..15883f7 100644
--- a/services/test/BUILD.gn
+++ b/services/test/BUILD.gn
@@ -40,6 +40,8 @@
   visibility = [ ":run_all_unittests" ]
   testonly = true
   sources = [
+    "//services/test/data/cacheable.js",
+    "//services/test/data/cacheable.js.mock-http-headers",
     "//services/test/data/content-sniffer-test0.html",
     "//services/test/data/content-sniffer-test0.html.mock-http-headers",
     "//services/test/data/content-sniffer-test1.html",
@@ -56,6 +58,8 @@
     "//services/test/data/nocache.html.mock-http-headers",
     "//services/test/data/nosniff-test.html",
     "//services/test/data/nosniff-test.html.mock-http-headers",
+    "//services/test/data/pervasive.js",
+    "//services/test/data/pervasive.js.mock-http-headers",
     "//services/test/data/redirect307-to-echo",
     "//services/test/data/redirect307-to-echo.mock-http-headers",
     "//services/test/data/simple_page.html",
diff --git a/services/test/data/cacheable.js b/services/test/data/cacheable.js
new file mode 100644
index 0000000..21ec3e93
--- /dev/null
+++ b/services/test/data/cacheable.js
@@ -0,0 +1,6 @@
+// Copyright 2022 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.
+
+// A file with no special properties except that is is cacheable due to its
+// headers. Used by CacheTransparency tests.
diff --git a/services/test/data/cacheable.js.mock-http-headers b/services/test/data/cacheable.js.mock-http-headers
new file mode 100644
index 0000000..d97b0434
--- /dev/null
+++ b/services/test/data/cacheable.js.mock-http-headers
@@ -0,0 +1,2 @@
+200 HTTP/1.1 OK
+Cache-Control: max-age=10000
diff --git a/services/test/data/pervasive.js b/services/test/data/pervasive.js
new file mode 100644
index 0000000..0aaa971
--- /dev/null
+++ b/services/test/data/pervasive.js
@@ -0,0 +1,5 @@
+// Copyright 2022 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.
+
+// Dummy file for Cache Transparency tests.
diff --git a/services/test/data/pervasive.js.mock-http-headers b/services/test/data/pervasive.js.mock-http-headers
new file mode 100644
index 0000000..5b2b7df
--- /dev/null
+++ b/services/test/data/pervasive.js.mock-http-headers
@@ -0,0 +1,3 @@
+HTTP/1.1 200 OK
+Content-Type: application/javascript
+Cache-Control: max-age=10000
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc
index ca1eed23..903f4845 100644
--- a/storage/browser/quota/quota_database.cc
+++ b/storage/browser/quota/quota_database.cc
@@ -185,7 +185,8 @@
       last_modified(last_modified) {}
 
 // QuotaDatabase ------------------------------------------------------------
-QuotaDatabase::QuotaDatabase(const base::FilePath& profile_path)
+QuotaDatabase::QuotaDatabase(const base::FilePath& profile_path,
+                             const base::Clock& clock)
     : storage_directory_(
           profile_path.empty()
               ? nullptr
@@ -196,7 +197,8 @@
               : storage_directory_->path().AppendASCII(kDatabaseName)),
       legacy_db_file_path_(profile_path.empty()
                                ? base::FilePath()
-                               : profile_path.AppendASCII(kDatabaseName)) {
+                               : profile_path.AppendASCII(kDatabaseName)),
+      clock_(clock) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
@@ -268,6 +270,13 @@
     return bucket_result;
   }
 
+  // Don't bother updating anything if the bucket is expired.
+  if (!bucket_result->expiration.is_null() &&
+      (bucket_result->expiration <= clock_.Now())) {
+    return bucket_result;
+  }
+
+  // Update the parameters that can be changed.
   if (!params.expiration.is_null() &&
       (params.expiration != bucket_result->expiration)) {
     DCHECK(!bucket_result->is_default());
@@ -1170,8 +1179,8 @@
 
   sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
   BindBucketInitParamsToInsertStatement(params, type, /*use_count=*/0,
-                                        /*last_accessed=*/base::Time::Now(),
-                                        /*last_modified=*/base::Time::Now(),
+                                        /*last_accessed=*/clock_.Now(),
+                                        /*last_modified=*/clock_.Now(),
                                         statement);
   QuotaErrorOr<BucketInfo> result = BucketInfoFromSqlStatement(statement);
   const bool done = !statement.Step();
diff --git a/storage/browser/quota/quota_database.h b/storage/browser/quota/quota_database.h
index 62ac31a1..826acaf0 100644
--- a/storage/browser/quota/quota_database.h
+++ b/storage/browser/quota/quota_database.h
@@ -17,6 +17,7 @@
 #include "base/files/file_path.h"
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
+#include "base/time/clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "base/types/id_type.h"
@@ -92,7 +93,7 @@
   static constexpr char kDatabaseName[] = "QuotaManager";
 
   // If `profile_path` is empty, an in-memory database will be used.
-  explicit QuotaDatabase(const base::FilePath& profile_path);
+  QuotaDatabase(const base::FilePath& profile_path, const base::Clock& clock);
 
   QuotaDatabase(const QuotaDatabase&) = delete;
   QuotaDatabase& operator=(const QuotaDatabase&) = delete;
@@ -325,6 +326,8 @@
   bool is_recreating_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
   bool is_disabled_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
 
+  const base::Clock& clock_;
+
   base::OneShotTimer timer_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   friend class QuotaDatabaseTest;
diff --git a/storage/browser/quota/quota_database_migrations_unittest.cc b/storage/browser/quota/quota_database_migrations_unittest.cc
index 6eeeb9e..177110f 100644
--- a/storage/browser/quota/quota_database_migrations_unittest.cc
+++ b/storage/browser/quota/quota_database_migrations_unittest.cc
@@ -5,6 +5,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/path_service.h"
+#include "base/time/default_clock.h"
 #include "components/services/storage/public/cpp/constants.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
@@ -70,7 +71,7 @@
   }
 
   void MigrateDatabase() {
-    QuotaDatabase db(ProfilePath());
+    QuotaDatabase db(ProfilePath(), clock_);
     EXPECT_EQ(db.EnsureOpened(), QuotaError::kNone);
 
     DCHECK_CALLED_ON_VALID_SEQUENCE(db.sequence_checker_);
@@ -87,12 +88,13 @@
   }
 
   std::string GetQuotaDatabaseSchema() {
-    QuotaDatabase db(ProfilePath());
+    QuotaDatabase db(ProfilePath(), clock_);
     EXPECT_EQ(db.EnsureOpened(), QuotaError::kNone);
     DCHECK_CALLED_ON_VALID_SEQUENCE(db.sequence_checker_);
     return db.db_->GetSchema();
   }
 
+  base::DefaultClock clock_;
   base::ScopedTempDir temp_directory_;
 };
 
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc
index 7ea769f..51ec57e 100644
--- a/storage/browser/quota/quota_database_unittest.cc
+++ b/storage/browser/quota/quota_database_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/sequence_checker.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
+#include "base/time/default_clock.h"
 #include "build/build_config.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "components/services/storage/public/cpp/buckets/constants.h"
@@ -81,8 +82,8 @@
   }
 
   std::unique_ptr<QuotaDatabase> CreateDatabase(bool is_incognito) {
-    return std::make_unique<QuotaDatabase>(is_incognito ? base::FilePath()
-                                                        : ProfilePath());
+    return std::make_unique<QuotaDatabase>(
+        is_incognito ? base::FilePath() : ProfilePath(), clock_);
   }
 
   bool EnsureOpened(QuotaDatabase* db) {
@@ -179,6 +180,7 @@
  private:
   base::test::SingleThreadTaskEnvironment task_environment_;
   base::ScopedTempDir temp_directory_;
+  base::DefaultClock clock_;
 };
 
 TEST_P(QuotaDatabaseTest, EnsureOpened) {
@@ -194,7 +196,8 @@
 }
 
 TEST_P(QuotaDatabaseTest, RazeAndReopenWithNoDb) {
-  QuotaDatabase db(use_in_memory_db() ? base::FilePath() : DbPath());
+  base::DefaultClock clock;
+  QuotaDatabase db(use_in_memory_db() ? base::FilePath() : DbPath(), clock);
   // RazeAndReopen() with no db tries to create the db one last time.
   EXPECT_EQ(db.RazeAndReopen(), QuotaError::kNone);
 
@@ -1111,7 +1114,8 @@
 #endif  // !BUILDFLAG(IS_MAC)
 
 TEST_F(QuotaDatabaseTest, UpdateOrCreateBucket_CorruptedDatabase) {
-  QuotaDatabase db(ProfilePath());
+  base::DefaultClock clock;
+  QuotaDatabase db(ProfilePath(), clock);
   BucketInitParams params(
       StorageKey::CreateFromStringForTesting("http://google/"),
       "google_bucket");
@@ -1143,7 +1147,8 @@
 }
 
 TEST_P(QuotaDatabaseTest, Expiration) {
-  QuotaDatabase db(ProfilePath());
+  base::DefaultClock clock;
+  QuotaDatabase db(ProfilePath(), clock);
 
   // Default `expiration` value.
   BucketInitParams params(
@@ -1170,7 +1175,8 @@
 }
 
 TEST_P(QuotaDatabaseTest, Persistent) {
-  QuotaDatabase db(ProfilePath());
+  base::DefaultClock clock;
+  QuotaDatabase db(ProfilePath(), clock);
 
   // Default `persistent` value.
   BucketInitParams params(
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc
index 8221e22e..3ba2906 100644
--- a/storage/browser/quota/quota_manager_impl.cc
+++ b/storage/browser/quota/quota_manager_impl.cc
@@ -40,6 +40,7 @@
 #include "base/thread_annotations.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "base/types/pass_key.h"
@@ -1017,7 +1018,8 @@
       get_settings_function_(get_settings_function),
       quota_change_callback_(std::move(quota_change_callback)),
       special_storage_policy_(std::move(special_storage_policy)),
-      get_volume_info_fn_(&QuotaManagerImpl::GetVolumeInfo) {
+      get_volume_info_fn_(&QuotaManagerImpl::GetVolumeInfo),
+      clock_(std::make_unique<base::DefaultClock>()) {
   DCHECK_EQ(settings_.refresh_interval, base::TimeDelta::Max());
   if (!get_settings_function.is_null()) {
     // Reset the interval to ensure we use the get_settings_function
@@ -1046,6 +1048,12 @@
     std::move(callback).Run(QuotaError::kDatabaseError);
     return;
   }
+  if (!bucket_params.expiration.is_null() &&
+      (bucket_params.expiration <= clock_->Now())) {
+    std::move(callback).Run(QuotaError::kIllegalOperation);
+    return;
+  }
+
   PostTaskAndReplyWithResultForDBThread(
       base::BindOnce(
           [](const BucketInitParams& params, QuotaDatabase* database) {
@@ -1053,8 +1061,9 @@
             return database->UpdateOrCreateBucket(params);
           },
           bucket_params),
-      base::BindOnce(&QuotaManagerImpl::DidGetBucket,
-                     weak_factory_.GetWeakPtr(), std::move(callback)));
+      base::BindOnce(&QuotaManagerImpl::DidGetBucketCheckExpiration,
+                     weak_factory_.GetWeakPtr(), bucket_params,
+                     std::move(callback)));
 }
 
 void QuotaManagerImpl::GetOrCreateBucketDeprecated(
@@ -1818,8 +1827,8 @@
   }
 
   // Use an empty path to open an in-memory only database for incognito.
-  database_ = std::make_unique<QuotaDatabase>(is_incognito_ ? base::FilePath()
-                                                            : profile_path_);
+  database_ = std::make_unique<QuotaDatabase>(
+      is_incognito_ ? base::FilePath() : profile_path_, *clock_);
 
   temporary_usage_tracker_ = std::make_unique<UsageTracker>(
       this, client_types_[StorageType::kTemporary], StorageType::kTemporary,
@@ -2197,7 +2206,7 @@
     buckets_in_error_[eviction_context_.evicted_bucket.id]++;
 
   if (status == blink::mojom::QuotaStatusCode::kOk) {
-    base::Time now = base::Time::Now();
+    base::Time now = clock_->Now();
     base::UmaHistogramCounts1M(
         QuotaManagerImpl::kEvictedBucketAccessedCountHistogram,
         entry.use_count);
@@ -2246,6 +2255,18 @@
   std::move(delete_bucket_data_callback).Run(status_code);
 }
 
+void QuotaManagerImpl::DidDeleteBucketForRecreation(
+    const BucketInitParams& params,
+    base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
+    BucketInfo bucket_info,
+    blink::mojom::QuotaStatusCode status_code) {
+  if (status_code == blink::mojom::QuotaStatusCode::kOk) {
+    UpdateOrCreateBucket(params, std::move(callback));
+  } else {
+    std::move(callback).Run(QuotaError::kDatabaseError);
+  }
+}
+
 void QuotaManagerImpl::MaybeRunStoragePressureCallback(
     const StorageKey& storage_key,
     int64_t total_space,
@@ -2447,7 +2468,7 @@
 
   std::map<StorageKey, int64_t> usage_map =
       GetUsageTracker(StorageType::kTemporary)->GetCachedStorageKeysUsage();
-  base::Time now = base::Time::Now();
+  base::Time now = clock_->Now();
   for (const auto& info : entries) {
     if (info.type != StorageType::kTemporary)
       continue;
@@ -2826,6 +2847,28 @@
   std::move(callback).Run(std::move(result));
 }
 
+void QuotaManagerImpl::DidGetBucketCheckExpiration(
+    const BucketInitParams& params,
+    base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
+    QuotaErrorOr<BucketInfo> result) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(callback);
+
+  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+
+  if (result.ok() && !result->expiration.is_null() &&
+      result->expiration <= clock_->Now()) {
+    DeleteBucketDataInternal(
+        result->ToBucketLocator(), AllQuotaClientTypes(),
+        base::BindOnce(&QuotaManagerImpl::DidDeleteBucketForRecreation,
+                       weak_factory_.GetWeakPtr(), params, std::move(callback),
+                       result.value()));
+    return;
+  }
+
+  std::move(callback).Run(std::move(result));
+}
+
 void QuotaManagerImpl::DidGetBucketForDeletion(
     StatusCallback callback,
     QuotaErrorOr<BucketInfo> result) {
@@ -2864,7 +2907,7 @@
   }
 
   BucketLocator bucket(result->id, result->storage_key, result->type,
-                       result->name == kDefaultBucketName);
+                       result->is_default());
   GetUsageTracker(bucket.type)
       ->UpdateBucketUsageCache(client_type, bucket, delta);
 
diff --git a/storage/browser/quota/quota_manager_impl.h b/storage/browser/quota/quota_manager_impl.h
index 9be369f2..112abdec 100644
--- a/storage/browser/quota/quota_manager_impl.h
+++ b/storage/browser/quota/quota_manager_impl.h
@@ -45,6 +45,7 @@
 #include "third_party/blink/public/mojom/quota/quota_types.mojom-shared.h"
 
 namespace base {
+class Clock;
 class SequencedTaskRunner;
 class SingleThreadTaskRunner;
 class TaskRunner;
@@ -181,12 +182,14 @@
   // expiration and persistence if the existing attributes don't match those
   // found in `bucket_params`, and may clobber the bucket and rebuild it if it's
   // expired. If a bucket doesn't exist, a new bucket is created with the
-  // specified policies. Returns a QuotaError if the operation has failed. This
-  // method is declared as virtual to allow test code to override it.
+  // specified policies. If the existing bucket exists but has expired, it will
+  // be clobbered and recreated. Returns a QuotaError if the operation has
+  // failed. This method is declared as virtual to allow test code to override
+  // it.
   virtual void UpdateOrCreateBucket(
       const BucketInitParams& bucket_params,
       base::OnceCallback<void(QuotaErrorOr<BucketInfo>)>);
-  // Same as GetOrCreateBucket but takes in StorageType. This should only be
+  // Same as UpdateOrCreateBucket but takes in StorageType. This should only be
   // used by FileSystem, and is expected to be removed when
   // StorageType::kSyncable and StorageType::kPersistent are deprecated.
   // (crbug.com/1233525, crbug.com/1286964).
@@ -501,6 +504,8 @@
   friend class QuotaManagerImplTest;
   friend class QuotaTemporaryStorageEvictor;
   friend class UsageTrackerTest;
+  FRIEND_TEST_ALL_PREFIXES(QuotaManagerImplTest,
+                           UpdateOrCreateBucket_Expiration);
 
   class EvictionRoundInfoHelper;
   class UsageAndQuotaInfoGatherer;
@@ -621,6 +626,15 @@
                                   BucketDataDeleter* deleter,
                                   blink::mojom::QuotaStatusCode status_code);
 
+  // Called after bucket data has been deleted from clients as well as the
+  // database due to bucket expiration. This will recreate the bucket in the
+  // database and pass it to `callback`.
+  void DidDeleteBucketForRecreation(
+      const BucketInitParams& params,
+      base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
+      BucketInfo bucket_info,
+      blink::mojom::QuotaStatusCode status_code);
+
   // Methods for eviction logic.
   void StartEviction();
   void DeleteBucketFromDatabase(const BucketLocator& bucket,
@@ -680,6 +694,10 @@
 
   void DidGetBucket(base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
                     QuotaErrorOr<BucketInfo> result);
+  void DidGetBucketCheckExpiration(
+      const BucketInitParams& params,
+      base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
+      QuotaErrorOr<BucketInfo> result);
   void DidGetBucketForDeletion(StatusCallback callback,
                                QuotaErrorOr<BucketInfo> result);
   void DidGetBucketForUsage(QuotaClientType client_type,
@@ -838,6 +856,8 @@
       bucket_data_deleters_;
   std::unique_ptr<StorageKeyGathererTask> storage_key_gatherer_;
 
+  std::unique_ptr<base::Clock> clock_;
+
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<QuotaManagerImpl> weak_factory_{this};
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc
index 35e42d59..0804bbb 100644
--- a/storage/browser/quota/quota_manager_unittest.cc
+++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -28,6 +28,7 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/simple_test_clock.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -216,10 +217,9 @@
 
   void OpenDatabase() { quota_manager_impl_->EnsureDatabaseOpened(); }
 
-  QuotaErrorOr<BucketInfo> GetOrCreateBucket(const StorageKey& storage_key,
-                                             const std::string& bucket_name) {
+  QuotaErrorOr<BucketInfo> UpdateOrCreateBucket(
+      const BucketInitParams& params) {
     base::test::TestFuture<QuotaErrorOr<BucketInfo>> future;
-    BucketInitParams params(storage_key, bucket_name);
     quota_manager_impl_->UpdateOrCreateBucket(params, future.GetCallback());
     return future.Take();
   }
@@ -772,11 +772,11 @@
   StorageKey storage_key = ToStorageKey("http://a.com/");
   std::string bucket_name = "bucket_a";
 
-  auto bucket = GetOrCreateBucket(storage_key, bucket_name);
+  auto bucket = UpdateOrCreateBucket({storage_key, bucket_name});
   ASSERT_FALSE(bucket.ok());
   ASSERT_FALSE(is_db_disabled());
 
-  bucket = GetOrCreateBucket(storage_key, bucket_name);
+  bucket = UpdateOrCreateBucket({storage_key, bucket_name});
   ASSERT_FALSE(bucket.ok());
   ASSERT_FALSE(is_db_disabled());
 
@@ -786,20 +786,57 @@
   ASSERT_TRUE(is_db_disabled());
 }
 
-TEST_F(QuotaManagerImplTest, GetOrCreateBucket) {
+TEST_F(QuotaManagerImplTest, UpdateOrCreateBucket) {
   StorageKey storage_key = ToStorageKey("http://a.com/");
   std::string bucket_name = "bucket_a";
 
-  auto bucket = GetOrCreateBucket(storage_key, bucket_name);
+  auto bucket = UpdateOrCreateBucket({storage_key, bucket_name});
   ASSERT_TRUE(bucket.ok());
 
   BucketId created_bucket_id = bucket.value().id;
 
-  bucket = GetOrCreateBucket(storage_key, bucket_name);
+  bucket = UpdateOrCreateBucket({storage_key, bucket_name});
   EXPECT_TRUE(bucket.ok());
   EXPECT_EQ(bucket.value().id, created_bucket_id);
 }
 
+TEST_F(QuotaManagerImplTest, UpdateOrCreateBucket_Expiration) {
+  auto clock = std::make_unique<base::SimpleTestClock>();
+  base::SimpleTestClock* clock_ptr = clock.get();
+  quota_manager_impl_->clock_ = std::move(clock);
+  clock_ptr->SetNow(base::Time::Now());
+
+  BucketInitParams params(ToStorageKey("http://a.com/"), "bucket_a");
+  params.expiration = clock_ptr->Now() - base::Days(1);
+
+  auto bucket = UpdateOrCreateBucket(params);
+  ASSERT_FALSE(bucket.ok());
+
+  // Create a new bucket.
+  params.expiration = clock_ptr->Now() + base::Days(1);
+  params.quota = 1000;
+  bucket = UpdateOrCreateBucket(params);
+  ASSERT_TRUE(bucket.ok());
+  EXPECT_EQ(bucket->expiration, params.expiration);
+  EXPECT_EQ(bucket->quota, 1000);
+
+  // Get/Update the same bucket. Verify expiration is updated, but quota is not.
+  params.expiration = clock_ptr->Now() + base::Days(5);
+  params.quota = 500;
+  bucket = UpdateOrCreateBucket(params);
+  ASSERT_TRUE(bucket.ok());
+  EXPECT_EQ(bucket->expiration, params.expiration);
+  EXPECT_EQ(bucket->quota, 1000);
+
+  // Verify that the bucket is clobbered due to being expired. In this case, the
+  // new quota is respected.
+  clock_ptr->Advance(base::Days(20));
+  params.expiration = base::Time();
+  bucket = UpdateOrCreateBucket(params);
+  EXPECT_EQ(bucket->expiration, params.expiration);
+  EXPECT_EQ(bucket->quota, 500);
+}
+
 TEST_F(QuotaManagerImplTest, GetOrCreateBucketSync) {
   base::RunLoop loop;
   // Post the function call on a different thread to ensure that the
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 9a9c9502..db03dbf 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5865,21 +5865,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5074.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -5892,7 +5892,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "isolate_profile_data": true,
@@ -6030,21 +6030,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -6056,7 +6056,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "args": [
@@ -6176,21 +6176,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -6202,7 +6202,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 6d15bb5..27ce25b 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -87946,21 +87946,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5074.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -87968,7 +87968,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "isolate_profile_data": true,
@@ -88081,28 +88081,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "args": [
@@ -88202,28 +88202,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "isolate_profile_data": true,
@@ -89561,20 +89561,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5074.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -89588,7 +89588,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "merge": {
@@ -89726,20 +89726,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -89752,7 +89752,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "args": [
@@ -89872,20 +89872,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -89898,7 +89898,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "merge": {
@@ -91394,20 +91394,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5074.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -91421,7 +91421,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "merge": {
@@ -91559,20 +91559,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -91585,7 +91585,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "args": [
@@ -91705,20 +91705,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5074.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -91731,7 +91731,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       },
       {
         "merge": {
@@ -92466,20 +92466,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5074.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5076.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5074.0",
-              "revision": "version:104.0.5074.0"
+              "location": "lacros_version_skew_tests_v104.0.5076.0",
+              "revision": "version:104.0.5076.0"
             }
           ],
           "dimension_sets": [
@@ -92492,7 +92492,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5074.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5076.0"
       }
     ]
   },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 72aa16e3..6bb7956e 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5074.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5076.0/test_ash_chrome',
     ],
-    'identifier': 'Lacros version skew testing ash 104.0.5074.0',
+    'identifier': 'Lacros version skew testing ash 104.0.5076.0',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v104.0.5074.0',
-          'revision': 'version:104.0.5074.0',
+          'location': 'lacros_version_skew_tests_v104.0.5076.0',
+          'revision': 'version:104.0.5076.0',
         },
       ],
     },
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index a9cf1b6..dc15c49 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -2081,7 +2081,7 @@
   kV8HTMLVideoElement_AutoPictureInPicture_AttributeGetter = 2733,
   kV8HTMLVideoElement_AutoPictureInPicture_AttributeSetter = 2734,
   kAutoPictureInPictureAttribute = 2735,
-  kRTCAudioJitterBufferRtxHandling = 2736,
+  kOBSOLETE_RTCAudioJitterBufferRtxHandling = 2736,
   kWebShareCanShare = 2737,
   kPriorityHints = 2738,
   kTextAutosizedCrossSiteIframe = 2739,
diff --git a/third_party/blink/public/strings/translations/blink_accessibility_strings_pt-PT.xtb b/third_party/blink/public/strings/translations/blink_accessibility_strings_pt-PT.xtb
index 28d850f0..5e086000 100644
--- a/third_party/blink/public/strings/translations/blink_accessibility_strings_pt-PT.xtb
+++ b/third_party/blink/public/strings/translations/blink_accessibility_strings_pt-PT.xtb
@@ -71,7 +71,7 @@
 <translation id="7742609585924342092">Ícone Localização</translation>
 <translation id="7745230546936012372">Para obter descrições de imagens em falta, abra o menu de contexto.</translation>
 <translation id="7796968532285333302">Ícone Divisa inferior, pode significar Reduzir</translation>
-<translation id="7819026464394689674">Ícone Colocar em pausa</translation>
+<translation id="7819026464394689674">Ícone Pausar</translation>
 <translation id="7855610409192055689">Ícone Clipe, pode significar anexo</translation>
 <translation id="7994555495914042081">Ícone Marca de verificação</translation>
 <translation id="8097409774376213335">Ícone Seta para baixo</translation>
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 61f2170..8e3b874 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -7199,33 +7199,35 @@
          (popup_and_hint_stack_.back()->PopupType() == PopupValueType::kHint);
 }
 
-void Document::HideTopmostPopupOrHint() {
+void Document::HideTopmostPopupOrHint(HidePopupFocusBehavior focus_behavior) {
   DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled());
   if (popup_and_hint_stack_.IsEmpty())
     return;
-  popup_and_hint_stack_.back()->hidePopup(ASSERT_NO_EXCEPTION);
+  popup_and_hint_stack_.back()->hidePopupInternal(focus_behavior);
 }
 
-void Document::HideAllPopupsUntil(const Element* endpoint) {
+void Document::HideAllPopupsUntil(const Element* endpoint,
+                                  HidePopupFocusBehavior focus_behavior) {
   DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled());
   while (!popup_and_hint_stack_.IsEmpty() &&
          popup_and_hint_stack_.back() != endpoint) {
-    popup_and_hint_stack_.back()->hidePopup(ASSERT_NO_EXCEPTION);
+    popup_and_hint_stack_.back()->hidePopupInternal(focus_behavior);
   }
 }
 
-void Document::HidePopupIfShowing(Element* popup) {
+void Document::HidePopupIfShowing(Element* popup,
+                                  HidePopupFocusBehavior focus_behavior) {
   DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled());
   DCHECK(popup->HasValidPopupAttribute());
   if (!popup->popupOpen())
     return;
   if (popup->PopupType() == PopupValueType::kAsync) {
-    popup->hidePopup(ASSERT_NO_EXCEPTION);
+    popup->hidePopupInternal(focus_behavior);
   } else {
-    HideAllPopupsUntil(popup);
+    HideAllPopupsUntil(popup, focus_behavior);
     DCHECK(!popup_and_hint_stack_.IsEmpty() &&
            popup_and_hint_stack_.back() == popup);
-    HideTopmostPopupOrHint();
+    HideTopmostPopupOrHint(focus_behavior);
   }
 }
 
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index a55fee5..f171d4b 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -59,6 +59,7 @@
 #include "third_party/blink/renderer/core/dom/document_encoding_data.h"
 #include "third_party/blink/renderer/core/dom/document_lifecycle.h"
 #include "third_party/blink/renderer/core/dom/document_timing.h"
+#include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/live_node_list_registry.h"
 #include "third_party/blink/renderer/core/dom/qualified_name.h"
 #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h"
@@ -239,6 +240,7 @@
 class WebMouseEvent;
 class WorkletAnimationController;
 enum class CSSPropertyID;
+enum class HidePopupFocusBehavior;
 struct AnnotatedRegionValue;
 struct FocusParams;
 struct IconURL;
@@ -1506,13 +1508,15 @@
   }
   bool PopupOrHintShowing() const;
   bool HintShowing() const;
-  void HideTopmostPopupOrHint();
+  void HideTopmostPopupOrHint(HidePopupFocusBehavior focus_behavior);
   // This hides all visible popups up to, but not including,
   // |endpoint|. If |endpoint| is nullptr, all popups are hidden.
-  void HideAllPopupsUntil(const Element* endpoint);
+  void HideAllPopupsUntil(const Element* endpoint,
+                          HidePopupFocusBehavior focus_behavior);
   // This hides the provided popup, if it is showing. This will also
   // hide all popups above |popup| in the popup stack.
-  void HidePopupIfShowing(Element* popup);
+  void HidePopupIfShowing(Element* popup,
+                          HidePopupFocusBehavior focus_behavior);
 
   // A non-null template_document_host_ implies that |this| was created by
   // EnsureTemplateDocument().
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index c067ae2..be9e94e 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2409,7 +2409,7 @@
       return;
     // If the popup type is changing, hide it.
     if (popupOpen())
-      hidePopup(ASSERT_NO_EXCEPTION);
+      hidePopupInternal(HidePopupFocusBehavior::kFocusPreviousElement);
   }
   if (type == PopupValueType::kNone) {
     if (HasValidPopupAttribute()) {
@@ -2460,23 +2460,30 @@
         DOMExceptionCode::kInvalidStateError,
         "Invalid on already-showing or disconnected popup elements");
   }
+  bool should_restore_focus = false;
   if (PopupType() == PopupValueType::kPopup ||
       PopupType() == PopupValueType::kHint) {
     if (GetDocument().HintShowing()) {
-      GetDocument().HideTopmostPopupOrHint();
+      GetDocument().HideTopmostPopupOrHint(HidePopupFocusBehavior::kNone);
     }
     if (PopupType() == PopupValueType::kPopup) {
       // Only hide other popups up to this popup's ancestral popup.
-      GetDocument().HideAllPopupsUntil(NearestOpenAncestralPopup(this));
+      GetDocument().HideAllPopupsUntil(NearestOpenAncestralPopup(this),
+                                       HidePopupFocusBehavior::kNone);
     }
     // Add this popup to the stack.
     auto& stack = GetDocument().PopupAndHintStack();
     DCHECK(!stack.Contains(this));
+    // We only restore focus for popup/hint, and only for the first popup in
+    // the stack.
+    should_restore_focus = stack.IsEmpty();
     stack.push_back(this);
   }
   GetPopupData()->setOpen(true);
   GetDocument().AddToTopLayer(this);
   PseudoStateChanged(CSSSelector::kPseudoPopupOpen);
+  GetPopupData()->setPreviouslyFocusedElement(
+      should_restore_focus ? GetDocument().FocusedElement() : nullptr);
   SetPopupFocusOnShow();
   // Queue the show event.
   Event* event = Event::CreateBubble(event_type_names::kShow);
@@ -2496,24 +2503,42 @@
         DOMExceptionCode::kInvalidStateError,
         "Invalid on already-hidden popup elements");
   }
+  hidePopupInternal(HidePopupFocusBehavior::kFocusPreviousElement);
+}
+
+void Element::hidePopupInternal(HidePopupFocusBehavior focus_behavior) {
   DCHECK(isConnected());
-  GetPopupData()->setOpen(false);
-  GetPopupData()->setInvoker(nullptr);
-  GetPopupData()->setNeedsRepositioningForSelectMenu(false);
+  DCHECK(HasValidPopupAttribute());
+  DCHECK(popupOpen());
   if (PopupType() == PopupValueType::kPopup ||
       PopupType() == PopupValueType::kHint) {
-    GetDocument().HideAllPopupsUntil(this);
-    // Remove this popup from the stack and the top layer.
+    // Hide any popups/hints above us in the stack.
+    GetDocument().HideAllPopupsUntil(this, focus_behavior);
+    // Then remove this popup/hint from the stack.
     auto& stack = GetDocument().PopupAndHintStack();
     DCHECK(stack.back() == this);
     stack.pop_back();
   }
+  GetPopupData()->setOpen(false);
+  GetPopupData()->setInvoker(nullptr);
+  GetPopupData()->setNeedsRepositioningForSelectMenu(false);
   GetDocument().RemoveFromTopLayer(this);
   PseudoStateChanged(CSSSelector::kPseudoPopupOpen);
   // Queue the hide event.
   Event* event = Event::CreateBubble(event_type_names::kHide);
   event->SetTarget(this);
   GetDocument().EnqueueAnimationFrameEvent(event);
+  if (Element* previously_focused_element =
+          GetPopupData()->previouslyFocusedElement()) {
+    GetPopupData()->setPreviouslyFocusedElement(nullptr);
+    if (focus_behavior == HidePopupFocusBehavior::kFocusPreviousElement) {
+      FocusOptions* focus_options = FocusOptions::Create();
+      focus_options->setPreventScroll(true);
+      // Call Focus() last, since it will fire a focus event which could modify
+      // this element. Focusing this element may also hide other popups.
+      previously_focused_element->Focus(focus_options);
+    }
+  }
 }
 
 void Element::SetPopupFocusOnShow() {
@@ -2702,16 +2727,19 @@
     //    1. This mirrors typical platform popups, which dismiss on mousedown.
     //    2. This allows a mouse-drag that starts on a popup and finishes off
     //       the popup, without light-dismissing the popup.
-    document.HideAllPopupsUntil(NearestOpenAncestralPopup(target_node));
+    document.HideAllPopupsUntil(NearestOpenAncestralPopup(target_node),
+                                HidePopupFocusBehavior::kNone);
   } else if (event_type == event_type_names::kKeydown) {
     const KeyboardEvent* key_event = DynamicTo<KeyboardEvent>(event);
     if (key_event && key_event->key() == "Escape") {
       // Escape key just pops the topmost popup or hint off the stack.
-      document.HideTopmostPopupOrHint();
+      document.HideTopmostPopupOrHint(
+          HidePopupFocusBehavior::kFocusPreviousElement);
     }
   } else if (event_type == event_type_names::kFocusin) {
     // If we focus an element, hide all popups that don't contain that element.
-    document.HideAllPopupsUntil(NearestOpenAncestralPopup(target_node));
+    document.HideAllPopupsUntil(NearestOpenAncestralPopup(target_node),
+                                HidePopupFocusBehavior::kNone);
   }
 }
 
@@ -3080,6 +3108,13 @@
         FastGetAttribute(html_names::kFocusgroupAttr);
     if (!focusgroup_value.IsNull())
       UpdateFocusgroup(focusgroup_value);
+
+    // We parse the focusgroup attribute for the ShadowDOM elements before we
+    // parse it for any of its root's ancestors, which might lead to an
+    // incorrect focusgroup value. Re-run the algorithm for the ShadowDOM
+    // elements when the ShadowRoot's parent gets inserted in the tree.
+    if (GetShadowRoot())
+      UpdateFocusgroupInShadowRootIfNeeded();
   }
 
   if (parentElement() && parentElement()->IsInCanvasSubtree())
@@ -3108,7 +3143,9 @@
   // If a popup is removed from the document, make sure it gets
   // removed from the popup element stack and the top layer.
   if (was_in_document && HasValidPopupAttribute()) {
-    insertion_point.GetDocument().HidePopupIfShowing(this);
+    // We can't run focus event handlers while removing elements.
+    insertion_point.GetDocument().HidePopupIfShowing(
+        this, HidePopupFocusBehavior::kNone);
   }
 
   if (GetDocument().GetPage())
@@ -7084,10 +7121,72 @@
   if (!RuntimeEnabledFeatures::FocusgroupEnabled())
     return;
 
+  if (ShadowRoot* shadow_root = ContainingShadowRoot())
+    shadow_root->SetHasFocusgroupAttributeOnDescendant(true);
+
   EnsureElementRareData().SetFocusgroupFlags(
       focusgroup::ParseFocusgroup(this, input));
 }
 
+void Element::UpdateFocusgroupInShadowRootIfNeeded() {
+  ShadowRoot* shadow_root = GetShadowRoot();
+  DCHECK(shadow_root);
+
+  // There's no need to re-run the focusgroup parser on the nodes of the shadow
+  // tree if none of them had the focusgroup attribute set.
+  if (!shadow_root->HasFocusgroupAttributeOnDescendant())
+    return;
+
+  Element* ancestor = this;
+  bool has_focusgroup_ancestor = false;
+  while (ancestor) {
+    if (ancestor->GetFocusgroupFlags() != FocusgroupFlags::kNone) {
+      has_focusgroup_ancestor = true;
+      break;
+    }
+    ancestor = ancestor->parentElement();
+  }
+
+  // We don't need to update the focusgroup value for the ShadowDOM elements if
+  // there is no ancestor with a focusgroup value, since the parsing would be
+  // exactly the same as the one that happened when we first built the
+  // ShadowDOM.
+  if (!has_focusgroup_ancestor)
+    return;
+
+  // In theory, we should only reach this point when at least one node within
+  // the shadow tree has the focusgroup attribute. However, it's possible to get
+  // here if a node initially had the focusgroup attribute but then lost it
+  // since we don't reset the `ShadowRoot::HasFocusgroupAttributeOnDescendant`
+  // upon removing the attribute.
+  //
+  // Setting this value back to false before iterating over the nodes of the
+  // shadow tree allow us to reset the bit in case an update to the shadow tree
+  // removed all focusgroup attributes from the shadow tree. If there's still
+  // a focusgroup attribute, then the call to `UpdateFocusgroup` below will
+  // make sure that the bit is set to true for the containing shadow root.
+  shadow_root->SetHasFocusgroupAttributeOnDescendant(false);
+
+  Node* next = FlatTreeTraversal::Next(*this, this);
+  while (next) {
+    bool skip_subtree = false;
+    if (Element* next_element = DynamicTo<Element>(next)) {
+      const AtomicString& focusgroup_value =
+          next_element->FastGetAttribute(html_names::kFocusgroupAttr);
+      if (!focusgroup_value.IsNull())
+        next_element->UpdateFocusgroup(focusgroup_value);
+
+      if (auto* next_shadow_root = next_element->GetShadowRoot())
+        skip_subtree = !next_shadow_root->HasFocusgroupAttributeOnDescendant();
+    }
+
+    if (skip_subtree)
+      next = FlatTreeTraversal::NextSkippingChildren(*next, this);
+    else
+      next = FlatTreeTraversal::Next(*next, this);
+  }
+}
+
 void Element::WillModifyAttribute(const QualifiedName& name,
                                   const AtomicString& old_value,
                                   const AtomicString& new_value) {
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 022d9d9..4c0e11d 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -174,6 +174,11 @@
   kHide,
 };
 
+enum class HidePopupFocusBehavior {
+  kNone,
+  kFocusPreviousElement,
+};
+
 typedef HeapVector<Member<Attr>> AttrNodeList;
 
 typedef HashMap<AtomicString, SpecificTrustedType> AttrNameToTrustedType;
@@ -553,6 +558,7 @@
   bool popupOpen() const;
   void showPopup(ExceptionState& exception_state);
   void hidePopup(ExceptionState& exception_state);
+  void hidePopupInternal(HidePopupFocusBehavior focus_behavior);
   static const Element* NearestOpenAncestralPopup(Node* start_node);
   static void HandlePopupLightDismiss(const Event& event);
   void InvokePopup(Element* invoker);
@@ -1382,6 +1388,7 @@
   void UpdateName(const AtomicString& old_name, const AtomicString& new_name);
 
   void UpdateFocusgroup(const AtomicString& input);
+  void UpdateFocusgroupInShadowRootIfNeeded();
 
   void ClientQuads(Vector<gfx::QuadF>& quads) const;
 
diff --git a/third_party/blink/renderer/core/dom/element_test.cc b/third_party/blink/renderer/core/dom/element_test.cc
index bbcaf72..c6d6554 100644
--- a/third_party/blink/renderer/core/dom/element_test.cc
+++ b/third_party/blink/renderer/core/dom/element_test.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_token_list.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
+#include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
 #include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
@@ -668,7 +669,7 @@
 
 TEST_F(ElementTest, ParseFocusgroupAttrExtendCorrectly) {
   Document& document = GetDocument();
-  SetBodyContent(R"HTML(
+  document.body()->setInnerHTMLWithDeclarativeShadowDOMForTesting(R"HTML(
     <div id=fg1 focusgroup>
       <div id=fg2 focusgroup=extend>
         <div>
@@ -676,10 +677,15 @@
             <div id=fg3 focusgroup=extend></div>
           </div>
         </div>
+        <div id=fg4-container>
+          <template shadowroot=open>
+            <div id=fg4 focusgroup=extend></div>
+          </template>
+        </div>
       </div>
-      <div id=fg4 focusgroup></div>
+      <div id=fg5 focusgroup></div>
     </div>
-    <div id=fg5 focusgroup=extend>
+    <div id=fg6 focusgroup=extend>
   )HTML");
 
   // 1. Root focusgroup shouldn't extend any other.
@@ -707,22 +713,34 @@
   ASSERT_NE(fg3_flags, FocusgroupFlags::kNone);
   ASSERT_TRUE(fg3_flags & FocusgroupFlags::kExtend);
 
-  // 4. A focusgroup child of another focusgroup should only extend if the
-  // extend keyword is specified - in this case, it's not.
-  auto* fg4 = document.getElementById("fg4");
+  // 4. A focusgroup within a ShadowDOM should be able to extend its focusgroup
+  // ancestor that exists outside the ShadowDOM.
+  auto* fg4_container = document.getElementById("fg4-container");
+  ASSERT_TRUE(fg4_container);
+  ASSERT_NE(nullptr, fg4_container->GetShadowRoot());
+  auto* fg4 = fg4_container->GetShadowRoot()->getElementById("fg4");
   ASSERT_TRUE(fg4);
 
   FocusgroupFlags fg4_flags = fg4->GetFocusgroupFlags();
   ASSERT_NE(fg4_flags, FocusgroupFlags::kNone);
-  ASSERT_FALSE(fg4_flags & FocusgroupFlags::kExtend);
+  ASSERT_TRUE(fg4_flags & FocusgroupFlags::kExtend);
 
-  // 5. A focusgroup that doesn't have an ancestor focusgroup can't extend.
+  // 5. A focusgroup child of another focusgroup should only extend if the
+  // extend keyword is specified - in this case, it's not.
   auto* fg5 = document.getElementById("fg5");
   ASSERT_TRUE(fg5);
 
   FocusgroupFlags fg5_flags = fg5->GetFocusgroupFlags();
   ASSERT_NE(fg5_flags, FocusgroupFlags::kNone);
   ASSERT_FALSE(fg5_flags & FocusgroupFlags::kExtend);
+
+  // 6. A focusgroup that doesn't have an ancestor focusgroup can't extend.
+  auto* fg6 = document.getElementById("fg6");
+  ASSERT_TRUE(fg6);
+
+  FocusgroupFlags fg6_flags = fg6->GetFocusgroupFlags();
+  ASSERT_NE(fg6_flags, FocusgroupFlags::kNone);
+  ASSERT_FALSE(fg6_flags & FocusgroupFlags::kExtend);
 }
 
 TEST_F(ElementTest, ParseFocusgroupAttrWrapCorrectly) {
diff --git a/third_party/blink/renderer/core/dom/focusgroup_flags.cc b/third_party/blink/renderer/core/dom/focusgroup_flags.cc
index 7356ede..8f2f0ea 100644
--- a/third_party/blink/renderer/core/dom/focusgroup_flags.cc
+++ b/third_party/blink/renderer/core/dom/focusgroup_flags.cc
@@ -7,7 +7,7 @@
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
-#include "third_party/blink/renderer/core/dom/element_traversal.h"
+#include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
 #include "third_party/blink/renderer/core/dom/space_split_string.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -17,15 +17,14 @@
 namespace blink::focusgroup {
 
 FocusgroupFlags FindNearestFocusgroupAncestorFlags(const Element* element) {
-  // TODO(bebeaudr): We should be using FlatTreeTraversal here.
-  Element* ancestor = Traversal<Element>::FirstAncestor(*element);
+  Element* ancestor = FlatTreeTraversal::ParentElement(*element);
   while (ancestor) {
     FocusgroupFlags ancestor_flags = ancestor->GetFocusgroupFlags();
     // When this is true, we found the focusgroup to extend.
     if (ancestor_flags != FocusgroupFlags::kNone) {
       return ancestor_flags;
     }
-    ancestor = Traversal<Element>::FirstAncestor(*ancestor);
+    ancestor = FlatTreeTraversal::ParentElement(*ancestor);
   }
   return FocusgroupFlags::kNone;
 }
diff --git a/third_party/blink/renderer/core/dom/popup_data.h b/third_party/blink/renderer/core/dom/popup_data.h
index 29cf0a4a..4adeeabf 100644
--- a/third_party/blink/renderer/core/dom/popup_data.h
+++ b/third_party/blink/renderer/core/dom/popup_data.h
@@ -43,6 +43,13 @@
     return needs_repositioning_for_select_menu_;
   }
 
+  Element* previouslyFocusedElement() const {
+    return previously_focused_element_;
+  }
+  void setPreviouslyFocusedElement(Element* element) {
+    previously_focused_element_ = element;
+  }
+
   HTMLSelectMenuElement* ownerSelectMenuElement() const {
     return owner_select_menu_element_;
   }
@@ -52,6 +59,7 @@
 
   void Trace(Visitor* visitor) const {
     visitor->Trace(invoker_);
+    visitor->Trace(previously_focused_element_);
     visitor->Trace(owner_select_menu_element_);
   }
 
@@ -60,6 +68,7 @@
   bool had_defaultopen_when_parsed_ = false;
   PopupValueType type_ = PopupValueType::kNone;
   WeakMember<Element> invoker_;
+  WeakMember<Element> previously_focused_element_;
 
   // TODO(crbug.com/1197720): The popup position should be provided by the new
   // anchored positioning scheme.
diff --git a/third_party/blink/renderer/core/dom/shadow_root.cc b/third_party/blink/renderer/core/dom/shadow_root.cc
index 03cfb48..064576d 100644
--- a/third_party/blink/renderer/core/dom/shadow_root.cc
+++ b/third_party/blink/renderer/core/dom/shadow_root.cc
@@ -70,6 +70,7 @@
       delegates_focus_(false),
       slot_assignment_mode_(static_cast<unsigned>(SlotAssignmentMode::kNamed)),
       needs_dir_auto_attribute_update_(false),
+      has_focusgroup_attribute_on_descendant_(false),
       unused_(0) {}
 
 ShadowRoot::~ShadowRoot() = default;
diff --git a/third_party/blink/renderer/core/dom/shadow_root.h b/third_party/blink/renderer/core/dom/shadow_root.h
index 4dcf7a8..925d0cf4c 100644
--- a/third_party/blink/renderer/core/dom/shadow_root.h
+++ b/third_party/blink/renderer/core/dom/shadow_root.h
@@ -173,6 +173,13 @@
     return needs_dir_auto_attribute_update_;
   }
 
+  void SetHasFocusgroupAttributeOnDescendant(bool flag) {
+    has_focusgroup_attribute_on_descendant_ = flag;
+  }
+  bool HasFocusgroupAttributeOnDescendant() const {
+    return has_focusgroup_attribute_on_descendant_;
+  }
+
   bool ContainsShadowRoots() const { return child_shadow_root_count_; }
 
   StyleSheetList& StyleSheets();
@@ -214,7 +221,8 @@
   unsigned is_declarative_shadow_root_ : 1;
   unsigned available_to_element_internals_ : 1;
   unsigned needs_dir_auto_attribute_update_ : 1;
-  unsigned unused_ : 8;
+  unsigned has_focusgroup_attribute_on_descendant_ : 1;
+  unsigned unused_ : 7;
 };
 
 inline Element* ShadowRoot::ActiveElement() const {
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
index 7dd207d..b098fbd 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -203,7 +203,7 @@
   // If there are any open popups, close them, unless this fullscreen
   // element is a descendant of an open popup.
   if (RuntimeEnabledFeatures::HTMLPopupAttributeEnabled())
-    document.HideAllPopupsUntil(&element);
+    document.HideAllPopupsUntil(&element, HidePopupFocusBehavior::kNone);
 
   // To fullscreen an |element| within a |document|, set the |element|'s
   // fullscreen flag and add it to |document|'s top layer.
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc
index c816434..9c64af8 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -117,7 +117,19 @@
       if (popup.element->popupOpen() &&
           (popup.action == PopupTriggerAction::kToggle ||
            popup.action == PopupTriggerAction::kHide)) {
-        popup.element->hidePopup(ASSERT_NO_EXCEPTION);
+        // Note that the order is: `mousedown` which runs popup light dismiss
+        // code, then (for clicked elements) focus is set to the clicked
+        // element, then |DOMActivate| runs here. Also note that the light
+        // dismiss code will not hide popups when an activating element is
+        // clicked. Taking that together, if the clicked control is a triggering
+        // element for a popup, light dismiss will do nothing, focus will be set
+        // to the triggering element, then this code will run and will set focus
+        // to the previously focused element. If instead the clicked control is
+        // not a triggering element, then the light dismiss code will hide the
+        // popup and set focus to the previously focused element, then the
+        // normal focus management code will reset focus to the clicked control.
+        popup.element->hidePopupInternal(
+            HidePopupFocusBehavior::kFocusPreviousElement);
       } else if (!popup.element->popupOpen() &&
                  (popup.action == PopupTriggerAction::kToggle ||
                   popup.action == PopupTriggerAction::kShow)) {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc
index 3bd23990..c9aa532 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_menu_element.cc
@@ -338,7 +338,8 @@
 void HTMLSelectMenuElement::CloseListbox() {
   if (listbox_part_ && open()) {
     if (listbox_part_->HasValidPopupAttribute()) {
-      listbox_part_->hidePopup(ASSERT_NO_EXCEPTION);
+      // We will handle focus directly.
+      listbox_part_->hidePopupInternal(HidePopupFocusBehavior::kNone);
     }
     if (button_part_) {
       button_part_->Focus();
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index d3fe2cd..b7f2666 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -185,7 +185,7 @@
 
   // Showing a <dialog> should hide all open popups.
   if (RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()) {
-    GetDocument().HideAllPopupsUntil(nullptr);
+    GetDocument().HideAllPopupsUntil(nullptr, HidePopupFocusBehavior::kNone);
   }
 
   // The layout must be updated here because setFocusForDialog calls
@@ -243,7 +243,7 @@
 
   // Showing a <dialog> should hide all open popups.
   if (RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()) {
-    document.HideAllPopupsUntil(nullptr);
+    document.HideAllPopupsUntil(nullptr, HidePopupFocusBehavior::kNone);
   }
 
   document.AddToTopLayer(this);
diff --git a/third_party/blink/renderer/core/page/focusgroup_controller_test.cc b/third_party/blink/renderer/core/page/focusgroup_controller_test.cc
index 39101fb..de17ee0 100644
--- a/third_party/blink/renderer/core/page/focusgroup_controller_test.cc
+++ b/third_party/blink/renderer/core/page/focusgroup_controller_test.cc
@@ -390,7 +390,7 @@
   if (!RuntimeEnabledFeatures::LayoutNGEnabled())
     return;
 
-  GetDocument().body()->setInnerHTML(R"HTML(
+  GetDocument().body()->setInnerHTMLWithDeclarativeShadowDOMForTesting(R"HTML(
     <div>
       <span id=item1 tabindex=0></span>
     </div>
@@ -415,12 +415,22 @@
               </td>
             </tr>
           </table>
+          <div id=fg6-container>
+            <template shadowroot=open>
+              <div id=fg6 focusgroup=extend>
+                <span id=item8 tabindex=-1></span>
+              </div>
+            </template>
+          </div>
         </div>
       </div>
     </div>
   )HTML");
   UpdateAllLifecyclePhasesForTest();
 
+  auto* fg6_container = GetElementById("fg6-container");
+  ASSERT_TRUE(fg6_container);
+
   auto* item1 = GetElementById("item1");
   auto* item2 = GetElementById("item2");
   auto* item3 = GetElementById("item3");
@@ -428,11 +438,13 @@
   auto* item5 = GetElementById("item5");
   auto* item6 = GetElementById("item6");
   auto* item7 = GetElementById("item7");
+  auto* item8 = fg6_container->GetShadowRoot()->getElementById("item8");
   auto* fg1 = GetElementById("fg1");
   auto* fg2 = GetElementById("fg2");
   auto* fg3 = GetElementById("fg3");
   auto* fg4 = GetElementById("fg4");
   auto* fg5 = GetElementById("fg5");
+  auto* fg6 = fg6_container->GetShadowRoot()->getElementById("fg6");
   ASSERT_TRUE(item1);
   ASSERT_TRUE(item2);
   ASSERT_TRUE(item3);
@@ -440,11 +452,13 @@
   ASSERT_TRUE(item5);
   ASSERT_TRUE(item6);
   ASSERT_TRUE(item7);
+  ASSERT_TRUE(item8);
   ASSERT_TRUE(fg1);
   ASSERT_TRUE(fg2);
   ASSERT_TRUE(fg3);
   ASSERT_TRUE(fg4);
   ASSERT_TRUE(fg5);
+  ASSERT_TRUE(fg6);
 
   EXPECT_EQ(
       utils::FindNearestFocusgroupAncestor(item1, FocusgroupType::kLinear),
@@ -481,6 +495,15 @@
       fg5);
   EXPECT_EQ(utils::FindNearestFocusgroupAncestor(item7, FocusgroupType::kGrid),
             nullptr);
+  EXPECT_EQ(
+      utils::FindNearestFocusgroupAncestor(item8, FocusgroupType::kLinear),
+      fg6);
+  EXPECT_EQ(utils::FindNearestFocusgroupAncestor(item8, FocusgroupType::kGrid),
+            nullptr);
+  EXPECT_EQ(utils::FindNearestFocusgroupAncestor(fg6, FocusgroupType::kLinear),
+            fg2);
+  EXPECT_EQ(utils::FindNearestFocusgroupAncestor(fg6, FocusgroupType::kGrid),
+            nullptr);
 }
 
 TEST_F(FocusgroupControllerTest, NextElement) {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index e52a22f..a4d3be15 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -424,11 +424,6 @@
         static_cast<int>(configuration->rtcAudioJitterBufferMinDelayMs());
   }
 
-  if (RuntimeEnabledFeatures::RtcAudioJitterBufferRtxHandlingEnabled(context)) {
-    UseCounter::Count(context, WebFeature::kRTCAudioJitterBufferRtxHandling);
-    web_configuration.audio_jitter_buffer_enable_rtx_handling = true;
-  }
-
   return web_configuration;
 }
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 2920e00d..5fdbe59 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1990,11 +1990,6 @@
       origin_trial_feature_name: "RtcAudioJitterBufferMaxPackets",
       status: "experimental",
     },
-    {
-      name: "RtcAudioJitterBufferRtxHandling",
-      origin_trial_feature_name: "RtcAudioJitterBufferRtxHandling",
-      status: "experimental",
-    },
     // Enables the use of the RTCIceTransport with extensions.
     {
       name: "RTCIceTransportExtension",
@@ -2622,7 +2617,7 @@
     },
     {
       name: "WebGLColorManagement",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "WebGLDeveloperExtensions",
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
index 1bf3d56..88c8caa 100644
--- a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
@@ -140,11 +140,14 @@
 }
 
 void SchedulerHelper::OnBeginNestedRunLoop() {
+  ++nested_runloop_depth_;
   if (observer_)
     observer_->OnBeginNestedRunLoop();
 }
 
 void SchedulerHelper::OnExitNestedRunLoop() {
+  --nested_runloop_depth_;
+  DCHECK_GE(nested_runloop_depth_, 0);
   if (observer_)
     observer_->OnExitNestedRunLoop();
 }
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
index 9cac378..6a5698fe 100644
--- a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
+++ b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
@@ -116,6 +116,10 @@
   bool ShouldRecordTaskUkm(bool task_has_thread_time) {
     return ukm_task_sampler_.ShouldRecordTaskUkm(task_has_thread_time);
   }
+  bool IsInNestedRunloop() const {
+    CheckOnValidThread();
+    return nested_runloop_depth_ > 0;
+  }
 
   // Test helpers.
   void SetWorkBatchSizeForTesting(int work_batch_size);
@@ -138,6 +142,8 @@
 
   UkmTaskSampler ukm_task_sampler_;
   absl::optional<base::SimpleTaskExecutor> simple_task_executor_;
+  // Depth of nested_runloop.
+  int nested_runloop_depth_ = 0;
 };
 
 }  // namespace scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index e024014c..713fafd 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -462,10 +462,6 @@
 
 MainThreadSchedulerImpl::MainThreadOnly::~MainThreadOnly() = default;
 
-bool MainThreadSchedulerImpl::MainThreadOnly::IsInNestedRunloop() {
-  return nested_runloop_depth != 0;
-}
-
 MainThreadSchedulerImpl::AnyThread::AnyThread(
     MainThreadSchedulerImpl* main_thread_scheduler_impl)
     : awaiting_touch_start_response(
@@ -1889,7 +1885,7 @@
   switch (main_thread_only().virtual_time_policy) {
     case VirtualTimePolicy::kAdvance:
       virtual_time_domain_->SetMaxVirtualTimeTaskStarvationCount(
-          main_thread_only().IsInNestedRunloop()
+          helper_.IsInNestedRunloop()
               ? 0
               : main_thread_only().max_virtual_time_task_starvation_count);
       virtual_time_domain_->SetVirtualTimeFence(base::TimeTicks());
@@ -1902,7 +1898,7 @@
       break;
     case VirtualTimePolicy::kDeterministicLoading:
       virtual_time_domain_->SetMaxVirtualTimeTaskStarvationCount(
-          main_thread_only().IsInNestedRunloop()
+          helper_.IsInNestedRunloop()
               ? 0
               : main_thread_only().max_virtual_time_task_starvation_count);
 
@@ -1911,7 +1907,7 @@
       // system. We also pause while the renderer is waiting for various
       // asynchronous things e.g. resource load or navigation.
       SetVirtualTimeStopped(main_thread_only().virtual_time_pause_count != 0 ||
-                            main_thread_only().IsInNestedRunloop());
+                            helper_.IsInNestedRunloop());
       break;
   }
 }
@@ -2390,6 +2386,18 @@
   return this;
 }
 
+void MainThreadSchedulerImpl::OnBeginNestedRunLoop() {
+  DCHECK(!main_thread_only().running_queues.empty());
+  if (IsVirtualTimeEnabled())
+    ApplyVirtualTimePolicy();
+}
+
+void MainThreadSchedulerImpl::OnExitNestedRunLoop() {
+  DCHECK(!main_thread_only().running_queues.empty());
+  if (IsVirtualTimeEnabled())
+    ApplyVirtualTimePolicy();
+}
+
 const base::TickClock* MainThreadSchedulerImpl::GetTickClock() const {
   return helper_.GetClock();
 }
@@ -2475,7 +2483,7 @@
   }
 
   main_thread_only().running_queues.push(queue);
-  if (main_thread_only().IsInNestedRunloop())
+  if (helper_.IsInNestedRunloop())
     return;
 
   main_thread_only().current_task_start_time = task_timing.start_time();
@@ -2513,7 +2521,7 @@
   if (scheduling_settings().mbi_override_task_runner_handle)
     EndAgentGroupSchedulerScope();
 
-  if (main_thread_only().IsInNestedRunloop())
+  if (helper_.IsInNestedRunloop())
     return;
 
   DispatchOnTaskCompletionCallbacks();
@@ -2655,20 +2663,6 @@
   }
 }
 
-void MainThreadSchedulerImpl::OnBeginNestedRunLoop() {
-  DCHECK(!main_thread_only().running_queues.empty());
-  main_thread_only().nested_runloop_depth++;
-  if (IsVirtualTimeEnabled())
-    ApplyVirtualTimePolicy();
-}
-
-void MainThreadSchedulerImpl::OnExitNestedRunLoop() {
-  DCHECK(!main_thread_only().running_queues.empty());
-  main_thread_only().nested_runloop_depth--;
-  if (IsVirtualTimeEnabled())
-    ApplyVirtualTimePolicy();
-}
-
 void MainThreadSchedulerImpl::AddTaskTimeObserver(
     TaskTimeObserver* task_time_observer) {
   helper_.AddTaskTimeObserver(task_time_observer);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index 1f8a1719..9db6948 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -82,7 +82,7 @@
     : public ThreadSchedulerImpl,
       public VirtualTimeController,
       public IdleHelper::Delegate,
-      public MainThreadSchedulerHelper::Observer,
+      public SchedulerHelper::Observer,
       public RenderWidgetSignals::Observer,
       public base::trace_event::TraceLog::AsyncEnabledStateObserver {
  public:
@@ -259,10 +259,6 @@
   void SetHasVisibleRenderWidgetWithTouchHandler(
       bool has_visible_render_widget_with_touch_handler) override;
 
-  // SchedulerHelper::Observer implementation:
-  void OnBeginNestedRunLoop() override;
-  void OnExitNestedRunLoop() override;
-
   // ThreadSchedulerImpl implementation:
   scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner> ControlTaskRunner() override;
@@ -466,6 +462,10 @@
   // WebThreadScheduler private implementation:
   WebThreadScheduler* GetWebMainThreadScheduler() override;
 
+  // SchedulerHelper::Observer implementation:
+  void OnBeginNestedRunLoop() override;
+  void OnExitNestedRunLoop() override;
+
   static const char* TimeDomainTypeToString(TimeDomainType domain_type);
 
   void AddAgentGroupScheduler(AgentGroupSchedulerImpl*);
@@ -889,9 +889,6 @@
                std::vector<scoped_refptr<MainThreadTaskQueue>>>
         running_queues;
 
-    // Depth of nested_runloop.
-    int nested_runloop_depth = 0;
-
     // High-priority for compositing events after input. This will cause
     // compositing events get a higher priority until the start of the next
     // animation frame.
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
index 7fd40db..94a11af7 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -897,10 +897,10 @@
   const base::TimeTicks start = scheduler_->NowTicks();
   scheduler_->OnTaskStarted(nullptr, fake_task,
                             FakeTaskTiming(start, base::TimeTicks()));
-  scheduler_->OnBeginNestedRunLoop();
+  scheduler_->GetSchedulerHelperForTesting()->OnBeginNestedRunLoop();
   EXPECT_FALSE(scheduler_->VirtualTimeAllowedToAdvance());
 
-  scheduler_->OnExitNestedRunLoop();
+  scheduler_->GetSchedulerHelperForTesting()->OnExitNestedRunLoop();
   EXPECT_TRUE(scheduler_->VirtualTimeAllowedToAdvance());
   FakeTaskTiming task_timing(start, scheduler_->NowTicks());
   scheduler_->OnTaskCompleted(nullptr, fake_task, &task_timing, nullptr);
@@ -1044,7 +1044,7 @@
   const base::TimeTicks start = scheduler_->NowTicks();
   scheduler_->OnTaskStarted(nullptr, fake_task,
                             FakeTaskTiming(start, base::TimeTicks()));
-  scheduler_->OnBeginNestedRunLoop();
+  scheduler_->GetSchedulerHelperForTesting()->OnBeginNestedRunLoop();
 
   int count = 0;
   int delayed_task_run_at_count = 0;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html
index 66fd7fb..6fccb0f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html
@@ -3,8 +3,13 @@
 <title>Popup focus behaviors</title>
 <link rel="author" href="mailto:masonf@chromium.org">
 <link rel=help href="https://open-ui.org/components/popup.research.explainer">
+<meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popup-utils.js"></script>
 
 <div popup=popup data-test='default behavior - popup is not focused' data-no-focus>
   <p>This is a popup</p>
@@ -98,47 +103,172 @@
 </style>
 
 <script>
+  function addInvoker(t, popup) {
+    const button = document.createElement('button');
+    button.innerText = 'Click me';
+    const popupId = 'popup-id';
+    assert_equals(document.querySelectorAll('#' + popupId).length, 0);
+    document.body.appendChild(button);
+    t.add_cleanup(function() {
+      popup.removeAttribute('id');
+      button.remove();
+    });
+    popup.id = popupId;
+    button.setAttribute('togglepopup', popupId);
+    return button;
+  }
+  function addPriorFocus(t) {
+    const priorFocus = document.createElement('button');
+    document.body.appendChild(priorFocus);
+    t.add_cleanup(() => priorFocus.remove());
+    return priorFocus;
+  }
   function activateAndVerify(popup) {
     const testName = popup.getAttribute('data-test');
-    const priorFocus = document.createElement('button');
-    priorFocus.id = 'prior-focus';
-    document.body.appendChild(priorFocus);
-    let expectedFocusedElement = popup.matches('.should-be-focused') ? popup : popup.querySelector('.should-be-focused');
-    if (popup.hasAttribute('data-no-focus')) {
-      expectedFocusedElement = priorFocus;
-    }
-    test(t => {
-      t.add_cleanup(() => priorFocus.remove());
+    promise_test(async t => {
+      const priorFocus = addPriorFocus(t);
+      let expectedFocusedElement = popup.matches('.should-be-focused') ? popup : popup.querySelector('.should-be-focused');
+      if (popup.hasAttribute('data-no-focus')) {
+        expectedFocusedElement = priorFocus;
+      }
       assert_true(!!expectedFocusedElement);
       assert_false(popup.matches(':popup-open'));
-      priorFocus.focus();
-      assert_equals(document.activeElement,priorFocus);
 
-      // Directly show the popup:
+      // Directly show and hide the popup:
+      priorFocus.focus();
+      assert_equals(document.activeElement, priorFocus);
       popup.showPopup();
       assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by popup.showPopup()`);
       popup.hidePopup();
+      assert_equals(document.activeElement, priorFocus, 'prior element should get focus on hide');
+
+      // Hit Escape:
+      priorFocus.focus();
+      assert_equals(document.activeElement, priorFocus);
+      popup.showPopup();
+      assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by popup.showPopup()`);
+      await sendEscape();
+      assert_equals(document.activeElement, priorFocus, 'prior element should get focus after Escape');
+
+      // Change the popup type:
+      priorFocus.focus();
+      popup.showPopup();
+      assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by popup.showPopup()`);
+      assert_equals(popup.popup, 'popup', 'All popups in this test should start as popup=popup');
+      popup.popup = 'hint';
+      assert_false(popup.matches(':popup-open'), 'Changing the popup type should hide the popup');
+      assert_equals(document.activeElement, priorFocus, 'prior element should get focus when the type is changed');
+      popup.popup = 'popup';
+
+      // Remove from the document:
+      priorFocus.focus();
+      popup.showPopup();
+      assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by popup.showPopup()`);
+      popup.remove();
+      assert_false(popup.matches(':popup-open'), 'Removing the popup should hide it');
+      if (!popup.hasAttribute('data-no-focus')) {
+        assert_not_equals(document.activeElement, priorFocus, 'prior element should *not* get focus when the popup is removed from the document');
+      }
+      document.body.appendChild(popup);
+
+      // Show a modal dialog:
+      priorFocus.focus();
+      popup.showPopup();
+      assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by popup.showPopup()`);
+      const dialog = document.body.appendChild(document.createElement('dialog'));
+      dialog.showModal();
+      assert_false(popup.matches(':popup-open'), 'Opening a modal dialog should hide the popup');
+      assert_not_equals(document.activeElement, priorFocus, 'prior element should *not* get focus when a modal dialog is shown');
+      dialog.close();
+      dialog.remove();
 
       // Use an activating element:
-      const button = document.createElement('button');
-      const popupId = 'popup-id';
-      assert_equals(document.querySelectorAll('#' + popupId).length,0);
-      document.body.appendChild(button);
-      t.add_cleanup(function() {
-        popup.removeAttribute('id');
-        button.remove();
-      });
-      popup.id = popupId;
-      button.setAttribute('togglepopup', popupId);
+      const button = addInvoker(t, popup);
       priorFocus.focus();
       button.click();
+      assert_true(popup.matches(':popup-open'));
       assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by button.click()`);
 
       // Make sure we can directly focus the (already open) popup:
       popup.focus();
       assert_equals(document.activeElement, popup.hasAttribute('tabindex') ? popup : expectedFocusedElement, `${testName} directly focus with popup.focus()`);
-      popup.hidePopup();
+      button.click(); // Button is set to toggle the popup
+      assert_false(popup.matches(':popup-open'));
+      assert_equals(document.activeElement, priorFocus, 'prior element should get focus on button-toggled hide');
     }, "Popup focus test: " + testName);
+
+    promise_test(async t => {
+      const priorFocus = addPriorFocus(t);
+      assert_false(popup.matches(':popup-open'), 'popup should start out hidden');
+      let button = addInvoker(t, popup);
+      assert_equals(button.getAttribute('togglepopup'), popup.id, 'This test assumes the button uses `togglepopup`.');
+      assert_not_equals(button, priorFocus, 'Stranger things have happened');
+      assert_false(popup.contains(button), 'Start with a non-contained button');
+      priorFocus.focus();
+      assert_equals(document.activeElement, priorFocus);
+      popup.showPopup();
+      assert_true(popup.matches(':popup-open'));
+      await clickOn(button); // This will not light dismiss, but will "toggle" the popup.
+      assert_false(popup.matches(':popup-open'));
+      assert_equals(document.activeElement, priorFocus, 'Focus should return to prior focus');
+
+      // Same thing, but the button is contained within the popup
+      button.removeAttribute('togglepopup');
+      button.setAttribute('hidepopup', popup.id);
+      popup.appendChild(button);
+      priorFocus.focus();
+      popup.showPopup();
+      assert_true(popup.matches(':popup-open'));
+      if (!popup.hasAttribute('data-no-focus')) {
+        assert_not_equals(document.activeElement, priorFocus, 'focus should shift for this element');
+      }
+      await clickOn(button);
+      assert_false(popup.matches(':popup-open'), 'clicking button should hide the popup');
+      assert_equals(document.activeElement, priorFocus, 'Contained button should return focus to the previously focused element');
+
+      // Same thing, but the button is unrelated (no togglepopup)
+      button = document.createElement('button');
+      document.body.appendChild(button);
+      priorFocus.focus();
+      popup.showPopup();
+      assert_true(popup.matches(':popup-open'));
+      await clickOn(button); // This will light dismiss the popup, focus the prior focus, then focus this button.
+      assert_false(popup.matches(':popup-open'), 'clicking button should hide the popup (via light dismiss)');
+      assert_equals(document.activeElement, button, 'Focus should go to unrelated button on light dismiss');
+    }, "Popup button click focus test: " + testName);
+
+    promise_test(async t => {
+      if (popup.hasAttribute('data-no-focus')) {
+        // This test only applies if the popup changes focus
+        return;
+      }
+      const priorFocus = addPriorFocus(t);
+      assert_false(popup.matches(':popup-open'), 'popup should start out hidden');
+
+      // Move the prior focus out of the document
+      priorFocus.focus();
+      popup.showPopup();
+      assert_true(popup.matches(':popup-open'));
+      const newFocus = document.activeElement;
+      assert_not_equals(newFocus, priorFocus, 'focus should shift for this element');
+      priorFocus.remove();
+      assert_equals(document.activeElement, newFocus, 'focus should not change when prior focus is removed');
+      popup.hidePopup();
+      assert_not_equals(document.activeElement, priorFocus, 'focused element has been removed');
+      document.body.appendChild(priorFocus); // Put it back
+
+      // Move the prior focus inside the (already open) popup
+      priorFocus.focus();
+      popup.showPopup();
+      assert_true(popup.matches(':popup-open'));
+      assert_false(popup.contains(priorFocus), 'Start with a non-contained prior focus');
+      popup.appendChild(priorFocus); // Move inside the popup
+      assert_true(popup.contains(priorFocus));
+      assert_true(popup.matches(':popup-open'), 'popup should stay open');
+      popup.hidePopup();
+      assert_not_equals(document.activeElement, priorFocus, 'focused element is display:none inside the popup');
+      document.body.appendChild(priorFocus); // Put it back
+    }, "Popup corner cases test: " + testName);
   }
 
   document.querySelectorAll('body > [popup]').forEach(popup => activateAndVerify(popup));
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
index e2a91b5..e3c05fa 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
@@ -8,8 +8,10 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-actions.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/popup-utils.js"></script>
 
-<button id=b1 togglepopup='p1'>Popup 1</button>
+<button id=b1t togglepopup='p1'>Popup 1</button>
+<button id=b1s showpopup='p1'>Popup 1</button>
 <button id=p1anchor>Popup1 anchor (no action)</button>
 <span id=outside>Outside all popups</span>
 <div popup=popup id=p1 anchor=p1anchor>
@@ -30,26 +32,9 @@
   }
 </style>
 <script>
-  function spinEventLoop() {
-    return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
-  }
-  async function clickOn(element) {
-    const actions = new test_driver.Actions();
-    await spinEventLoop();
-    await actions.pointerMove(0, 0, {origin: element})
-        .pointerDown({button: actions.ButtonType.LEFT})
-        .pointerUp({button: actions.ButtonType.LEFT})
-        .send();
-    await spinEventLoop();
-  }
-  async function sendTab() {
-    await spinEventLoop();
-    await new test_driver.send_keys(document.body,'\uE004'); // Tab
-    await spinEventLoop();
-  }
-
   const popup1 = document.querySelector('#p1');
-  const button1 = document.querySelector('#b1');
+  const button1toggle = document.querySelector('#b1t');
+  const button1show = document.querySelector('#b1s');
   const popup1anchor = document.querySelector('#p1anchor');
   const inside1After = document.querySelector('#inside1after');
   const popup2 = document.querySelector('#p2');
@@ -81,7 +66,7 @@
   promise_test(async () => {
     assert_false(popup1.matches(':popup-open'));
     popup1.showPopup();
-    await spinEventLoop();
+    await waitForRender();
     p1HideCount = popup1HideCount;
     await clickOn(inside1);
     assert_true(popup1.matches(':popup-open'));
@@ -102,7 +87,7 @@
   promise_test(async () => {
     popup1.showPopup();
     popup2.showPopup();
-    await spinEventLoop();
+    await waitForRender();
     p1HideCount = popup1HideCount;
     let p2HideCount = popup2HideCount;
     await clickOn(inside2);
@@ -118,7 +103,7 @@
   promise_test(async () => {
     popup1.showPopup();
     popup2.showPopup();
-    await spinEventLoop();
+    await waitForRender();
     p1HideCount = popup1HideCount;
     p2HideCount = popup2HideCount;
     await clickOn(inside1);
@@ -130,9 +115,43 @@
   },'Clicking inside a parent popup should close child popup');
 
   promise_test(async () => {
+    await clickOn(button1show);
+    assert_true(popup1.matches(':popup-open'));
+    await waitForRender();
+    p1HideCount = popup1HideCount;
+    await clickOn(button1show);
+    assert_true(popup1.matches(':popup-open'),'popup1 should stay open');
+    assert_equals(popup1HideCount,p1HideCount,'popup1 should not get hidden and reshown');
+    popup1.hidePopup(); // Cleanup
+    assert_false(popup1.matches(':popup-open'));
+  },'Clicking on invoking element, after using it for activation, shouldn\'t close its popup');
+
+  promise_test(async () => {
+    popup1.showPopup(); // Directly show the popup
+    assert_true(popup1.matches(':popup-open'));
+    await waitForRender();
+    p1HideCount = popup1HideCount;
+    await clickOn(button1show);
+    assert_true(popup1.matches(':popup-open'),'popup1 should stay open');
+    assert_equals(popup1HideCount,p1HideCount,'popup1 should not get hidden and reshown');
+    popup1.hidePopup(); // Cleanup
+    assert_false(popup1.matches(':popup-open'));
+  },'Clicking on invoking element, even if it wasn\'t used for activation, shouldn\'t close its popup');
+
+  promise_test(async () => {
+    popup1.showPopup(); // Directly show the popup
+    assert_true(popup1.matches(':popup-open'));
+    await waitForRender();
+    p1HideCount = popup1HideCount;
+    await clickOn(button1toggle);
+    assert_false(popup1.matches(':popup-open'),'popup1 should be hidden by togglepopup');
+    assert_equals(popup1HideCount,p1HideCount+1,'popup1 should get hidden only once by togglepopup');
+  },'Clicking on togglepopup element, even if it wasn\'t used for activation, should hide it exactly once');
+
+  promise_test(async () => {
     popup1.showPopup();
     assert_true(popup1.matches(':popup-open'));
-    await spinEventLoop();
+    await waitForRender();
     p1HideCount = popup1HideCount;
     await clickOn(popup1anchor);
     assert_true(popup1.matches(':popup-open'),'popup1 not open');
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/resources/popup-utils.js b/third_party/blink/web_tests/external/wpt/html/semantics/popups/resources/popup-utils.js
new file mode 100644
index 0000000..36a344b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/resources/popup-utils.js
@@ -0,0 +1,22 @@
+function waitForRender() {
+  return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
+}
+async function clickOn(element) {
+  const actions = new test_driver.Actions();
+  await waitForRender();
+  await actions.pointerMove(0, 0, {origin: element})
+      .pointerDown({button: actions.ButtonType.LEFT})
+      .pointerUp({button: actions.ButtonType.LEFT})
+      .send();
+  await waitForRender();
+}
+async function sendTab() {
+  await waitForRender();
+  await new test_driver.send_keys(document.body,'\uE004'); // Tab
+  await waitForRender();
+}
+async function sendEscape() {
+  await waitForRender();
+  await new test_driver.send_keys(document.body,'\uE00C'); // Escape
+  await waitForRender();
+}
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 597cbdaa..f6c7a061 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -2034,8 +2034,10 @@
     attribute WAIT_FAILED
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method beginQuery
@@ -2262,6 +2264,8 @@
     method vertexAttribPointer
     method viewport
     method waitSync
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLActiveInfo
     attribute @@toStringTag
     getter name
@@ -2582,8 +2586,10 @@
     attribute VIEWPORT
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method bindAttribLocation
@@ -2722,6 +2728,8 @@
     method vertexAttrib4fv
     method vertexAttribPointer
     method viewport
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLSampler
     attribute @@toStringTag
     method constructor
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
index c37bd86..21a67974f 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -2195,8 +2195,10 @@
 [Worker]     attribute WAIT_FAILED
 [Worker]     attribute ZERO
 [Worker]     getter canvas
+[Worker]     getter drawingBufferColorSpace
 [Worker]     getter drawingBufferHeight
 [Worker]     getter drawingBufferWidth
+[Worker]     getter unpackColorSpace
 [Worker]     method activeTexture
 [Worker]     method attachShader
 [Worker]     method beginQuery
@@ -2423,6 +2425,8 @@
 [Worker]     method vertexAttribPointer
 [Worker]     method viewport
 [Worker]     method waitSync
+[Worker]     setter drawingBufferColorSpace
+[Worker]     setter unpackColorSpace
 [Worker] interface WebGLActiveInfo
 [Worker]     attribute @@toStringTag
 [Worker]     getter name
@@ -2743,8 +2747,10 @@
 [Worker]     attribute VIEWPORT
 [Worker]     attribute ZERO
 [Worker]     getter canvas
+[Worker]     getter drawingBufferColorSpace
 [Worker]     getter drawingBufferHeight
 [Worker]     getter drawingBufferWidth
+[Worker]     getter unpackColorSpace
 [Worker]     method activeTexture
 [Worker]     method attachShader
 [Worker]     method bindAttribLocation
@@ -2883,6 +2889,8 @@
 [Worker]     method vertexAttrib4fv
 [Worker]     method vertexAttribPointer
 [Worker]     method viewport
+[Worker]     setter drawingBufferColorSpace
+[Worker]     setter unpackColorSpace
 [Worker] interface WebGLSampler
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
index 625a63e..048d274b 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -8799,8 +8799,10 @@
     attribute WAIT_FAILED
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method beginQuery
@@ -9027,6 +9029,8 @@
     method vertexAttribPointer
     method viewport
     method waitSync
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLActiveInfo
     attribute @@toStringTag
     getter name
@@ -9351,8 +9355,10 @@
     attribute VIEWPORT
     attribute ZERO
     getter canvas
+    getter drawingBufferColorSpace
     getter drawingBufferHeight
     getter drawingBufferWidth
+    getter unpackColorSpace
     method activeTexture
     method attachShader
     method bindAttribLocation
@@ -9491,6 +9497,8 @@
     method vertexAttrib4fv
     method vertexAttribPointer
     method viewport
+    setter drawingBufferColorSpace
+    setter unpackColorSpace
 interface WebGLSampler
     attribute @@toStringTag
     method constructor
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
index 46ac889..41aab633 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1924,8 +1924,10 @@
 [Worker]     attribute WAIT_FAILED
 [Worker]     attribute ZERO
 [Worker]     getter canvas
+[Worker]     getter drawingBufferColorSpace
 [Worker]     getter drawingBufferHeight
 [Worker]     getter drawingBufferWidth
+[Worker]     getter unpackColorSpace
 [Worker]     method activeTexture
 [Worker]     method attachShader
 [Worker]     method beginQuery
@@ -2152,6 +2154,8 @@
 [Worker]     method vertexAttribPointer
 [Worker]     method viewport
 [Worker]     method waitSync
+[Worker]     setter drawingBufferColorSpace
+[Worker]     setter unpackColorSpace
 [Worker] interface WebGLActiveInfo
 [Worker]     attribute @@toStringTag
 [Worker]     getter name
@@ -2472,8 +2476,10 @@
 [Worker]     attribute VIEWPORT
 [Worker]     attribute ZERO
 [Worker]     getter canvas
+[Worker]     getter drawingBufferColorSpace
 [Worker]     getter drawingBufferHeight
 [Worker]     getter drawingBufferWidth
+[Worker]     getter unpackColorSpace
 [Worker]     method activeTexture
 [Worker]     method attachShader
 [Worker]     method bindAttribLocation
@@ -2612,6 +2618,8 @@
 [Worker]     method vertexAttrib4fv
 [Worker]     method vertexAttribPointer
 [Worker]     method viewport
+[Worker]     setter drawingBufferColorSpace
+[Worker]     setter unpackColorSpace
 [Worker] interface WebGLSampler
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
diff --git a/third_party/blink/web_tests/wpt_internal/storage/buckets/bucket_persist.tentative.https.window.js b/third_party/blink/web_tests/wpt_internal/storage/buckets/bucket_persist.tentative.https.window.js
deleted file mode 100644
index 7aee439..0000000
--- a/third_party/blink/web_tests/wpt_internal/storage/buckets/bucket_persist.tentative.https.window.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-// TODO(ayui): This tests temporary behavior and should be removed when fully
-// implemented. persist() should request for bucket persistence but not
-// guarantee it.
-promise_test(async testCase => {
-  const bucket = await navigator.storageBuckets.open('bucket_name');
-  testCase.add_cleanup(async () => {
-    await navigator.storageBuckets.delete('bucket_name');
-  });
-  let persisted = await bucket.persisted();
-  assert_false(persisted);
-
-  await bucket.persist();
-
-  persisted = await bucket.persisted();
-  assert_true(persisted);
-}, 'persist() should request persistance for bucket');
-
diff --git a/third_party/blink/web_tests/wpt_internal/storage/buckets/storage_bucket_object.tentative.https.any.js b/third_party/blink/web_tests/wpt_internal/storage/buckets/storage_bucket_object.tentative.https.any.js
index c04f2b4..04d56b79 100644
--- a/third_party/blink/web_tests/wpt_internal/storage/buckets/storage_bucket_object.tentative.https.any.js
+++ b/third_party/blink/web_tests/wpt_internal/storage/buckets/storage_bucket_object.tentative.https.any.js
@@ -9,16 +9,6 @@
 // TODO(ayui): Split and add extensive testing for each endpoint after endpoints
 // are fully implemented.
 promise_test(async testCase => {
-  const bucket = await navigator.storageBuckets.open(
-      'bucket_name', { persisted: true });
-  testCase.add_cleanup(async () => {
-    await navigator.storageBuckets.delete('bucket_name');
-  });
-  const persisted = await bucket.persisted();
-  assert_true(persisted);
-}, 'persisted() should retrieve bucket persisted state');
-
-promise_test(async testCase => {
   const bucket = await navigator.storageBuckets.open('bucket_name');
   testCase.add_cleanup(async () => {
     await navigator.storageBuckets.delete('bucket_name');
diff --git a/third_party/ipcz/src/reference_drivers/os_handle_fuchsia.cc b/third_party/ipcz/src/reference_drivers/os_handle_fuchsia.cc
index c329b7d2..41d817a3 100644
--- a/third_party/ipcz/src/reference_drivers/os_handle_fuchsia.cc
+++ b/third_party/ipcz/src/reference_drivers/os_handle_fuchsia.cc
@@ -7,6 +7,8 @@
 #include <lib/zx/handle.h>
 #include <zircon/status.h>
 
+#include <utility>
+
 #include "third_party/abseil-cpp/absl/base/macros.h"
 
 namespace ipcz::reference_drivers {
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index b0d403e..2df2392 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -392,16 +392,19 @@
   # The update.py in this current revision may have a patched revision while
   # building new clang packages. Get update.py off HEAD~ to pull the current
   # pinned clang.
-  with tempfile.NamedTemporaryFile() as f:
+  if not os.path.exists(PINNED_CLANG_DIR):
+    os.mkdir(os.path.join(PINNED_CLANG_DIR))
+
+  script_path = os.path.join(PINNED_CLANG_DIR, 'update.py')
+
+  with open(script_path, 'w') as f:
     subprocess.check_call(
         ['git', 'show', 'HEAD~:tools/clang/scripts/update.py'],
         stdout=f,
         cwd=CHROMIUM_DIR)
-    print("Running update.py")
-    # Without the flush, the subprocess call below doesn't work.
-    f.flush()
-    subprocess.check_call(
-        [sys.executable, f.name, '--output-dir=' + PINNED_CLANG_DIR])
+  print("Running pinned update.py")
+  subprocess.check_call(
+      [sys.executable, script_path, '--output-dir=' + PINNED_CLANG_DIR])
 
 
 # TODO(crbug.com/929645): Remove once we don't need gcc's libstdc++.
@@ -667,35 +670,49 @@
       # Build libclang.a as well as libclang.so
       '-DLIBCLANG_BUILD_STATIC=ON',
   ]
-
-  if sys.platform.startswith('linux'):
-    MaybeDownloadHostGcc(args)
-    if args.host_cc or args.host_cxx:
-      assert args.host_cc and args.host_cxx, \
-             "--host-cc and --host-cxx need to be used together"
-      cc = args.host_cc
-      cxx = args.host_cxx
+  if args.host_cc or args.host_cxx:
+    assert args.host_cc and args.host_cxx, \
+           "--host-cc and --host-cxx need to be used together"
+    cc = args.host_cc
+    cxx = args.host_cxx
+  else:
+    DownloadPinnedClang()
+    if sys.platform == 'win32':
+      cc = os.path.join(PINNED_CLANG_DIR, 'bin', 'clang-cl.exe')
+      cxx = os.path.join(PINNED_CLANG_DIR, 'bin', 'clang-cl.exe')
+      lld = os.path.join(PINNED_CLANG_DIR, 'bin', 'lld-link.exe')
+      # CMake has a hard time with backslashes in compiler paths:
+      # https://stackoverflow.com/questions/13050827
+      cc = cc.replace('\\', '/')
+      cxx = cxx.replace('\\', '/')
+      lld = lld.replace('\\', '/')
     else:
-      DownloadPinnedClang()
       cc = os.path.join(PINNED_CLANG_DIR, 'bin', 'clang')
       cxx = os.path.join(PINNED_CLANG_DIR, 'bin', 'clang++')
+
+    if sys.platform != 'darwin':
+      # The host clang has lld, but self-hosting with lld is still slightly
+      # broken on mac.
+      # TODO: check if this works now.
+      base_cmake_args.append('-DLLVM_ENABLE_LLD=ON')
+
+    if sys.platform.startswith('linux'):
+      MaybeDownloadHostGcc(args)
       # Use the libraries in the specified gcc installation for building.
       cflags.append('--gcc-toolchain=' + args.gcc_toolchain)
       cxxflags.append('--gcc-toolchain=' + args.gcc_toolchain)
-    base_cmake_args += [
-        # The host clang has lld.
-        '-DLLVM_ENABLE_LLD=ON',
-        '-DLLVM_STATIC_LINK_CXX_STDLIB=ON',
-        # Force compiler-rt tests to use our gcc toolchain
-        # because the one on the host may be too old.
-        # Even with -static-libstdc++ the compiler-rt tests add -lstdc++
-        # which adds a DT_NEEDED to libstdc++.so so we need to add RPATHs
-        # to the gcc toolchain.
-        '-DCOMPILER_RT_TEST_COMPILER_CFLAGS=--gcc-toolchain=' +
-        args.gcc_toolchain + ' -Wl,-rpath,' +
-        os.path.join(args.gcc_toolchain, 'lib64') + ' -Wl,-rpath,' +
-        os.path.join(args.gcc_toolchain, 'lib32')
-    ]
+      base_cmake_args += [
+          '-DLLVM_STATIC_LINK_CXX_STDLIB=ON',
+          # Force compiler-rt tests to use our gcc toolchain
+          # because the one on the host may be too old.
+          # Even with -static-libstdc++ the compiler-rt tests add -lstdc++
+          # which adds a DT_NEEDED to libstdc++.so so we need to add RPATHs
+          # to the gcc toolchain.
+          '-DCOMPILER_RT_TEST_COMPILER_CFLAGS=--gcc-toolchain=' +
+          args.gcc_toolchain + ' -Wl,-rpath,' +
+          os.path.join(args.gcc_toolchain, 'lib64') + ' -Wl,-rpath,' +
+          os.path.join(args.gcc_toolchain, 'lib32')
+      ]
 
   if sys.platform == 'darwin':
     # For libc++, we only want the headers.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 17238198..568411c 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -38559,7 +38559,7 @@
   <int value="2734"
       label="V8HTMLVideoElement_AutoPictureInPicture_AttributeSetter"/>
   <int value="2735" label="AutoPictureInPictureAttribute"/>
-  <int value="2736" label="RTCAudioJitterBufferRtxHandling"/>
+  <int value="2736" label="OBSOLETE_RTCAudioJitterBufferRtxHandling"/>
   <int value="2737" label="WebShareCanShare"/>
   <int value="2738" label="PriorityHints"/>
   <int value="2739" label="TextAutosizedCrossSiteIframe"/>
@@ -54504,6 +54504,7 @@
   <int value="-2088555929" label="EnableAppGridGhost:enabled"/>
   <int value="-2088472280" label="KeyboardShortcutViewerApp:disabled"/>
   <int value="-2088263177" label="EnableMixedContentDownloadDialog:enabled"/>
+  <int value="-2087724986" label="ShelfPalmRejectionSwipeOffset:enabled"/>
   <int value="-2087444854" label="ThreadWrapperUsesMetronome:disabled"/>
   <int value="-2084849051" label="TabGroupsCollapseFreezing:disabled"/>
   <int value="-2083998415" label="VrLaunchIntent:enabled"/>
@@ -55228,6 +55229,7 @@
   <int value="-1620942609" label="MuteCompromisedPasswords:enabled"/>
   <int value="-1620804800" label="NoScriptPreviews:disabled"/>
   <int value="-1620568042" label="FeaturePolicy:disabled"/>
+  <int value="-1620425260" label="ShelfPalmRejectionSwipeOffset:disabled"/>
   <int value="-1620230777" label="StylusBatteryStatus:enabled"/>
   <int value="-1620046590" label="UseMediaHistoryStore:enabled"/>
   <int value="-1619757314" label="touch-scrolling-mode"/>
@@ -56469,6 +56471,7 @@
   <int value="-844381918" label="ArcNativeBridgeExperiment:disabled"/>
   <int value="-844067635" label="InterestFeedV2Autoplay:enabled"/>
   <int value="-843496368" label="AutofillRejectCompanyBirthyear:disabled"/>
+  <int value="-842597982" label="ShelfPalmRejectionTouchArea:disabled"/>
   <int value="-842438090" label="enable-md-feedback"/>
   <int value="-839664591" label="enable-web-authentication-testing-api"/>
   <int value="-838719204"
@@ -57283,6 +57286,7 @@
   <int value="-288316828" label="enable-delegated-renderer"/>
   <int value="-286603268" label="hide-android-files-in-files-app"/>
   <int value="-284547865" label="UnifiedConsent:enabled"/>
+  <int value="-284470280" label="ShelfPalmRejectionTouchArea:enabled"/>
   <int value="-284328071" label="LocalWebApprovals:enabled"/>
   <int value="-284279318" label="LacrosMoveProfileMigration:enabled"/>
   <int value="-283388027" label="ManualFallbacksFilling:disabled"/>
diff --git a/ui/base/models/dialog_model.cc b/ui/base/models/dialog_model.cc
index 8d5c0ad..f0ffc41 100644
--- a/ui/base/models/dialog_model.cc
+++ b/ui/base/models/dialog_model.cc
@@ -134,10 +134,10 @@
 }
 
 void DialogModel::AddCustomField(
-    std::unique_ptr<DialogModelCustomField::Factory> factory,
+    std::unique_ptr<DialogModelCustomField::Field> field,
     int unique_id) {
   AddField(std::make_unique<DialogModelCustomField>(
-      GetPassKey(), this, unique_id, std::move(factory)));
+      GetPassKey(), this, unique_id, std::move(field)));
 }
 
 bool DialogModel::HasField(int unique_id) const {
diff --git a/ui/base/models/dialog_model.h b/ui/base/models/dialog_model.h
index 5fcea5f3..df23bd9 100644
--- a/ui/base/models/dialog_model.h
+++ b/ui/base/models/dialog_model.h
@@ -252,9 +252,9 @@
 
     // Adds a custom field. See DialogModel::AddCustomField().
     Builder& AddCustomField(
-        std::unique_ptr<DialogModelCustomField::Factory> factory,
+        std::unique_ptr<DialogModelCustomField::Field> field,
         int unique_id = -1) {
-      model_->AddCustomField(std::move(factory), unique_id);
+      model_->AddCustomField(std::move(field), unique_id);
       return *this;
     }
 
@@ -310,7 +310,7 @@
   // Adds a custom field at the end of the dialog model. This is used to inject
   // framework-specific custom UI into dialogs that are otherwise constructed as
   // DialogModels.
-  void AddCustomField(std::unique_ptr<DialogModelCustomField::Factory> factory,
+  void AddCustomField(std::unique_ptr<DialogModelCustomField::Field> field,
                       int unique_id = -1);
 
   // Check for the existence of a field. Should not be used if the code path
diff --git a/ui/base/models/dialog_model_field.cc b/ui/base/models/dialog_model_field.cc
index 0f33cc3..9e4422d 100644
--- a/ui/base/models/dialog_model_field.cc
+++ b/ui/base/models/dialog_model_field.cc
@@ -316,15 +316,15 @@
   text_ = std::move(text);
 }
 
-DialogModelCustomField::Factory::~Factory() = default;
+DialogModelCustomField::Field::~Field() = default;
 
 DialogModelCustomField::DialogModelCustomField(
     base::PassKey<DialogModel> pass_key,
     DialogModel* model,
     int unique_id,
-    std::unique_ptr<DialogModelCustomField::Factory> factory)
+    std::unique_ptr<DialogModelCustomField::Field> field)
     : DialogModelField(pass_key, model, kCustom, unique_id, {}),
-      factory_(std::move(factory)) {}
+      field_(std::move(field)) {}
 
 DialogModelCustomField::~DialogModelCustomField() = default;
 
diff --git a/ui/base/models/dialog_model_field.h b/ui/base/models/dialog_model_field.h
index f69e0c1..553f5f7 100644
--- a/ui/base/models/dialog_model_field.h
+++ b/ui/base/models/dialog_model_field.h
@@ -466,33 +466,33 @@
 class COMPONENT_EXPORT(UI_BASE) DialogModelCustomField
     : public DialogModelField {
  public:
-  class COMPONENT_EXPORT(UI_BASE) Factory {
+  // Base class for fields held by DialogModelField. Calling code is responsible
+  // for providing the subclass expected by the DialogModelHost used.
+  class COMPONENT_EXPORT(UI_BASE) Field {
    public:
-    virtual ~Factory();
+    virtual ~Field();
   };
 
   // Note that this is constructed through a DialogModel which adds it to model
   // fields.
-  DialogModelCustomField(
-      base::PassKey<DialogModel> pass_key,
-      DialogModel* model,
-      int unique_id,
-      std::unique_ptr<DialogModelCustomField::Factory> factory);
+  DialogModelCustomField(base::PassKey<DialogModel> pass_key,
+                         DialogModel* model,
+                         int unique_id,
+                         std::unique_ptr<DialogModelCustomField::Field> field);
   DialogModelCustomField(const DialogModelCustomField&) = delete;
   DialogModelCustomField& operator=(const DialogModelCustomField&) = delete;
   ~DialogModelCustomField() override;
 
   // Methods with base::PassKey<DialogModelHost> are only intended to be called
   // by the DialogModelHost implementation.
-  DialogModelCustomField::Factory* factory(
-      base::PassKey<DialogModelHost>) const {
-    return factory_.get();
+  DialogModelCustomField::Field* field(base::PassKey<DialogModelHost>) {
+    return field_.get();
   }
 
  private:
   friend class DialogModel;
 
-  std::unique_ptr<DialogModelCustomField::Factory> factory_;
+  std::unique_ptr<DialogModelCustomField::Field> field_;
 };
 
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index 626e9ebf..fe7da23 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -246,6 +246,7 @@
     "//third_party/wayland-protocols:presentation_time_protocol",
     "//third_party/wayland-protocols:primary_selection_protocol",
     "//third_party/wayland-protocols:relative_pointer_protocol",
+    "//third_party/wayland-protocols:stylus_protocol",
     "//third_party/wayland-protocols:text_input_extension_protocol",
     "//third_party/wayland-protocols:text_input_protocol",
     "//third_party/wayland-protocols:viewporter_protocol",
diff --git a/ui/ozone/platform/wayland/common/wayland_object.cc b/ui/ozone/platform/wayland/common/wayland_object.cc
index b7625c6..63991771 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -22,6 +22,7 @@
 #include <presentation-time-client-protocol.h>
 #include <primary-selection-unstable-v1-client-protocol.h>
 #include <relative-pointer-unstable-v1-client-protocol.h>
+#include <stylus-unstable-v2-client-protocol.h>
 #include <surface-augmenter-client-protocol.h>
 #include <text-input-extension-unstable-v1-client-protocol.h>
 #include <text-input-unstable-v1-client-protocol.h>
@@ -178,6 +179,8 @@
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_source_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_offer_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_text_input_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_pointer_stylus_v2)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_stylus_v2)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_text_input_extension_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_blending_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_alpha_compositing_v1)
diff --git a/ui/ozone/platform/wayland/common/wayland_object.h b/ui/ozone/platform/wayland/common/wayland_object.h
index ef28758..41c344c 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/ui/ozone/platform/wayland/common/wayland_object.h
@@ -161,6 +161,8 @@
 DECLARE_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_source_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_offer_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zcr_extended_text_input_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_pointer_stylus_v2)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_stylus_v2)
 DECLARE_WAYLAND_OBJECT_TRAITS(zcr_text_input_extension_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibit_manager_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibitor_v1)
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
index 5b656e22..851a5cd 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -87,6 +87,7 @@
 constexpr uint32_t kMaxExtendedDragVersion = 1;
 constexpr uint32_t kMaxXdgOutputManagerVersion = 3;
 constexpr uint32_t kMaxKeyboardShortcutsInhibitManagerVersion = 1;
+constexpr uint32_t kMaxStylusVersion = 2;
 
 int64_t ConvertTimespecToMicros(const struct timespec& ts) {
   // On 32-bit systems, the calculation cannot overflow int64_t.
@@ -427,7 +428,7 @@
       &ClockId,
   };
 
-  WaylandConnection* connection = static_cast<WaylandConnection*>(data);
+  auto* connection = static_cast<WaylandConnection*>(data);
 
   auto factory_it = connection->global_object_factories_.find(interface);
   if (factory_it != connection->global_object_factories_.end()) {
@@ -577,6 +578,14 @@
     NOTIMPLEMENTED_LOG_ONCE()
         << interface << " is recognized but not yet supported";
     ReportShellUMA(UMALinuxWaylandShell::kZwlrLayerShellV1);
+  } else if (!connection->zcr_stylus_v2_ &&
+             strcmp(interface, "zcr_stylus_v2") == 0) {
+    connection->zcr_stylus_v2_ = wl::Bind<zcr_stylus_v2>(
+        registry, name, std::min(version, kMaxStylusVersion));
+    if (!connection->zcr_stylus_v2_) {
+      LOG(ERROR) << "Failed to bind to zcr_stylus_v2";
+      return;
+    }
   }
 
   connection->available_globals_.emplace_back(interface, version);
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
index 82ca03f..9f4fc6c 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -129,6 +129,7 @@
   keyboard_shortcuts_inhibit_manager_v1() const {
     return keyboard_shortcuts_inhibit_manager_v1_.get();
   }
+  zcr_stylus_v2* stylus_v2() const { return zcr_stylus_v2_.get(); }
   zwp_text_input_manager_v1* text_input_manager_v1() const {
     return text_input_manager_v1_.get();
   }
@@ -365,6 +366,7 @@
   wl::Object<zcr_keyboard_extension_v1> keyboard_extension_v1_;
   wl::Object<zwp_keyboard_shortcuts_inhibit_manager_v1>
       keyboard_shortcuts_inhibit_manager_v1_;
+  wl::Object<zcr_stylus_v2> zcr_stylus_v2_;
   wl::Object<zwp_text_input_manager_v1> text_input_manager_v1_;
   wl::Object<zcr_text_input_extension_v1> text_input_extension_v1_;
   wl::Object<zwp_linux_explicit_synchronization_v1>
diff --git a/ui/ozone/platform/wayland/host/wayland_pointer.cc b/ui/ozone/platform/wayland/host/wayland_pointer.cc
index d6680f6..d0e6a50 100644
--- a/ui/ozone/platform/wayland/host/wayland_pointer.cc
+++ b/ui/ozone/platform/wayland/host/wayland_pointer.cc
@@ -5,6 +5,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_pointer.h"
 
 #include <linux/input.h>
+#include <stylus-unstable-v2-client-protocol.h>
 
 #include "ui/events/event.h"
 #include "ui/events/types/event_type.h"
@@ -26,6 +27,8 @@
       &Frame, &AxisSource, &AxisStop, &AxisDiscrete};
 
   wl_pointer_add_listener(obj_.get(), &listener, this);
+
+  SetupStylus();
 }
 
 WaylandPointer::~WaylandPointer() {
@@ -190,4 +193,42 @@
   NOTIMPLEMENTED_LOG_ONCE();
 }
 
+void WaylandPointer::SetupStylus() {
+  auto* stylus_v2 = connection_->stylus_v2();
+  if (!stylus_v2)
+    return;
+
+  zcr_pointer_stylus_v2_.reset(
+      zcr_stylus_v2_get_pointer_stylus(stylus_v2, obj_.get()));
+
+  static zcr_pointer_stylus_v2_listener kPointerStylusV2Listener = {
+      &Tool, &Force, &Tilt};
+  zcr_pointer_stylus_v2_add_listener(zcr_pointer_stylus_v2_.get(),
+                                     &kPointerStylusV2Listener, this);
+}
+
+// static
+void WaylandPointer::Tool(void* data,
+                          struct zcr_pointer_stylus_v2* x,
+                          uint32_t y) {
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
+// static
+void WaylandPointer::Force(void* data,
+                           struct zcr_pointer_stylus_v2* x,
+                           uint32_t y,
+                           wl_fixed_t z) {
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
+// static
+void WaylandPointer::Tilt(void* data,
+                          struct zcr_pointer_stylus_v2* x,
+                          uint32_t y,
+                          wl_fixed_t z,
+                          wl_fixed_t a) {
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_pointer.h b/ui/ozone/platform/wayland/host/wayland_pointer.h
index c63711b8..893ad2b 100644
--- a/ui/ozone/platform/wayland/host/wayland_pointer.h
+++ b/ui/ozone/platform/wayland/host/wayland_pointer.h
@@ -78,7 +78,21 @@
                            uint32_t axis,
                            int32_t discrete);
 
+  void SetupStylus();
+
+  static void Tool(void* data, struct zcr_pointer_stylus_v2* x, uint32_t y);
+  static void Force(void* data,
+                    struct zcr_pointer_stylus_v2* x,
+                    uint32_t y,
+                    wl_fixed_t z);
+  static void Tilt(void* data,
+                   struct zcr_pointer_stylus_v2* x,
+                   uint32_t y,
+                   wl_fixed_t z,
+                   wl_fixed_t a);
+
   wl::Object<wl_pointer> obj_;
+  wl::Object<zcr_pointer_stylus_v2> zcr_pointer_stylus_v2_;
   WaylandConnection* const connection_;
   Delegate* const delegate_;
 
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc
index 00bfeda..c001b91 100644
--- a/ui/views/bubble/bubble_dialog_model_host.cc
+++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -57,9 +57,9 @@
     case ui::DialogModelField::kSeparator:
       return BubbleDialogModelHost::FieldType::kMenuItem;
     case ui::DialogModelField::kCustom:
-      return static_cast<BubbleDialogModelHost::CustomViewFactory*>(
-                 field->AsCustomField(pass_key)->factory(pass_key))
-          ->GetFieldType();
+      return static_cast<BubbleDialogModelHost::CustomView*>(
+                 field->AsCustomField(pass_key)->field(pass_key))
+          ->field_type();
   }
 }
 
@@ -150,6 +150,17 @@
 
 }  // namespace
 
+BubbleDialogModelHost::CustomView::CustomView(std::unique_ptr<View> view,
+                                              FieldType field_type)
+    : view_(std::move(view)), field_type_(field_type) {}
+
+BubbleDialogModelHost::CustomView::~CustomView() = default;
+
+std::unique_ptr<View> BubbleDialogModelHost::CustomView::TransferView() {
+  DCHECK(view_);
+  return std::move(view_);
+}
+
 // TODO(pbos): Migrate most code that calls contents_view_->(some View method)
 // into this class. This was done in steps to limit the size of the diff.
 class BubbleDialogModelHost::ContentsView : public View {
@@ -453,9 +464,10 @@
       break;
     case ui::DialogModelField::kCustom:
       std::unique_ptr<View> view =
-          static_cast<CustomViewFactory*>(
-              field->AsCustomField(GetPassKey())->factory(GetPassKey()))
-              ->CreateView();
+          static_cast<CustomView*>(
+              field->AsCustomField(GetPassKey())->field(GetPassKey()))
+              ->TransferView();
+      DCHECK(view);
       view->SetID(field->unique_id(GetPassKey()));
       DialogModelHostField info{field, view.get(), nullptr};
       AddDialogModelHostField(std::move(view), info);
diff --git a/ui/views/bubble/bubble_dialog_model_host.h b/ui/views/bubble/bubble_dialog_model_host.h
index cd303af..41acfeb 100644
--- a/ui/views/bubble/bubble_dialog_model_host.h
+++ b/ui/views/bubble/bubble_dialog_model_host.h
@@ -32,16 +32,21 @@
  public:
   enum class FieldType { kText, kControl, kMenuItem };
 
-  // TODO(pbos): Reconsider whether this should be generic outside of
-  // BubbleDialogModelHost.
-  // TODO(pbos): Consider making this interface appropriate for all fields (not
-  // just custom ones). If so rename this ViewFactory (not CustomViewFactory).
-  // Interface for adding custom views to a DialogModel. This factory interface
-  // allows constructing views to be hosted in BubbleDialogModelHost.
-  class CustomViewFactory : public ui::DialogModelCustomField::Factory {
+  class VIEWS_EXPORT CustomView : public ui::DialogModelCustomField::Field {
    public:
-    virtual std::unique_ptr<View> CreateView() = 0;
-    virtual FieldType GetFieldType() const = 0;
+    CustomView(std::unique_ptr<View> view, FieldType field_type);
+    CustomView(const CustomView&) = delete;
+    CustomView& operator=(const CustomView&) = delete;
+    ~CustomView() override;
+
+    std::unique_ptr<View> TransferView();
+
+    FieldType field_type() const { return field_type_; }
+
+   private:
+    // `view` is intended to be moved into the View hierarchy.
+    std::unique_ptr<View> view_;
+    const FieldType field_type_;
   };
 
   // Constructs a BubbleDialogModelHost, which for most purposes is to used as a