diff --git a/DEPS b/DEPS
index b23b0ad5..608fc20 100644
--- a/DEPS
+++ b/DEPS
@@ -199,11 +199,11 @@
   # 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': '8f282f5d9f30aeb5e3122735723b403203511370',
+  'skia_revision': '2199cde1f52b39182a21f5ff41ab8aafde1f3731',
   # 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': '6bb19707a491fda7a4dc04dbbeb188d48f6d641d',
+  'v8_revision': '5d60a181de0863d8d00ae42ec0ee3521f51b501a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -211,11 +211,11 @@
   # 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': '6e909d9407534e3b7e4eb42e49941256a14066b5',
+  'angle_revision': '0b90eef09f607336330f318bc8e65fa981634160',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '588d32cb3f172d1a6092c2b3c7e5a5c5d8b3b06e',
+  'swiftshader_revision': '348ba200aa29d5b3a36d696d48d8f619e055219f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -274,7 +274,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': 'ba12c16f393a978fe8d3f7ad9d9db4d3ad1125b0',
+  'devtools_frontend_revision': '56e9ceb621af13f4d35ff0a65e1206f7b50772a1',
   # 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.
@@ -314,7 +314,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': 'c9a22bcb93db27e200a184c1f7b9bf0f288815c7',
+  'dawn_revision': '3a0405597374c9ae12fb93e33aac35826455a958',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1344,7 +1344,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/aemu/linux-amd64',
-              'version': 'luM2HIHgfBKxr1C7UPo8RdQPAvyLNd74T9rYfhWFOC8C'
+              'version': 'xAHa1IXmKteChkPvba9ezjSnKL7IyDePQRzWVUEAx9UC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1485,7 +1485,7 @@
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'a3c3ef666b7a5e4c93ebae5a7462add6f86f5cf2',
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@b229877c6d2dd194a61794fa12e69405b09d8677',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@e59ae1af7571c2994183768c2a36fff8b1854437',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '6c656df63da5995a932aafd45b32af1974e497d9',
@@ -1518,7 +1518,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '3c2fe3888658d82b47ca831d59a2e07579619c2d',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '783278a3109df8d2e362861e52fd0deea851633c',
+    Var('webrtc_git') + '/src.git' + '@' + '42082f9045e74e65b9e3a66b51093e0dc2f9375a',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1590,7 +1590,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a51f14911dda538375d1f4da1925ce667ac3ca6f',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ae141f7298b13c959b64a3cff9ffcc191c8f5f2c',
     'condition': 'checkout_src_internal',
   },
 
@@ -1598,7 +1598,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'iymm0X4k86dP1qOJ7zLR6r45tSnluDcJ8ticed31c9wC',
+        'version': 'XqRO5qpWAA_j5rN924obLa6cvXOAk7XsrvyzobooTOoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1609,7 +1609,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'G2hKrv9siNlrFfUOPnGITX-1vPXVfef552IDKjdJcgoC',
+        'version': 'R77YnQ53JE-EhrDRTHfTXpK36kcw2lVngfX8hLaV5OQC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/base/allocator/partition_allocator/page_allocator_internals_posix.h b/base/allocator/partition_allocator/page_allocator_internals_posix.h
index f3c1c53..078e33a 100644
--- a/base/allocator/partition_allocator/page_allocator_internals_posix.h
+++ b/base/allocator/partition_allocator/page_allocator_internals_posix.h
@@ -8,6 +8,7 @@
 #include <errno.h>
 #include <sys/mman.h>
 
+#include "base/allocator/partition_allocator/oom.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/check_op.h"
 #include "base/notreached.h"
@@ -216,8 +217,11 @@
     void* address,
     size_t length,
     PageAccessibilityConfiguration accessibility) {
-  PA_PCHECK(0 == HANDLE_EINTR(
-                     mprotect(address, length, GetAccessFlags(accessibility))));
+  const int ret =
+      HANDLE_EINTR(mprotect(address, length, GetAccessFlags(accessibility)));
+  if (ret == -1 && errno == ENOMEM)
+    OOM_CRASH(length);
+  PA_PCHECK(0 == ret);
 }
 
 void FreePagesInternal(void* address, size_t length) {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index e163596..ae34d0f 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20210108.2.1
+0.20210110.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index e163596..ae34d0f 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20210108.2.1
+0.20210110.2.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 976092f..391f4ad 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=89
 MINOR=0
-BUILD=4384
+BUILD=4385
 PATCH=0
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index e0d2f42..da0660e 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-89.0.4381.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-89.0.4383.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 354f4a3..944e278 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -578,6 +578,10 @@
 #if defined(OS_ANDROID)
   UmaSessionStats::OnStartup();
 #endif
+
+#if defined(OS_MAC)
+  chrome::CacheChannelInfo();
+#endif
 }
 
 bool ChromeMainDelegate::ShouldCreateFeatureList() {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index f0d4bf1..3523ee4 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1460,6 +1460,8 @@
     "first_run/first_run.h",
     "full_restore/app_launch_handler.cc",
     "full_restore/app_launch_handler.h",
+    "full_restore/full_restore_data_handler.cc",
+    "full_restore/full_restore_data_handler.h",
     "full_restore/full_restore_prefs.cc",
     "full_restore/full_restore_prefs.h",
     "full_restore/full_restore_service.cc",
diff --git a/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc b/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc
new file mode 100644
index 0000000..946b2a29
--- /dev/null
+++ b/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc
@@ -0,0 +1,49 @@
+// Copyright 2021 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/chromeos/full_restore/full_restore_data_handler.h"
+
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/full_restore/full_restore_read_handler.h"
+#include "components/full_restore/full_restore_save_handler.h"
+#include "components/services/app_service/public/cpp/app_update.h"
+
+namespace chromeos {
+namespace full_restore {
+
+FullRestoreDataHandler::FullRestoreDataHandler(Profile* profile)
+    : profile_(profile) {
+  DCHECK(
+      apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile_));
+  Observe(&apps::AppServiceProxyFactory::GetForProfile(profile_)
+               ->AppRegistryCache());
+}
+
+FullRestoreDataHandler::~FullRestoreDataHandler() = default;
+
+void FullRestoreDataHandler::OnAppUpdate(const apps::AppUpdate& update) {
+  if (!update.ReadinessChanged() ||
+      update.Readiness() != apps::mojom::Readiness::kUninstalledByUser) {
+    return;
+  }
+
+  // If the user uninstalls an app, then installs it again at the system
+  // startup phase, its restore data will be removed if the app isn't reopened.
+  ::full_restore::FullRestoreReadHandler* read_handler =
+      ::full_restore::FullRestoreReadHandler::GetInstance();
+  read_handler->RemoveApp(profile_->GetPath(), update.AppId());
+
+  ::full_restore::FullRestoreSaveHandler::GetInstance()->RemoveApp(
+      profile_->GetPath(), update.AppId());
+}
+
+void FullRestoreDataHandler::OnAppRegistryCacheWillBeDestroyed(
+    apps::AppRegistryCache* cache) {
+  apps::AppRegistryCache::Observer::Observe(nullptr);
+}
+
+}  // namespace full_restore
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_data_handler.h b/chrome/browser/chromeos/full_restore/full_restore_data_handler.h
new file mode 100644
index 0000000..29267d6
--- /dev/null
+++ b/chrome/browser/chromeos/full_restore/full_restore_data_handler.h
@@ -0,0 +1,39 @@
+// Copyright 2021 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_CHROMEOS_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_
+
+#include "components/services/app_service/public/cpp/app_registry_cache.h"
+
+class Profile;
+
+namespace chromeos {
+namespace full_restore {
+
+// The FullRestoreDataHandler class observes AppRegistryCache to remove the app
+// launching and app windows when the app is removed.
+class FullRestoreDataHandler : public apps::AppRegistryCache::Observer {
+ public:
+  explicit FullRestoreDataHandler(Profile* profile);
+  ~FullRestoreDataHandler() override;
+
+  FullRestoreDataHandler(const FullRestoreDataHandler&) = delete;
+  FullRestoreDataHandler& operator=(const FullRestoreDataHandler&) = delete;
+
+  // apps::AppRegistryCache::Observer:
+  void OnAppUpdate(const apps::AppUpdate& update) override;
+  void OnAppRegistryCacheWillBeDestroyed(
+      apps::AppRegistryCache* cache) override;
+
+ private:
+  Profile* profile_ = nullptr;
+
+  base::WeakPtrFactory<FullRestoreDataHandler> weak_ptr_factory_{this};
+};
+
+}  // namespace full_restore
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.cc b/chrome/browser/chromeos/full_restore/full_restore_service.cc
index 385a71d..04c01e38 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service.cc
+++ b/chrome/browser/chromeos/full_restore/full_restore_service.cc
@@ -8,6 +8,7 @@
 #include "base/strings/string_util.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/chromeos/full_restore/app_launch_handler.h"
+#include "chrome/browser/chromeos/full_restore/full_restore_data_handler.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_service_factory.h"
 #include "chrome/browser/chromeos/full_restore/new_user_restore_pref_handler.h"
@@ -40,7 +41,9 @@
 
 FullRestoreService::FullRestoreService(Profile* profile)
     : profile_(profile),
-      app_launch_handler_(std::make_unique<AppLaunchHandler>(profile_)) {
+      app_launch_handler_(std::make_unique<AppLaunchHandler>(profile_)),
+      restore_data_handler_(
+          std::make_unique<FullRestoreDataHandler>(profile_)) {
   // If the system crashed before reboot, show the restore notification.
   if (profile->GetLastSessionExitType() == Profile::EXIT_CRASHED) {
     ShowRestoreNotification(kRestoreForCrashNotificationId);
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.h b/chrome/browser/chromeos/full_restore/full_restore_service.h
index cdf64fe7..eed24e4 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service.h
+++ b/chrome/browser/chromeos/full_restore/full_restore_service.h
@@ -18,6 +18,7 @@
 namespace full_restore {
 
 class AppLaunchHandler;
+class FullRestoreDataHandler;
 class NewUserRestorePrefHandler;
 
 extern const char kRestoreForCrashNotificationId[];
@@ -71,6 +72,8 @@
   // restore data.
   std::unique_ptr<AppLaunchHandler> app_launch_handler_;
 
+  std::unique_ptr<FullRestoreDataHandler> restore_data_handler_;
+
   base::WeakPtrFactory<FullRestoreService> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc b/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc
index e155a43..bcac9e9 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc
+++ b/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc
@@ -189,7 +189,8 @@
 
 // If the system is crash, show the crash notification, and verify the restore
 // flag when click the restore button.
-TEST_F(FullRestoreServiceTest, CrashAndRestore) {
+// TODO(crbug.com/1046900): Fix this unit test.
+TEST_F(FullRestoreServiceTest, DISABLED_CrashAndRestore) {
   profile()->set_last_session_exited_cleanly(false);
   CreateFullRestoreServiceForTesting();
 
@@ -398,8 +399,9 @@
 }
 
 // If the OS restore setting is 'Ask every time', after reboot, show the restore
-// notfication, and verify the restore flag when click the restore button.
-TEST_F(FullRestoreServiceTest, AskEveryTimeAndRestore) {
+// notification, and verify the restore flag when click the restore button.
+// TODO(crbug.com/1046900): Fix this unit test.
+TEST_F(FullRestoreServiceTest, DISABLED_AskEveryTimeAndRestore) {
   profile()->GetPrefs()->SetInteger(
       kRestoreAppsAndPagesPrefName,
       static_cast<int>(RestoreOption::kAskEveryTime));
@@ -474,7 +476,8 @@
 
 // If the restore option has been selected 3 times, show the set restore
 // notification.
-TEST_F(FullRestoreServiceTest, SetRestorePrefNotification) {
+// TODO(crbug.com/1046900): Fix this unit test.
+TEST_F(FullRestoreServiceTest, DISABLED_SetRestorePrefNotification) {
   profile()->GetPrefs()->SetInteger(
       kRestoreAppsAndPagesPrefName,
       static_cast<int>(RestoreOption::kAskEveryTime));
@@ -508,7 +511,8 @@
 
 // When |kRestoreSelectedCountPrefName| = 3, if the restore option is selected
 // again, |kRestoreSelectedCountPrefName| should not change.
-TEST_F(FullRestoreServiceTest, RestoreSelectedCount) {
+// TODO(crbug.com/1046900): Fix this unit test.
+TEST_F(FullRestoreServiceTest, DISABLED_RestoreSelectedCount) {
   profile()->GetPrefs()->SetInteger(
       kRestoreAppsAndPagesPrefName,
       static_cast<int>(RestoreOption::kAskEveryTime));
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 381c6b3..0c11f4e0 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -283,10 +283,10 @@
 }
 
 // Called after a deleted profile was checked and cleaned up.
-void ProfileCleanedUp(const base::Value* profile_path_value) {
+void ProfileCleanedUp(base::Value profile_path_value) {
   ListPrefUpdate deleted_profiles(g_browser_process->local_state(),
                                   prefs::kProfilesDeleted);
-  deleted_profiles->Remove(*profile_path_value, nullptr);
+  deleted_profiles->Remove(profile_path_value, nullptr);
 }
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -1040,11 +1040,11 @@
             {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
              base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
             base::BindOnce(&NukeProfileFromDisk, *profile_path),
-            base::BindOnce(&ProfileCleanedUp, &value));
+            base::BindOnce(&ProfileCleanedUp, value.Clone()));
       } else {
         // Everything is fine, the profile was removed on shutdown.
         content::GetUIThreadTaskRunner({})->PostTask(
-            FROM_HERE, base::BindOnce(&ProfileCleanedUp, &value));
+            FROM_HERE, base::BindOnce(&ProfileCleanedUp, value.Clone()));
       }
     } else {
       LOG(ERROR) << "Found invalid profile path in deleted_profiles: "
diff --git a/chrome/browser/resources/chromeos/add_supervision/post_message_api.js b/chrome/browser/resources/chromeos/add_supervision/post_message_api.js
index 438e9ccd..c3dbbdc 100644
--- a/chrome/browser/resources/chromeos/add_supervision/post_message_api.js
+++ b/chrome/browser/resources/chromeos/add_supervision/post_message_api.js
@@ -172,19 +172,24 @@
       return;
     }
 
-    if (this.initialization_timeout_id_) {
-      // Cancel the current init timeout, and signal to the initialization
-      // polling process that we have received an init message from the guest
-      // content, so it doesn't reschedule the timer.
-      clearTimeout(this.initialization_timeout_id_);
-      this.initialization_timeout_id_ = 0;
-    }
-
     if (event.data === 'init') {
+      if (this.initialization_timeout_id_) {
+        // Cancel the current init timeout, and signal to the initialization
+        // polling process that we have received an init message from the guest
+        // content, so it doesn't reschedule the timer.
+        clearTimeout(this.initialization_timeout_id_);
+        this.initialization_timeout_id_ = 0;
+      }
+
       this.isInitialized_ = true;
       return;
     }
-
+    // If we have gotten this far, we have received a message from a trusted
+    // origin, and we should try to process it.  We can't gate this on whether
+    // the channel is initialized, because we can receive events out of order,
+    // and method calls can be received before the init event. Essentially, we
+    // should treat the channel as being potentially as soon as we send 'init'
+    // to the guest content.
     const methodId = event.data.methodId;
     const fn = event.data.fn;
     const args = event.data.args || [];
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc
index db21b6f..5922e02 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -11,6 +11,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
+#include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -22,11 +23,13 @@
 #include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/signin_util.h"
+#include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/themes/theme_service.h"
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
+#include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/user_manager.h"
 #include "chrome/browser/ui/views/accelerator_table.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -35,6 +38,7 @@
 #include "chrome/browser/ui/views/profiles/profile_customization_bubble_sync_controller.h"
 #include "chrome/browser/ui/views/profiles/profile_customization_bubble_view.h"
 #include "chrome/browser/ui/views/profiles/profile_picker_view_sync_delegate.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h"
 #include "chrome/browser/ui/webui/signin/profile_picker_ui.h"
 #include "chrome/browser/ui/webui/signin/signin_web_dialog_ui.h"
@@ -42,11 +46,13 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
 #include "chrome/grit/google_chrome_strings.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
+#include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/context_menu_params.h"
 #include "content/public/browser/render_frame_host.h"
@@ -54,6 +60,10 @@
 #include "content/public/browser/web_contents.h"
 #include "google_apis/gaia/gaia_urls.h"
 #include "net/base/url_util.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/background.h"
+#include "ui/views/controls/webview/web_contents_set_background_color.h"
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/flex_layout.h"
@@ -80,6 +90,9 @@
 constexpr int kWindowHeight = 758;
 constexpr float kMaxRatioOfWorkArea = 0.9;
 
+// Padding of elements in the simple toolbar.
+constexpr gfx::Insets kToolbarPadding = gfx::Insets(8);
+
 constexpr base::TimeDelta kExtendedAccountInfoTimeout =
     base::TimeDelta::FromSeconds(10);
 
@@ -153,6 +166,28 @@
   ProfilePickerView* const profile_picker_view_;
 };
 
+class SimpleBackButton : public ToolbarButton {
+ public:
+  explicit SimpleBackButton(PressedCallback callback)
+      : ToolbarButton(std::move(callback)) {
+    SetTriggerableEventFlags(ui::EF_LEFT_MOUSE_BUTTON |
+                             ui::EF_MIDDLE_MOUSE_BUTTON);
+    SetTooltipText(
+        l10n_util::GetStringUTF16(IDS_PROFILE_PICKER_BACK_BUTTON_LABEL));
+  }
+  SimpleBackButton(const SimpleBackButton&) = delete;
+  SimpleBackButton& operator=(const SimpleBackButton&) = delete;
+  ~SimpleBackButton() override = default;
+
+  // ToolbarButton:
+  void UpdateIcon() override {
+    const bool touch_ui = ui::TouchUiController::Get()->touch_ui();
+    const gfx::VectorIcon* image =
+        touch_ui ? &kBackArrowTouchIcon : &vector_icons::kBackArrowIcon;
+    UpdateIconsWithStandardColors(*image);
+  }
+};
+
 }  // namespace
 
 // static
@@ -367,6 +402,16 @@
     base::OnceCallback<void(bool)> switch_finished_callback) {
   profile_color_ = profile_color;
 
+  if (signed_in_profile_being_created_) {
+    // The profile is already created (the user went back and forth again). No
+    // need to create it again.
+    std::move(switch_finished_callback).Run(true);
+    // Do not load any url because the desired sign-in screen is still loaded in
+    // `new_profile_contents_`.
+    ShowScreen(new_profile_contents_.get(), GURL(), /*show_toolbar=*/true);
+    return;
+  }
+
   DCHECK(!switch_finished_callback_);
   switch_finished_callback_ = std::move(switch_finished_callback);
 
@@ -404,6 +449,10 @@
     return;
   }
 
+  // Apply the default theme to get consistent colors for toolbars (this matters
+  // for linux where the 'system' theme is used for new profiles).
+  auto* theme_service = ThemeServiceFactory::GetForProfile(profile);
+  theme_service->UseDefaultTheme();
   if (signin_util::IsForceSigninEnabled()) {
     // Show the embedded sign-in flow if the force signin is enabled.
     UserManagerProfileDialog::ShowForceSigninDialog(
@@ -436,12 +485,28 @@
   // make sure the flow does not create multiple profiles simultaneously.
   signed_in_profile_being_created_ = profile;
 
-  // TODO(crbug.com/1126913): Build the simple toolbar with the back button.
+  // Build the toolbar. Do it as late as here because the elements depend on the
+  // ThemeProvider which is available only by signed_in_profile_being_created_.
+  const ui::ThemeProvider* tp = GetThemeProviderForProfileBeingCreated();
+  toolbar_->SetBackground(views::CreateSolidBackground(
+      tp->GetColor(ThemeProperties::COLOR_TOOLBAR)));
+
+  auto back_button = std::make_unique<SimpleBackButton>(base::BindRepeating(
+      &ProfilePickerView::BackButtonPressed, base::Unretained(this)));
+  toolbar_->AddChildView(std::move(back_button));
+
+  // TODO(crbug.com/1126913): Build the read-only omnibox.
 
   new_profile_contents_ = content::WebContents::Create(
       content::WebContents::CreateParams(signed_in_profile_being_created_));
   new_profile_contents_->SetDelegate(this);
 
+  // Make sure the web contents used for sign-in has proper background (for dark
+  // mode).
+  views::WebContentsSetBackgroundColor::CreateForWebContentsWithColor(
+      new_profile_contents_.get(),
+      tp->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND));
+
   ShowScreen(new_profile_contents_.get(), GetSigninURL(),
              /*show_toolbar=*/true);
 }
@@ -578,6 +643,11 @@
                                    views::MaximumFlexSizeRule::kUnbounded));
 
   auto toolbar = std::make_unique<views::View>();
+  toolbar->SetLayoutManager(std::make_unique<views::FlexLayout>())
+      ->SetOrientation(views::LayoutOrientation::kHorizontal)
+      .SetCrossAxisAlignment(views::LayoutAlignment::kCenter)
+      .SetCollapseMargins(true)
+      .SetInteriorMargin(kToolbarPadding);
   toolbar->SetProperty(
       views::kFlexBehaviorKey,
       views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
@@ -592,9 +662,11 @@
 void ProfilePickerView::ShowScreen(content::WebContents* contents,
                                    const GURL& url,
                                    bool show_toolbar) {
-  contents->GetController().LoadURL(url, content::Referrer(),
-                                    ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                    std::string());
+  if (!url.is_empty()) {
+    contents->GetController().LoadURL(url, content::Referrer(),
+                                      ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
+                                      std::string());
+  }
   web_view_->SetWebContents(contents);
   web_view_->RequestFocus();
 
@@ -603,6 +675,22 @@
   toolbar_->SetVisible(show_toolbar);
 }
 
+void ProfilePickerView::BackButtonPressed(const ui::Event& event) {
+  if (web_view_->GetWebContents() != new_profile_contents_.get()) {
+    return;
+  }
+
+  if (new_profile_contents_->GetController().CanGoBack()) {
+    new_profile_contents_->GetController().GoBack();
+    return;
+  }
+
+  // Move from sign-in back to the previous screen of profile creation.
+  // Do not load any url because the desired screen is still loaded in
+  // `system_profile_contents_`.
+  ShowScreen(system_profile_contents_.get(), GURL(), /*show_toolbar=*/false);
+}
+
 void ProfilePickerView::OnRefreshTokenUpdatedForAccount(
     const CoreAccountInfo& account_info) {
   DCHECK(!account_info.IsEmpty());
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.h b/chrome/browser/ui/views/profiles/profile_picker_view.h
index 91bb348..a48ce29 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view.h
+++ b/chrome/browser/ui/views/profiles/profile_picker_view.h
@@ -108,11 +108,14 @@
   // Builds the views hieararchy.
   void BuildLayout();
 
-  // Shows a screen with `url` in `contents` and potentially `show_toolbar`.
+  // Shows a screen with `url` in `contents` and potentially `show_toolbar`. If
+  // `url` is empty, it only shows `contents` with its currently loaded url.
   void ShowScreen(content::WebContents* contents,
                   const GURL& url,
                   bool show_toolbar);
 
+  void BackButtonPressed(const ui::Event& event);
+
   // Helper functions to deal with the lack of extended account info.
   void SetExtendedAccountInfoTimeoutForTesting(base::TimeDelta timeout);
   void OnExtendedAccountInfoTimeout(const CoreAccountInfo& account);
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index be83b691..d9693c2 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1610150355-4a8e87c65afe038c52dde92bd9ad8141fba84ab9.profdata
+chrome-linux-master-1610294646-d9496012030808fbbd5c6d71395353a15075c9f2.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 936d42db..3384c90 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1610107094-5d3c24229731decbd402a4499ebb6cac6decdedb.profdata
+chrome-win32-master-1610294646-5cd814ecb87ad7a408cdeda7da36a6886e7402c5.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index c151657..089ab8f 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1610161046-8bb47bdff715346cff6fa6c623eb76f6c2e1f1b6.profdata
+chrome-win64-master-1610294646-193d19344cbd53e124bebc9434b6d5bafe44fd51.profdata
diff --git a/chrome/common/channel_info.h b/chrome/common/channel_info.h
index 5958587..b9e0d89 100644
--- a/chrome/common/channel_info.h
+++ b/chrome/common/channel_info.h
@@ -42,6 +42,12 @@
 version_info::Channel GetChannel();
 
 #if defined(OS_MAC)
+// Because the channel information on the Mac is baked into the Info.plist file,
+// and that file may change during an update, this function must be called
+// early in startup to cache the channel info so that the correct channel info
+// can be returned later.
+void CacheChannelInfo();
+
 // Maps the name of the channel to version_info::Channel, always returning
 // Channel::UNKNOWN for unbranded builds. For branded builds defaults to
 // Channel::STABLE, if channel is empty, else matches the name and returns
diff --git a/chrome/common/channel_info_mac.mm b/chrome/common/channel_info_mac.mm
index 848ef7e..e9e7931 100644
--- a/chrome/common/channel_info_mac.mm
+++ b/chrome/common/channel_info_mac.mm
@@ -7,53 +7,101 @@
 #import <Foundation/Foundation.h>
 
 #include "base/mac/bundle_locations.h"
+#include "base/macros.h"
+#include "base/no_destructor.h"
 #include "base/strings/sys_string_conversions.h"
 #include "build/branding_buildflags.h"
 #include "components/version_info/version_info.h"
 
 namespace chrome {
 
-std::string GetChannelName() {
+namespace {
+
+std::string ChannelName() {
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  // Use the main Chrome application bundle and not the framework bundle.
-  // Keystone keys don't live in the framework.
-  NSBundle* bundle = base::mac::OuterBundle();
-  NSString* channel = [bundle objectForInfoDictionaryKey:@"KSChannelID"];
+  static const base::NoDestructor<std::string> channel([] {
+    // Use the main Chrome application bundle and not the framework bundle.
+    // Keystone keys don't live in the framework.
+    NSBundle* bundle = base::mac::OuterBundle();
+    NSString* channel = [bundle objectForInfoDictionaryKey:@"KSChannelID"];
 
-  // Only ever return "", "unknown", "beta", "dev", or "canary" in a branded
-  // build.
-  // KSProductID is not set (for stable) or "beta", "dev" or "canary" for
-  // the intel-only build.
-  // KSProductID is "arm64" (for stable) or "arm64-beta", "arm64-dev" or
-  // "arm64-canary" for the arm-only build.
-  // KSProductID is "universal" (for stable) or "universal-beta",
-  // "universal-dev" or "universal-canary" for the arm+intel universal binary.
-  if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) {
-    // This build is not Keystone-enabled, it can't have a channel.
-    channel = @"unknown";
-  } else if (!channel || [channel isEqual:@"arm64"] ||
-             [channel isEqual:@"universal"]) {
-    // For the intel stable channel, KSChannelID is not set.
-    channel = @"";
-  } else {
-    if ([channel hasPrefix:@"arm64-"])
-      channel = [channel substringFromIndex:[@"arm64-" length]];
-    else if ([channel hasPrefix:@"universal-"])
-      channel = [channel substringFromIndex:[@"universal-" length]];
-    if ([channel isEqual:@"beta"] || [channel isEqual:@"dev"] ||
-        [channel isEqual:@"canary"]) {
-      // do nothing.
-    } else {
+    // Only ever return "", "unknown", "beta", "dev", or "canary" in a branded
+    // build.
+    // KSProductID is not set (for stable) or "beta", "dev" or "canary" for
+    // the intel-only build.
+    // KSProductID is "arm64" (for stable) or "arm64-beta", "arm64-dev" or
+    // "arm64-canary" for the arm-only build.
+    // KSProductID is "universal" (for stable) or "universal-beta",
+    // "universal-dev" or "universal-canary" for the arm+intel universal binary.
+    if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) {
+      // This build is not Keystone-enabled, it can't have a channel.
       channel = @"unknown";
+    } else if (!channel || [channel isEqual:@"arm64"] ||
+               [channel isEqual:@"universal"]) {
+      // For the intel stable channel, KSChannelID is not set.
+      channel = @"";
+    } else {
+      if ([channel hasPrefix:@"arm64-"])
+        channel = [channel substringFromIndex:[@"arm64-" length]];
+      else if ([channel hasPrefix:@"universal-"])
+        channel = [channel substringFromIndex:[@"universal-" length]];
+      if ([channel isEqual:@"beta"] || [channel isEqual:@"dev"] ||
+          [channel isEqual:@"canary"]) {
+        // Do nothing.
+      } else {
+        channel = @"unknown";
+      }
     }
-  }
 
-  return base::SysNSStringToUTF8(channel);
+    return base::SysNSStringToUTF8(channel);
+  }());
+  return *channel;
 #else
   return std::string();
 #endif
 }
 
+bool SideBySideCapable() {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  static const base::NoDestructor<bool> capable([] {
+    // Use the main Chrome application bundle and not the framework bundle.
+    // Keystone keys don't live in the framework.
+    NSBundle* bundle = base::mac::OuterBundle();
+    if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) {
+      // This build is not Keystone-enabled, and without a channel assume it is
+      // side-by-side capable.
+      return true;
+    }
+
+    if (GetChannelName().empty()) {
+      // For the stable channel, GetChannelName() returns the empty string.
+      // Stable Chromes are what side-by-side capable Chromes are running
+      // side-by-side *to* and by definition are side-by-side capable.
+      return true;
+    }
+
+    // If there is a CrProductDirName key, then the user data dir of this
+    // beta/dev/canary Chrome is separate, and it can run side-by-side to the
+    // stable Chrome.
+    return [bundle objectForInfoDictionaryKey:@"CrProductDirName"];
+  }());
+  return *capable;
+#else
+  return true;
+#endif
+}
+
+}  // namespace
+
+void CacheChannelInfo() {
+  ignore_result(ChannelName());
+  ignore_result(SideBySideCapable());
+}
+
+std::string GetChannelName() {
+  return ChannelName();
+}
+
 version_info::Channel GetChannelByName(const std::string& channel) {
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   if (channel.empty())
@@ -69,34 +117,11 @@
 }
 
 bool IsSideBySideCapable() {
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  // Use the main Chrome application bundle and not the framework bundle.
-  // Keystone keys don't live in the framework.
-  NSBundle* bundle = base::mac::OuterBundle();
-  if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) {
-    // This build is not Keystone-enabled, and without a channel assume it is
-    // side-by-side capable.
-    return true;
-  }
-
-  if (GetChannelName().empty()) {
-    // For the stable channel, GetChannelName() returns the empty string.
-    // Stable Chromes are what side-by-side capable Chromes are running
-    // side-by-side *to* and by definition are side-by-side capable.
-    return true;
-  }
-
-  // If there is a CrProductDirName key, then the user data dir of this
-  // beta/dev/canary Chrome is separate, and it can run side-by-side to the
-  // stable Chrome.
-  return [bundle objectForInfoDictionaryKey:@"CrProductDirName"];
-#else
-  return true;
-#endif
+  return SideBySideCapable();
 }
 
 version_info::Channel GetChannel() {
-  return GetChannelByName(GetChannelName());
+  return GetChannelByName(ChannelName());
 }
 
 }  // namespace chrome
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 396258fb..f696aa7 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-13708.0.0
\ No newline at end of file
+13716.0.0
\ No newline at end of file
diff --git a/chromeos/components/scanning/resources/scan_preview.html b/chromeos/components/scanning/resources/scan_preview.html
index dbad0f5..23ccf2f 100644
--- a/chromeos/components/scanning/resources/scan_preview.html
+++ b/chromeos/components/scanning/resources/scan_preview.html
@@ -58,6 +58,10 @@
     width: calc(100% - 2px);
   }
 
+  .scanned-image {
+    display: block;
+  }
+
   /* Add top margin to all but the first scanned image. */
   .scanned-image:nth-of-type(n+2) {
     margin-top: 8px;
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index a07ada52..ccd2093 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-89-4367.0-1609757097-benchmark-89.0.4381.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-89-4367.0-1609757097-benchmark-89.0.4383.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 122eb2b..62663a2 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-89-4367.0-1609764762-benchmark-89.0.4381.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-89-4367.0-1609764762-benchmark-89.0.4383.0-r1-redacted.afdo.xz
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
index 0f87f37a..bc7eaed 100644
--- a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
+++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -116,6 +116,25 @@
   // Unused memory available to the process, in KiB. This will always be
   // |total_memory_kib| - |resident_memory_kib|.
   uint32 free_memory_kib;
+  // The sum of bytes passed to system read calls. This includes terminal
+  // I/O and is independent of whether the physical disk is accessed.
+  uint64 bytes_read;
+  // The sum of bytes passed to system write calls. This includes terminal
+  // I/O and is independent of whether the physical disk is accessed.
+  uint64 bytes_written;
+  // Attempted count of read syscalls.
+  uint64 read_system_calls;
+  // Attempted count of write syscalls.
+  uint64 write_system_calls;
+  // Attempt to count the number of bytes which this process really did cause
+  // to be fetched from the storage layer.
+  uint64 physical_bytes_read;
+  // Attempt to count the number of bytes which this process caused to be sent
+  // to the storage layer.
+  uint64 physical_bytes_written;
+  // Number of bytes which this process caused to not happen, by truncating
+  // pagecache.
+  uint64 cancelled_bytes_written;
 };
 
 // Battery probe result. Can either be populated with the BatteryInfo or an
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml
index b73e81a..92dd5f1 100644
--- a/components/browser_ui/styles/android/java/res/values/styles.xml
+++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -9,7 +9,7 @@
         <!-- Text colors -->
         <item name="android:textColorLink">@color/default_text_color_link</item>
         <item name="android:textColorHighlight">@color/text_highlight_color</item>
-        <item name="android:textColorHint">@color/default_text_color_secondary</item>
+        <item name="android:textColorHint">@color/default_text_color_hint_list</item>
 
         <!-- Color of checkboxes, switches, buttons, etc. -->
         <item name="colorAccent">@color/default_control_color_active</item>
diff --git a/components/full_restore/full_restore_read_handler.cc b/components/full_restore/full_restore_read_handler.cc
index 07b49fd70..267b3b7 100644
--- a/components/full_restore/full_restore_read_handler.cc
+++ b/components/full_restore/full_restore_read_handler.cc
@@ -37,6 +37,15 @@
                      std::move(callback)));
 }
 
+void FullRestoreReadHandler::RemoveApp(const base::FilePath& profile_path,
+                                       const std::string& app_id) {
+  auto it = profile_path_to_restore_data_.find(profile_path);
+  if (it == profile_path_to_restore_data_.end())
+    return;
+
+  it->second->RemoveApp(app_id);
+}
+
 void FullRestoreReadHandler::OnGetRestoreData(
     const base::FilePath& profile_path,
     Callback callback,
diff --git a/components/full_restore/full_restore_read_handler.h b/components/full_restore/full_restore_read_handler.h
index 6104189b..f531d39 100644
--- a/components/full_restore/full_restore_read_handler.h
+++ b/components/full_restore/full_restore_read_handler.h
@@ -43,6 +43,10 @@
   // calls |callback| when the reading operation is done.
   void ReadFromFile(const base::FilePath& profile_path, Callback callback);
 
+  // Removes app launching and app windows for an app with the given |app_id|
+  // from |profile_path_to_restore_data_| for |profile_path| .
+  void RemoveApp(const base::FilePath& profile_path, const std::string& app_id);
+
  private:
   // Invoked when reading the restore data from |profile_path| is finished, and
   // calls |callback| to notify that the reading operation is done.
diff --git a/components/full_restore/full_restore_save_handler.cc b/components/full_restore/full_restore_save_handler.cc
index f6b2ebcc..0c45667 100644
--- a/components/full_restore/full_restore_save_handler.cc
+++ b/components/full_restore/full_restore_save_handler.cc
@@ -142,6 +142,19 @@
                          weak_factory_.GetWeakPtr(), profile_path));
 }
 
+void FullRestoreSaveHandler::RemoveApp(const base::FilePath& profile_path,
+                                       const std::string& app_id) {
+  auto it = profile_path_to_restore_data_.find(profile_path);
+  if (it == profile_path_to_restore_data_.end())
+    return;
+
+  it->second.RemoveApp(app_id);
+
+  pending_save_profile_paths_.insert(profile_path);
+
+  MaybeStartSaveTimer();
+}
+
 void FullRestoreSaveHandler::MaybeStartSaveTimer() {
   if (!save_timer_.IsRunning() && save_running_.empty()) {
     save_timer_.Start(FROM_HERE, kSaveDelay,
diff --git a/components/full_restore/full_restore_save_handler.h b/components/full_restore/full_restore_save_handler.h
index 4e6cc9ff..d1a81bd 100644
--- a/components/full_restore/full_restore_save_handler.h
+++ b/components/full_restore/full_restore_save_handler.h
@@ -65,6 +65,10 @@
   // data.
   void Flush(const base::FilePath& profile_path);
 
+  // Removes app launching and app windows for an app with the given |app_id|
+  // from |file_path_to_restore_data_| for |profile_path| .
+  void RemoveApp(const base::FilePath& profile_path, const std::string& app_id);
+
   base::OneShotTimer* GetTimerForTesting() { return &save_timer_; }
 
  private:
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
index f9455f4..018bb9c 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -298,7 +298,7 @@
       changeDiscoverFeedHeaderVisibility:[self.contentSuggestionsVisible
                                                  value]];
   self.suggestionsViewController.contentSuggestionsEnabled =
-      prefs->FindPreference(prefs::kArticlesForYouEnabled);
+      contentSuggestionsEnabled;
   self.suggestionsViewController.handler = self;
   self.contentSuggestionsMediator.consumer = self.suggestionsViewController;
 
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index 603fb7b..fd5e604 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-96000536c395a463386e923a7515471c664a5394
\ No newline at end of file
+19980861b244b1c9f0c3f389bb8d8a1ef5272dca
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index fb3c96e..936790f 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-27cc14be2139609c7c7da56c525c3bae5cf50d17
\ No newline at end of file
+a9906b12ff830faee298d693baea0493d2d8f8c8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
index 51f978a..4954a6e 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-8aa76742ce99c2f6bf9abdf6fd8e1ae5d7c8b833
\ No newline at end of file
+01a08f8e8f7482c18d3f9b00a3a5ecdc34d03fd0
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
index cb695ab..fec5239 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-0d6c6bcfbf96031da1e97b6ca45ec1b950c947d8
\ No newline at end of file
+01820e63c75a24d32ad4e0f415d3c2ab8e097fb6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index 427084cc..ff692916 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-ada10ff16fa2b99659bc9a41f13f8dfe50cc6770
\ No newline at end of file
+63b933988525e9ed3d348e1a947681aa491b3820
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index 56d73bd4..51ca470 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-c5e26248c1626432705c1dacf39c8ac405462c16
\ No newline at end of file
+911143fdb76c9713567da7140dd9a34572052047
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 61c4b9d8..d67b437 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-721a9c861f3bd1764e506cadc00abad6c6afbbe3
\ No newline at end of file
+8e900c2655f9577fdc8a03d798dac807166d789a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index fed1a58..d19efd0 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-d56e002052ef6e2460cecd84270eee100de66c32
\ No newline at end of file
+c4623b87c0e7c17033cfacfb53fd9cf20436d43e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index 290ed473..ccf9941 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-1d2d8d8eb2500924ef44d5567e62b8e999650149
\ No newline at end of file
+d124cc513ed5a625cd8f77851e0f8623831cbe21
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index 6a907b2..eb1c154 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-28a50656e0a255bd518dda7ae93dfc68fcac3054
\ No newline at end of file
+9f56cf69aaecaac6af268031fdf1909bd79fa6df
\ No newline at end of file
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc
index 5e1d35d..2f97c51cb 100644
--- a/media/audio/audio_manager_base.cc
+++ b/media/audio/audio_manager_base.cc
@@ -343,7 +343,7 @@
   std::string output_device_id =
       AudioDeviceDescription::IsDefaultDevice(device_id)
           ?
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
           // On ChromeOS, it is expected that, if the default device is given,
           // no specific device ID should be used since the actual output device
           // should change dynamically if the system default device changes.
diff --git a/services/network/trust_tokens/operation_timing_request_helper_wrapper.cc b/services/network/trust_tokens/operation_timing_request_helper_wrapper.cc
index 8037935..28f3ce2 100644
--- a/services/network/trust_tokens/operation_timing_request_helper_wrapper.cc
+++ b/services/network/trust_tokens/operation_timing_request_helper_wrapper.cc
@@ -7,9 +7,9 @@
 namespace network {
 
 OperationTimingRequestHelperWrapper::OperationTimingRequestHelperWrapper(
-    mojom::TrustTokenOperationType type,
+    std::unique_ptr<TrustTokenOperationMetricsRecorder> metrics_recorder,
     std::unique_ptr<TrustTokenRequestHelper> helper)
-    : type_(type), helper_(std::move(helper)) {}
+    : recorder_(std::move(metrics_recorder)), helper_(std::move(helper)) {}
 
 OperationTimingRequestHelperWrapper::~OperationTimingRequestHelperWrapper() =
     default;
@@ -17,7 +17,7 @@
 void OperationTimingRequestHelperWrapper::Begin(
     net::URLRequest* request,
     base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) {
-  recorder_.BeginBegin(type_);
+  recorder_->BeginBegin();
   helper_->Begin(
       request, base::BindOnce(&OperationTimingRequestHelperWrapper::FinishBegin,
                               weak_factory_.GetWeakPtr(), std::move(done)));
@@ -26,7 +26,7 @@
 void OperationTimingRequestHelperWrapper::Finalize(
     mojom::URLResponseHead* response,
     base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) {
-  recorder_.BeginFinalize();
+  recorder_->BeginFinalize();
   helper_->Finalize(
       response,
       base::BindOnce(&OperationTimingRequestHelperWrapper::FinishFinalize,
@@ -36,14 +36,14 @@
 void OperationTimingRequestHelperWrapper::FinishBegin(
     base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done,
     mojom::TrustTokenOperationStatus status) {
-  recorder_.FinishBegin(status);
+  recorder_->FinishBegin(status);
   std::move(done).Run(status);
 }
 
 void OperationTimingRequestHelperWrapper::FinishFinalize(
     base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done,
     mojom::TrustTokenOperationStatus status) {
-  recorder_.FinishFinalize(status);
+  recorder_->FinishFinalize(status);
   std::move(done).Run(status);
 }
 
diff --git a/services/network/trust_tokens/operation_timing_request_helper_wrapper.h b/services/network/trust_tokens/operation_timing_request_helper_wrapper.h
index bb8e846..b9804f7 100644
--- a/services/network/trust_tokens/operation_timing_request_helper_wrapper.h
+++ b/services/network/trust_tokens/operation_timing_request_helper_wrapper.h
@@ -10,6 +10,7 @@
 #include "base/memory/weak_ptr.h"
 #include "services/network/trust_tokens/trust_token_operation_metrics_recorder.h"
 #include "services/network/trust_tokens/trust_token_request_helper.h"
+#include "services/network/trust_tokens/trust_token_request_issuance_helper.h"
 
 namespace network {
 
@@ -19,7 +20,7 @@
 class OperationTimingRequestHelperWrapper : public TrustTokenRequestHelper {
  public:
   explicit OperationTimingRequestHelperWrapper(
-      mojom::TrustTokenOperationType type,
+      std::unique_ptr<TrustTokenOperationMetricsRecorder> metrics_recorder,
       std::unique_ptr<TrustTokenRequestHelper> helper);
   ~OperationTimingRequestHelperWrapper() override;
 
@@ -46,8 +47,7 @@
       base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done,
       mojom::TrustTokenOperationStatus status);
 
-  mojom::TrustTokenOperationType type_;
-  TrustTokenOperationMetricsRecorder recorder_;
+  std::unique_ptr<TrustTokenOperationMetricsRecorder> recorder_;
   std::unique_ptr<TrustTokenRequestHelper> helper_;
 
   base::WeakPtrFactory<OperationTimingRequestHelperWrapper> weak_factory_{this};
diff --git a/services/network/trust_tokens/trust_token_operation_metrics_recorder.cc b/services/network/trust_tokens/trust_token_operation_metrics_recorder.cc
index 23659efcd..3ec3a9ea 100644
--- a/services/network/trust_tokens/trust_token_operation_metrics_recorder.cc
+++ b/services/network/trust_tokens/trust_token_operation_metrics_recorder.cc
@@ -31,6 +31,8 @@
   switch (status) {
     case mojom::TrustTokenOperationStatus::kOk:
     case mojom::TrustTokenOperationStatus::kAlreadyExists:
+    case mojom::TrustTokenOperationStatus::
+        kOperationSuccessfullyFulfilledLocally:
       return "Success";
     default:
       return "Failure";
@@ -54,9 +56,13 @@
 
 }  // namespace
 
-void TrustTokenOperationMetricsRecorder::BeginBegin(
-    mojom::TrustTokenOperationType type) {
-  type_ = type;
+TrustTokenOperationMetricsRecorder::TrustTokenOperationMetricsRecorder(
+    mojom::TrustTokenOperationType type)
+    : type_(type) {}
+TrustTokenOperationMetricsRecorder::~TrustTokenOperationMetricsRecorder() =
+    default;
+
+void TrustTokenOperationMetricsRecorder::BeginBegin() {
   begin_start_ = base::TimeTicks::Now();
 }
 
diff --git a/services/network/trust_tokens/trust_token_operation_metrics_recorder.h b/services/network/trust_tokens/trust_token_operation_metrics_recorder.h
index 20ab192..ec1b2ce 100644
--- a/services/network/trust_tokens/trust_token_operation_metrics_recorder.h
+++ b/services/network/trust_tokens/trust_token_operation_metrics_recorder.h
@@ -7,6 +7,7 @@
 
 #include "base/time/time.h"
 #include "services/network/public/mojom/trust_tokens.mojom.h"
+#include "services/network/trust_tokens/trust_token_request_issuance_helper.h"
 
 namespace network {
 
@@ -29,15 +30,16 @@
 // operation.
 class TrustTokenOperationMetricsRecorder final {
  public:
-  TrustTokenOperationMetricsRecorder() = default;
-  ~TrustTokenOperationMetricsRecorder() = default;
+  explicit TrustTokenOperationMetricsRecorder(
+      mojom::TrustTokenOperationType type);
+  ~TrustTokenOperationMetricsRecorder();
 
   TrustTokenOperationMetricsRecorder(
       const TrustTokenOperationMetricsRecorder&) = delete;
   TrustTokenOperationMetricsRecorder& operator=(
       const TrustTokenOperationMetricsRecorder&) = delete;
 
-  void BeginBegin(mojom::TrustTokenOperationType type);
+  void BeginBegin();
   void FinishBegin(mojom::TrustTokenOperationStatus status);
 
   void BeginFinalize();
diff --git a/services/network/trust_tokens/trust_token_operation_metrics_recorder_unittest.cc b/services/network/trust_tokens/trust_token_operation_metrics_recorder_unittest.cc
index 3316660..adbdd1e 100644
--- a/services/network/trust_tokens/trust_token_operation_metrics_recorder_unittest.cc
+++ b/services/network/trust_tokens/trust_token_operation_metrics_recorder_unittest.cc
@@ -15,10 +15,11 @@
 TEST(TrustTokenOperationMetricsRecorder, Success) {
   base::test::TaskEnvironment env(
       base::test::TaskEnvironment::TimeSource::MOCK_TIME);
-  TrustTokenOperationMetricsRecorder recorder;
+  TrustTokenOperationMetricsRecorder recorder(
+      mojom::TrustTokenOperationType::kIssuance);
   base::HistogramTester histograms;
 
-  recorder.BeginBegin(mojom::TrustTokenOperationType::kIssuance);
+  recorder.BeginBegin();
   env.FastForwardBy(base::TimeDelta::FromSeconds(1));
   recorder.FinishBegin(mojom::TrustTokenOperationStatus::kOk);
 
@@ -59,10 +60,11 @@
 TEST(TrustTokenOperationMetricsRecorder, BeginFailure) {
   base::test::TaskEnvironment env(
       base::test::TaskEnvironment::TimeSource::MOCK_TIME);
-  TrustTokenOperationMetricsRecorder recorder;
+  TrustTokenOperationMetricsRecorder recorder(
+      mojom::TrustTokenOperationType::kRedemption);
   base::HistogramTester histograms;
 
-  recorder.BeginBegin(mojom::TrustTokenOperationType::kRedemption);
+  recorder.BeginBegin();
   env.FastForwardBy(base::TimeDelta::FromSeconds(1));
   recorder.FinishBegin(mojom::TrustTokenOperationStatus::kUnknownError);
 
@@ -77,10 +79,11 @@
 TEST(TrustTokenOperationMetricsRecorder, FinalizeFailure) {
   base::test::TaskEnvironment env(
       base::test::TaskEnvironment::TimeSource::MOCK_TIME);
-  TrustTokenOperationMetricsRecorder recorder;
+  TrustTokenOperationMetricsRecorder recorder(
+      mojom::TrustTokenOperationType::kSigning);
   base::HistogramTester histograms;
 
-  recorder.BeginBegin(mojom::TrustTokenOperationType::kSigning);
+  recorder.BeginBegin();
   env.FastForwardBy(base::TimeDelta::FromSeconds(1));
   recorder.FinishBegin(mojom::TrustTokenOperationStatus::kOk);
 
diff --git a/services/network/trust_tokens/trust_token_request_helper_factory.cc b/services/network/trust_tokens/trust_token_request_helper_factory.cc
index c5b9d70..8c76ded 100644
--- a/services/network/trust_tokens/trust_token_request_helper_factory.cc
+++ b/services/network/trust_tokens/trust_token_request_helper_factory.cc
@@ -25,8 +25,10 @@
 #include "services/network/trust_tokens/local_trust_token_operation_delegate.h"
 #include "services/network/trust_tokens/local_trust_token_operation_delegate_impl.h"
 #include "services/network/trust_tokens/operating_system_matching.h"
+#include "services/network/trust_tokens/operation_timing_request_helper_wrapper.h"
 #include "services/network/trust_tokens/suitable_trust_token_origin.h"
 #include "services/network/trust_tokens/trust_token_key_commitment_controller.h"
+#include "services/network/trust_tokens/trust_token_operation_metrics_recorder.h"
 #include "services/network/trust_tokens/trust_token_parameterization.h"
 #include "services/network/trust_tokens/trust_token_request_canonicalizer.h"
 #include "services/network/trust_tokens/trust_token_request_redemption_helper.h"
@@ -140,31 +142,36 @@
     TrustTokenStore* store) {
   DCHECK(params);
 
+  auto metrics_recorder =
+      std::make_unique<TrustTokenOperationMetricsRecorder>(params->type);
+
   switch (params->type) {
     case mojom::TrustTokenOperationType::kIssuance: {
       LogOutcome(net_log, params->type,
                  Outcome::kSuccessfullyCreatedAnIssuanceHelper);
-      std::move(done).Run(std::unique_ptr<TrustTokenRequestHelper>(
-          new TrustTokenRequestIssuanceHelper(
-              std::move(top_frame_origin), store, key_commitment_getter_,
-              std::make_unique<BoringsslTrustTokenIssuanceCryptographer>(),
-              std::make_unique<LocalTrustTokenOperationDelegateImpl>(
-                  context_client_provider_),
-              base::BindRepeating(&IsCurrentOperatingSystem),
-              std::move(net_log))));
+      auto helper = std::make_unique<TrustTokenRequestIssuanceHelper>(
+          std::move(top_frame_origin), store, key_commitment_getter_,
+          std::make_unique<BoringsslTrustTokenIssuanceCryptographer>(),
+          std::make_unique<LocalTrustTokenOperationDelegateImpl>(
+              context_client_provider_),
+          base::BindRepeating(&IsCurrentOperatingSystem), std::move(net_log));
+      std::move(done).Run(TrustTokenStatusOrRequestHelper(
+          std::make_unique<OperationTimingRequestHelperWrapper>(
+              std::move(metrics_recorder), std::move(helper))));
       return;
     }
 
     case mojom::TrustTokenOperationType::kRedemption: {
       LogOutcome(net_log, params->type,
                  Outcome::kSuccessfullyCreatedARedemptionHelper);
-      std::move(done).Run(std::unique_ptr<TrustTokenRequestHelper>(
-          new TrustTokenRequestRedemptionHelper(
-              std::move(top_frame_origin), params->refresh_policy, store,
-              key_commitment_getter_,
-              std::make_unique<Ed25519KeyPairGenerator>(),
-              std::make_unique<BoringsslTrustTokenRedemptionCryptographer>(),
-              std::move(net_log))));
+      auto helper = std::make_unique<TrustTokenRequestRedemptionHelper>(
+          std::move(top_frame_origin), params->refresh_policy, store,
+          key_commitment_getter_, std::make_unique<Ed25519KeyPairGenerator>(),
+          std::make_unique<BoringsslTrustTokenRedemptionCryptographer>(),
+          std::move(net_log));
+      std::move(done).Run(TrustTokenStatusOrRequestHelper(
+          std::make_unique<OperationTimingRequestHelperWrapper>(
+              std::move(metrics_recorder), std::move(helper))));
       return;
     }
 
@@ -199,12 +206,14 @@
 
       LogOutcome(net_log, params->type,
                  Outcome::kSuccessfullyCreatedASigningHelper);
-      std::move(done).Run(std::unique_ptr<TrustTokenRequestHelper>(
-          new TrustTokenRequestSigningHelper(
-              store, std::move(signing_params),
-              std::make_unique<Ed25519TrustTokenRequestSigner>(),
-              std::make_unique<TrustTokenRequestCanonicalizer>(),
-              std::move(net_log))));
+      auto helper = std::make_unique<TrustTokenRequestSigningHelper>(
+          store, std::move(signing_params),
+          std::make_unique<Ed25519TrustTokenRequestSigner>(),
+          std::make_unique<TrustTokenRequestCanonicalizer>(),
+          std::move(net_log));
+      std::move(done).Run(TrustTokenStatusOrRequestHelper(
+          std::make_unique<OperationTimingRequestHelperWrapper>(
+              std::move(metrics_recorder), std::move(helper))));
       return;
     }
   }
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 2a7e0e1..f33e95c 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -70,7 +70,6 @@
 #include "services/network/resource_scheduler/resource_scheduler_client.h"
 #include "services/network/sec_header_helpers.h"
 #include "services/network/throttling/scoped_throttling_token.h"
-#include "services/network/trust_tokens/operation_timing_request_helper_wrapper.h"
 #include "services/network/trust_tokens/trust_token_request_helper.h"
 #include "url/origin.h"
 
@@ -879,8 +878,7 @@
     return;
   }
 
-  trust_token_helper_ = std::make_unique<OperationTimingRequestHelperWrapper>(
-      type, status_or_helper.TakeOrCrash());
+  trust_token_helper_ = status_or_helper.TakeOrCrash();
   trust_token_helper_->Begin(
       url_request_.get(),
       base::BindOnce(&URLLoader::OnDoneBeginningTrustTokenOperation,
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 18b0327..f98cac5 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -240,11 +240,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -254,7 +254,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -317,11 +317,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -331,7 +331,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -394,11 +394,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -408,7 +408,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -471,11 +471,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -485,7 +485,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -769,11 +769,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -783,7 +783,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -846,11 +846,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -860,7 +860,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -923,11 +923,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -937,7 +937,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1000,11 +1000,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -1014,7 +1014,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1298,11 +1298,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -1312,7 +1312,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1375,11 +1375,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -1389,7 +1389,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1452,11 +1452,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -1466,7 +1466,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1529,11 +1529,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -1543,7 +1543,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1827,11 +1827,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -1841,7 +1841,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1904,11 +1904,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -1918,7 +1918,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1981,11 +1981,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.146",
         "resultdb": {
           "enable": true
         },
@@ -1995,7 +1995,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M87",
-              "revision": "version:87.0.4280.145"
+              "revision": "version:87.0.4280.146"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -2058,11 +2058,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82"
+            "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.83",
         "resultdb": {
           "enable": true
         },
@@ -2072,7 +2072,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M88",
-              "revision": "version:88.0.4324.82"
+              "revision": "version:88.0.4324.83"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index f782eb49..ba85f789 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -319,13 +319,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=88',
     ],
-    'identifier': 'Implementation Tests For 88.0.4324.82',
+    'identifier': 'Implementation Tests For 88.0.4324.83',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.82',
+          'revision': 'version:88.0.4324.83',
         }
       ],
     },
@@ -342,13 +342,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=87',
     ],
-    'identifier': 'Implementation Tests For 87.0.4280.145',
+    'identifier': 'Implementation Tests For 87.0.4280.146',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M87',
-          'revision': 'version:87.0.4280.145',
+          'revision': 'version:87.0.4280.146',
         }
       ],
     },
@@ -388,13 +388,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=88',
     ],
-    'identifier': 'Client Tests For 88.0.4324.82',
+    'identifier': 'Client Tests For 88.0.4324.83',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M88',
-          'revision': 'version:88.0.4324.82',
+          'revision': 'version:88.0.4324.83',
         }
       ],
     },
@@ -411,13 +411,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=87',
     ],
-    'identifier': 'Client Tests For 87.0.4280.145',
+    'identifier': 'Client Tests For 87.0.4280.146',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M87',
-          'revision': 'version:87.0.4280.145',
+          'revision': 'version:87.0.4280.146',
         }
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 40cb89ea1..deda8d35 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -7950,7 +7950,8 @@
                 "chromeos",
                 "linux",
                 "ios",
-                "android"
+                "android",
+                "android_webview"
             ],
             "experiments": [
                 {
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index fb0c736f..fc1dcaa2 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -10254,6 +10254,13 @@
       null,
       {}
      ]
+    ],
+    "usbDevice_transferIn-manual.https.html": [
+     "bd3df7d54ea63b45920d31d5719782ca1f066911",
+     [
+      null,
+      {}
+     ]
     ]
    },
    "xhr": {
@@ -52904,6 +52911,19 @@
        {}
       ]
      ],
+     "out-of-flow-in-multicolumn-014.html": [
+      "b6cede0400fc8c9fdc4ef136a7d3326056bda482",
+      [
+       null,
+       [
+        [
+         "/css/css-break/out-of-flow-in-multicolumn-014-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "overflowed-block-with-no-room-after-000.html": [
       "084e16fb38de072fb83f92ba01302a2e404cdd97",
       [
@@ -184067,6 +184087,10 @@
       "bc6669e466ba0e4e29bf56b889f59e513f9270c4",
       []
      ],
+     "out-of-flow-in-multicolumn-014-ref.html": [
+      "6388a1864443571ea24e6174459c5205440ab030",
+      []
+     ],
      "parsing": {
       "box-decoration-break-computed-expected.txt": [
        "2bf7d5cfd390f7f989cffa3197643b87699fdefe",
@@ -236239,7 +236263,7 @@
      []
     ],
     "html.idl": [
-     "dfe4e1e586b5a2b5c5ba070f3c73bc55061e999d",
+     "5b30344ab7db4d3374c07a02a7b9453d18cccdf9",
      []
     ],
     "idle-detection.tentative.idl": [
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/html.idl b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
index dfe4e1e..5b30344a 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/html.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
@@ -1397,11 +1397,11 @@
 
 interface mixin CanvasImageData {
   // pixel manipulation
-  ImageData createImageData(long sw, long sh);
+  ImageData createImageData([EnforceRange] long sw, [EnforceRange] long sh);
   ImageData createImageData(ImageData imagedata);
-  ImageData getImageData(long sx, long sy, long sw, long sh);
-  undefined putImageData(ImageData imagedata, long dx, long dy);
-  undefined putImageData(ImageData imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight);
+  ImageData getImageData([EnforceRange] long sx, [EnforceRange] long sy, [EnforceRange] long sw, [EnforceRange] long sh);
+  undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy);
+  undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy, [EnforceRange] long dirtyX, [EnforceRange] long dirtyY, [EnforceRange] long dirtyWidth, [EnforceRange] long dirtyHeight);
 };
 
 enum CanvasLineCap { "butt", "round", "square" };
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index ec0cd5f..3e9044e3 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,8 +1,8 @@
 {
     "trace_processor_shell": {
         "win": {
-            "hash": "0104dfe57b4d98879c4238741f712a983facfbd5",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/affdce7627b1030441a19608a1bcb321190786da/trace_processor_shell.exe"
+            "hash": "1b175a93430138b7855ceeb6eb8516c7e66c3684",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/35f78f4a4562f61cde3b096492628e1d47acb04e/trace_processor_shell.exe"
         },
         "mac": {
             "hash": "ad7587bcfdd72883c1e1b1596ddec4f81bbf7736",
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index fa6f3c8..65c930f4 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -147,6 +147,7 @@
     "java/res/color/chip_stroke_color.xml",
     "java/res/color/chip_text_color.xml",
     "java/res/color/chip_text_color_secondary.xml",
+    "java/res/color/default_text_color_hint_list.xml",
     "java/res/color/default_text_color_inverse_list.xml",
     "java/res/color/default_text_color_light_list.xml",
     "java/res/color/default_text_color_list.xml",
diff --git a/ui/android/java/res/color/default_text_color_hint_list.xml b/ui/android/java/res/color/default_text_color_hint_list.xml
new file mode 100644
index 0000000..d38c58d
--- /dev/null
+++ b/ui/android/java/res/color/default_text_color_hint_list.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/default_text_color_disabled" android:state_enabled="false"/>
+    <item android:color="@color/default_text_color_secondary" />
+</selector>
\ No newline at end of file
diff --git a/ui/base/ime/win/tsf_text_store.cc b/ui/base/ime/win/tsf_text_store.cc
index 31309dd..1f810083 100644
--- a/ui/base/ime/win/tsf_text_store.cc
+++ b/ui/base/ime/win/tsf_text_store.cc
@@ -972,8 +972,15 @@
   }
 
   composition_start_ = selection_.start();
-  if (has_composition_range_)
-    ResetCompositionState();
+  if (has_composition_range_) {
+    has_composition_range_ = false;
+    composition_range_.set_start(0);
+    composition_range_.set_end(0);
+    previous_composition_string_.clear();
+    previous_composition_start_ = 0;
+    previous_composition_selection_range_ = gfx::Range::InvalidRange();
+    previous_text_spans_.clear();
+  }
 
   return S_OK;
 }