diff --git a/DEPS b/DEPS
index 8a202e8..2d11fc4 100644
--- a/DEPS
+++ b/DEPS
@@ -307,7 +307,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': 'cec91930530102b5cab785e078833355460a29a4',
+  'devtools_frontend_revision': '326dde8dbf802b1e6d7e261d0f158e86e54d70bd',
   # 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.
@@ -767,7 +767,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'rOx8FKu0Xea5Ep_QWAdGfZxkFrD2gLlSoZQRUkrHAnoC',
+          'version': 'LeiIWludv84_u11Z19AGLNhYxzZcsn_fP-PjDjkxdCsC',
       },
     ],
     'condition': 'checkout_android',
@@ -998,7 +998,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '6510efabe2490f3eff1bb01407b95de7b6931ee2',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '53663a4749e92260ff05fb559e17662630795f6e',
       'condition': 'checkout_linux',
   },
 
@@ -1478,7 +1478,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/aemu/linux-amd64',
-              'version': '7Qw4BSbScKvI8QCVSORMrBnyJGBU5P5TY1DbfaHlaVMC'
+              'version': 'pmyID7CW-4NsGYefh7NnE4xj3AbHD5lu9r5GLO3rzMYC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1621,7 +1621,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'c53abb766db4f9a1369b084b985319379b74f1b7',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '481e3451d161bd25ce9d31605974a6273aab9e7a',
+    Var('webrtc_git') + '/src.git' + '@' + 'f48d3cfbabbd9c94c358dd78f461cb01a0253d8a',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1682,7 +1682,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@7cbe3d05b4480b09b8e3d25c8df1e44a6380f017',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@aed2dbb78847aee2d4f3997afb84418573b2fc5e',
     'condition': 'checkout_src_internal',
   },
 
@@ -1712,7 +1712,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'Sonb5WaENxL_8iqPtvFFqLyouCqO7EQyR0zj_jIXbZcC',
+        'version': 'JXDFnXGQv7TTH536aBAeQGpv-yVwwXaGiHQIWyolCUoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS
index 35f53d2..d2757f7 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1845,7 +1845,6 @@
     },
     'textinput_chromeos': {
       'filepath': 'chrome/browser/ash/input_method/'\
-                  '|chrome/browser/chromeos/input_method'\
                   '|chrome/browser/chromeos/extensions/input_method'\
                   '|chrome/browser/chromeos/status/input_method'\
                   '|chrome/browser/extensions/api/input_ime'\
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index afba121..7260789 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -638,6 +638,13 @@
         render_frame_host);
     return true;
   }
+  if (interface_name == page_load_metrics::mojom::PageLoadMetrics::Name_) {
+    page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
+        mojo::PendingAssociatedReceiver<
+            page_load_metrics::mojom::PageLoadMetrics>(std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
   if (interface_name ==
       security_interstitials::mojom::InterstitialCommands::Name_) {
     security_interstitials::SecurityInterstitialTabHelper::
diff --git a/ash/public/cpp/app_list/app_list_config.h b/ash/public/cpp/app_list/app_list_config.h
index 0501c75..4ff6cd7 100644
--- a/ash/public/cpp/app_list/app_list_config.h
+++ b/ash/public/cpp/app_list/app_list_config.h
@@ -97,6 +97,15 @@
                      search_list_favicon_dimension_);
   }
 
+  int search_list_thumbnail_dimension() const {
+    return search_list_thumbnail_dimension_;
+  }
+
+  gfx::Size search_list_thumbnail_size() const {
+    return gfx::Size(search_list_thumbnail_dimension_,
+                     search_list_thumbnail_dimension_);
+  }
+
   int search_list_icon_vertical_bar_dimension() const {
     return search_list_icon_vertical_bar_dimension_;
   }
@@ -174,6 +183,9 @@
   // The favicon dimension of list views in search result page view.
   const int search_list_favicon_dimension_ = 18;
 
+  // The icon dimension of file thumbnail views in search result page view.
+  const int search_list_thumbnail_dimension_ = 28;
+
   // The vertical bar icon dimension of list views in search result page view.
   const int search_list_icon_vertical_bar_dimension_ = 48;
 
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index e23516ee..6e89c1c 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -618,6 +618,7 @@
 <translation id="5837036133683224804">Stop <ph name="ROUTE_TITLE" /> on <ph name="RECEIVER_NAME" /></translation>
 <translation id="5860033963881614850">Off</translation>
 <translation id="5860491529813859533">Turn on</translation>
+<translation id="5867217927013474703">Collecting network information</translation>
 <translation id="5876666360658629066">Enter parental code</translation>
 <translation id="5881540930187678962">Set up Phone Hub later</translation>
 <translation id="5895138241574237353">Restart</translation>
@@ -692,6 +693,7 @@
 <translation id="6482559668224714696">Full-screen magnifier</translation>
 <translation id="6490471652906364588">USB-C device (right port)</translation>
 <translation id="649452524636452238">Smart card PIN</translation>
+<translation id="6500818810472529210">See result in Google Search</translation>
 <translation id="6501401484702599040">Casting screen to <ph name="RECEIVER_NAME" /></translation>
 <translation id="6520517963145875092">Select a window to capture</translation>
 <translation id="652139407789908527">Your screen will go blank for longer than usual (up to a minute) during this update. Please don't press the power button while the update is in progress.</translation>
@@ -990,6 +992,7 @@
 <translation id="8818320199597151042">Removing profile. Wait a few minutes.</translation>
 <translation id="8825863694328519386">Swipe from the left to go back</translation>
 <translation id="8828714802988429505">90°</translation>
+<translation id="8832757911363938552">You can stop packet capture at any time.</translation>
 <translation id="8841375032071747811">Back button</translation>
 <translation id="8843682306134542540">Toggle rotation lock. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index f007eab..02fde1e 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -618,6 +618,7 @@
 <translation id="5837036133683224804"><ph name="RECEIVER_NAME" /> මත <ph name="ROUTE_TITLE" /> නවත්වන්න</translation>
 <translation id="5860033963881614850">අක්‍රීය</translation>
 <translation id="5860491529813859533">ක්‍රියාත්මක කරන්න</translation>
+<translation id="5867217927013474703">ජාල තොරතුරු රැස් කරමින්</translation>
 <translation id="5876666360658629066">මාපිය කේතය ඇතුළත් කරන්න</translation>
 <translation id="5881540930187678962">පසුව Phone Hub පිහිටුවන්න</translation>
 <translation id="5895138241574237353">යළි අරඹන්න</translation>
@@ -692,6 +693,7 @@
 <translation id="6482559668224714696">පූර්ණ තිර විශාලකය</translation>
 <translation id="6490471652906364588">USB-C උපාංගය (දකුණු තොට)</translation>
 <translation id="649452524636452238">ස්මාර්ට් කාඩ්පත් රහස් අංකය</translation>
+<translation id="6500818810472529210">Google සෙවීම තුළ ප්‍රතිඵල බලන්න</translation>
 <translation id="6501401484702599040"><ph name="RECEIVER_NAME" /> වෙත තිරය විකාශය කරමින්</translation>
 <translation id="6520517963145875092">ග්‍රහණය කිරීමට කවුළුවක් තෝරන්න</translation>
 <translation id="652139407789908527">මෙම යාවත්කාලීන සමයේ ඔබේ තිරය සාමාන්‍යයට වඩා දිග වේලාවකට (විනාඩියක් දක්වා) හිස් වෙයි. යාවත්කාලීනය සිදු වෙමින් පවතින විට බල බොත්තම නොඔබන්න.</translation>
@@ -990,6 +992,7 @@
 <translation id="8818320199597151042">පැතිකඩ ඉවත් කරමින්. මිනිත්තු කිහිපයක් රැඳී සිටින්න.</translation>
 <translation id="8825863694328519386">ආපසු යාමට වමින් ස්වයිප් කරන්න</translation>
 <translation id="8828714802988429505">90°</translation>
+<translation id="8832757911363938552">ඔබට ඕනෑම වේලාවක පැකට් ග්‍රහණය නැවැත්විය හැකිය.</translation>
 <translation id="8841375032071747811">ආපසු බොත්තම</translation>
 <translation id="8843682306134542540">කරකැවීමේ අගුල මාරු කරන්න. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index fd3254a..7cd1c33 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -893,7 +893,9 @@
 // Test that we can fetch the real allocated size after an allocation.
 TEST_F(PartitionAllocTest, AllocGetSizeAndStart) {
   void* ptr;
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
   void* slot_start;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
   size_t requested_size, actual_capacity, predicted_capacity;
 
   // Allocate something small.
@@ -902,7 +904,9 @@
       allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
   ptr = allocator.root()->Alloc(requested_size, type_name);
   EXPECT_TRUE(ptr);
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
   slot_start = reinterpret_cast<char*>(ptr) - allocator.root()->extras_offset;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
   actual_capacity = allocator.root()->AllocationCapacityFromPtr(ptr);
   EXPECT_EQ(predicted_capacity, actual_capacity);
   EXPECT_LT(requested_size, actual_capacity);
@@ -921,7 +925,9 @@
       allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
   ptr = allocator.root()->Alloc(requested_size, type_name);
   EXPECT_TRUE(ptr);
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
   slot_start = reinterpret_cast<char*>(ptr) - allocator.root()->extras_offset;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
   actual_capacity = allocator.root()->AllocationCapacityFromPtr(ptr);
   EXPECT_EQ(predicted_capacity, actual_capacity);
   EXPECT_EQ(requested_size, actual_capacity);
@@ -945,7 +951,9 @@
       allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
   ptr = allocator.root()->Alloc(requested_size, type_name);
   EXPECT_TRUE(ptr);
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
   slot_start = reinterpret_cast<char*>(ptr) - allocator.root()->extras_offset;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
   actual_capacity = allocator.root()->AllocationCapacityFromPtr(ptr);
   EXPECT_EQ(predicted_capacity, actual_capacity);
   EXPECT_EQ(requested_size + SystemPageSize(), actual_capacity);
@@ -962,7 +970,9 @@
       allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
   ptr = allocator.root()->Alloc(requested_size, type_name);
   EXPECT_TRUE(ptr);
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
   slot_start = reinterpret_cast<char*>(ptr) - allocator.root()->extras_offset;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
   actual_capacity = allocator.root()->AllocationCapacityFromPtr(ptr);
   EXPECT_EQ(predicted_capacity, actual_capacity);
   EXPECT_EQ(requested_size, actual_capacity);
@@ -985,7 +995,9 @@
         allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
     ptr = allocator.root()->Alloc(requested_size, type_name);
     EXPECT_TRUE(ptr);
+#if BUILDFLAG(USE_BACKUP_REF_PTR)
     slot_start = reinterpret_cast<char*>(ptr) - allocator.root()->extras_offset;
+#endif  // BUILDFLAG(USE_BACKUP_REF_PTR)
     actual_capacity = allocator.root()->AllocationCapacityFromPtr(ptr);
     EXPECT_EQ(predicted_capacity, actual_capacity);
     EXPECT_LT(requested_size, actual_capacity);
diff --git a/base/memory/checked_ptr_unittest.cc b/base/memory/checked_ptr_unittest.cc
index 692eb89..43132b3c 100644
--- a/base/memory/checked_ptr_unittest.cc
+++ b/base/memory/checked_ptr_unittest.cc
@@ -12,6 +12,7 @@
 
 #include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
+#include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
@@ -190,6 +191,7 @@
   bool is_not_valid = !ptr;
   if (!ptr)
     is_not_valid = true;
+  ALLOW_UNUSED_LOCAL(is_not_valid);
   std::ignore = IsValidNoCast(ptr);
   std::ignore = IsValidNoCast2(ptr);
   FuncThatAcceptsBool(!ptr);
@@ -211,6 +213,7 @@
   CountingCheckedPtr<int> ptr = nullptr;
   bool is_valid = ptr;
   is_valid = IsValidWithCast(ptr);
+  ALLOW_UNUSED_LOCAL(is_valid);
   FuncThatAcceptsBool(ptr);
   EXPECT_EQ(g_get_for_comparison_cnt, 0);
   EXPECT_EQ(g_get_for_extraction_cnt, 3);
diff --git a/base/profiler/test_support_library.cc b/base/profiler/test_support_library.cc
index 4c00571b..1950bf85 100644
--- a/base/profiler/test_support_library.cc
+++ b/base/profiler/test_support_library.cc
@@ -25,6 +25,7 @@
   // Prevent tail call.
   volatile int i = 0;
   i = 1;
+  (void)i;
 }
 
 }  // extern "C"
diff --git a/base/synchronization/lock_perftest.cc b/base/synchronization/lock_perftest.cc
index 5081795..de6a573a 100644
--- a/base/synchronization/lock_perftest.cc
+++ b/base/synchronization/lock_perftest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/compiler_specific.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
@@ -72,6 +73,7 @@
     timer.NextLap();
   } while (!timer.HasTimeLimitExpired());
 
+  ALLOW_UNUSED_LOCAL(data);
   auto reporter = SetUpReporter(kStoryBaseline);
   reporter.AddResult(kMetricLockUnlockThroughput, timer.LapsPerSecond());
 }
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 058c345..079acb4 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -1292,7 +1292,8 @@
         ShouldReportIpcTaskQueuedFromAnyThreadLocked(&time_since_disabled);
   }
 
-  ReportIpcTaskQueued(pending_task, task_queue_name, time_since_disabled);
+  if (should_report)
+    ReportIpcTaskQueued(pending_task, task_queue_name, time_since_disabled);
 }
 
 void TaskQueueImpl::ReportIpcTaskQueued(
diff --git a/base/time/time_override.h b/base/time/time_override.h
index edb8483..c4cb670 100644
--- a/base/time/time_override.h
+++ b/base/time/time_override.h
@@ -5,6 +5,8 @@
 #ifndef BASE_TIME_TIME_OVERRIDE_H_
 #define BASE_TIME_TIME_OVERRIDE_H_
 
+#include <atomic>
+
 #include "base/base_export.h"
 #include "base/macros.h"
 #include "base/time/time.h"
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index e858669c..e2cc597 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-6.20210730.3.1
+6.20210801.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index e858669c..e2cc597 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-6.20210730.3.1
+6.20210801.3.1
diff --git a/chrome/VERSION b/chrome/VERSION
index e4d8a19..0d733439 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=94
 MINOR=0
-BUILD=4594
+BUILD=4596
 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 8bca2629..f97423a55 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -576,6 +576,7 @@
   "javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java",
+  "javatests/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicyTest.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/TestTabModelDirectory.java",
   "javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java",
   "javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator.java
index 024d064..eb2be9db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabModelOrchestrator.java
@@ -104,6 +104,12 @@
     }
 
     /**
+     * Clean up persistent state for a given instance.
+     * @param instanceId Instance ID.
+     */
+    public void cleanupInstance(int instanceId) {}
+
+    /**
      * If there is an asynchronous session restore in-progress, try to synchronously restore
      * the state of a tab with the given url as a frozen tab. This method has no effect if
      * there isn't a tab being restored with this url, or the tab has already been restored.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator.java
index a930e0a3..161b736 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestrator.java
@@ -8,12 +8,14 @@
 import android.os.Build;
 import android.util.Pair;
 
+import androidx.annotation.VisibleForTesting;
+
 import org.chromium.chrome.browser.multiwindow.MultiInstanceManager;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
 import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
-import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorBase;
 import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
 import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
 import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
@@ -54,7 +56,7 @@
         if (selectorAssignment == null) {
             mTabModelSelector = null;
         } else {
-            mTabModelSelector = (TabModelSelectorImpl) selectorAssignment.second;
+            mTabModelSelector = (TabModelSelectorBase) selectorAssignment.second;
         }
 
         if (mTabModelSelector == null) {
@@ -100,4 +102,14 @@
         }
         return mergeTabs;
     }
+
+    @Override
+    public void cleanupInstance(int instanceId) {
+        mTabPersistentStore.cleanupStateFile(instanceId);
+    }
+
+    @VisibleForTesting
+    public TabPersistentStore getTabPersistentStoreForTesting() {
+        return mTabPersistentStore;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
index b187b6f..adc4c4f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -339,7 +339,7 @@
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     protected void closeInstance(int instanceId, int taskId) {
         removeInstanceInfo(instanceId);
-        // TODO: Delete persistent instance/tab state files too.
+        mTabModelOrchestratorSupplier.get().cleanupInstance(instanceId);
         Activity activity = getActivityById(instanceId);
         if (activity != null) ApiCompatibilityUtils.finishAndRemoveTask(activity);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
index 6c66997..3fc644ad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
@@ -91,6 +91,14 @@
     void cleanupUnusedFiles(Callback<List<String>> filesToDelete);
 
     /**
+     * Clean up the persistent state for a given instance.
+     * @param index ID of an instance whose state will be deleted.
+     * @param filesToDelete Callback that is triggered with the filenames to delete.  These files
+     *                      need to reside in {@link #getOrCreateStateDirectory()}.
+     */
+    default void cleanupInstanceState(int index, Callback<List<String>> filesToDelete) {}
+
+    /**
      * Sets the {@link TabContentManager} to use.
      * @param cache The {@link TabContentManager} to use.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
index d02a5496..660f880 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -1532,6 +1532,24 @@
     }
 
     /**
+     * Clean up persistent state for a given instance.
+     * @param instanceId Instance ID.
+     */
+    public void cleanupStateFile(int instanceId) {
+        mPersistencePolicy.cleanupInstanceState(instanceId, new Callback<List<String>>() {
+            @Override
+            public void onResult(List<String> result) {
+                // Delete the instance state file (tab_stateX) as well.
+                deleteFileAsync(TabbedModeTabPersistencePolicy.getStateFileName(instanceId), true);
+
+                // |result| can be null if the task gets cancelled.
+                if (result == null) return;
+                for (int i = 0; i < result.size(); i++) deleteFileAsync(result.get(i), true);
+            }
+        });
+    }
+
+    /**
      * File mutations (e.g. saving & deleting) are explicitly serialized to ensure that they occur
      * in the correct order.
      *
@@ -1780,4 +1798,9 @@
     void addTabToRestoreForTesting(TabRestoreDetails tabDetails) {
         mTabsToRestore.add(tabDetails);
     }
+
+    @VisibleForTesting
+    public TabPersistencePolicy getTabPersistencePolicyForTesting() {
+        return mPersistencePolicy;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
index c6dd4ecb..ee8806fe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
@@ -17,6 +17,7 @@
 import org.chromium.base.StreamUtil;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.supplier.Supplier;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.BackgroundOnlyAsyncTask;
 import org.chromium.base.task.TaskRunner;
@@ -319,12 +320,69 @@
     public void cleanupUnusedFiles(Callback<List<String>> filesToDelete) {
         synchronized (CLEAN_UP_TASK_LOCK) {
             if (sCleanupTask != null) sCleanupTask.cancel(true);
-            sCleanupTask = new CleanUpTabStateDataTask(filesToDelete);
+            sCleanupTask = new CleanUpTabStateDataTask(
+                    filesToDelete, () -> getOtherTabsId(mSelectorIndex));
             sCleanupTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
         }
     }
 
     @Override
+    public void cleanupInstanceState(int index, Callback<List<String>> filesToDelete) {
+        TabModelSelector selector =
+                TabWindowManagerSingleton.getInstance().getTabModelSelectorById(index);
+        if (selector != null) {
+            // Remove all the tabs from the instance if it is in running state to be able to
+            // delete the corresponding tab state file.
+            for (int i = 0; i < selector.getModels().size(); i++) {
+                TabModel tabModel = selector.getModels().get(i);
+                while (tabModel.getCount() > 0) tabModel.removeTab(tabModel.getTabAt(0));
+            }
+        }
+        synchronized (CLEAN_UP_TASK_LOCK) {
+            if (sCleanupTask != null) sCleanupTask.cancel(true);
+            sCleanupTask = new CleanUpTabStateDataTask(filesToDelete, () -> getOtherTabsId(index));
+            sCleanupTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        }
+    }
+
+    /**
+     * Gets the IDs of all tabs in the instances other than the specified one. IDs for custom tabs
+     * are excluded.
+     * @param index Index of the instance whose tabs are being deleted.
+     */
+    private SparseBooleanArray getOtherTabsId(int index) {
+        SparseBooleanArray tabIds = new SparseBooleanArray();
+        for (int i = 0; i < mMaxSelectors; ++i) {
+            // Although we check all selectors before deleting, we can only be sure that our own
+            // selector will not go away between now and then. So, we read from disk all other
+            // state files, even if they are already loaded by another selector.
+            if (i != index) getTabsFromStateFiles(tabIds, i);
+        }
+        return tabIds;
+    }
+
+    /**
+     * Gets the IDs of all tabs in TabModelSelectors of a given instance.
+     * @param tabIds SparseBooleanArray to populate with TabIds.
+     * @param index Index for the corresponding instance.
+     */
+    private void getTabsFromStateFiles(SparseBooleanArray tabIds, int index) {
+        File metadataFile = new File(getOrCreateStateDirectory(), getStateFileName(index));
+        if (metadataFile.exists()) {
+            DataInputStream stream = null;
+            try {
+                stream = new DataInputStream(
+                        new BufferedInputStream(new FileInputStream(metadataFile)));
+                TabPersistentStore.readSavedStateFile(stream, null, tabIds, false);
+            } catch (Exception e) {
+                Log.e(TAG, "Unable to read state for " + metadataFile.getName() + ": " + e);
+            } finally {
+                StreamUtil.closeQuietly(stream);
+            }
+        }
+    }
+
+    @Override
     public void setTabContentManager(TabContentManager cache) {
         mTabContentManager = cache;
     }
@@ -345,10 +403,13 @@
 
         private String[] mTabFileNames;
         private String[] mThumbnailFileNames;
-        private SparseBooleanArray mOtherTabIds;
+        private Supplier<SparseBooleanArray> mOtherTabSupplier;
+        private SparseBooleanArray mOtherTabIds; // Tab in use by other selectors, not be deleted.
 
-        CleanUpTabStateDataTask(Callback<List<String>> filesToDelete) {
+        CleanUpTabStateDataTask(Callback<List<String>> filesToDelete,
+                Supplier<SparseBooleanArray> otherTabsSupplier) {
             mFilesToDeleteCallback = filesToDelete;
+            mOtherTabSupplier = otherTabsSupplier;
         }
 
         @Override
@@ -358,9 +419,7 @@
             mTabFileNames = getOrCreateStateDirectory().list();
             String thumbnailDirectory = PathUtils.getThumbnailCacheDirectory();
             mThumbnailFileNames = new File(thumbnailDirectory).list();
-
-            mOtherTabIds = new SparseBooleanArray();
-            getTabsFromOtherStateFiles(mOtherTabIds);
+            mOtherTabIds = mOtherTabSupplier.get();
             return null;
         }
 
@@ -369,8 +428,8 @@
             if (mDestroyed) return;
             TabWindowManager tabWindowManager = TabWindowManagerSingleton.getInstance();
 
+            List<String> filesToDelete = new ArrayList<>();
             if (mTabFileNames != null) {
-                List<String> filesToDelete = new ArrayList<>();
                 for (String fileName : mTabFileNames) {
                     Pair<Integer, Boolean> data =
                             TabStateFileManager.parseInfoFromFilename(fileName);
@@ -381,8 +440,11 @@
                         }
                     }
                 }
-                mFilesToDeleteCallback.onResult(filesToDelete);
             }
+            // Invoke the callback even if filesToDelete is empty since it could perform other
+            // cleanups.
+            mFilesToDeleteCallback.onResult(filesToDelete);
+
             if (mTabContentManager != null && mThumbnailFileNames != null) {
                 for (String fileName : mThumbnailFileNames) {
                     try {
@@ -405,34 +467,6 @@
             return tabWindowManager.getTabById(tabId) == null && !mOtherTabIds.get(tabId);
         }
 
-        /**
-         * Gets the IDs of all tabs in TabModelSelectors other than the currently selected one. IDs
-         * for custom tabs are excluded.
-         * @param tabIds SparseBooleanArray to populate with TabIds.
-         */
-        private void getTabsFromOtherStateFiles(SparseBooleanArray tabIds) {
-            for (int i = 0; i < mMaxSelectors; i++) {
-                // Although we check all selectors before deleting, we can only be sure that our own
-                // selector will not go away between now and then. So, we read from disk all other
-                // state files, even if they are already loaded by another selector.
-                if (i == mSelectorIndex) continue;
-
-                File metadataFile = new File(getOrCreateStateDirectory(), getStateFileName(i));
-                if (metadataFile.exists()) {
-                    DataInputStream stream = null;
-                    try {
-                        stream = new DataInputStream(
-                                new BufferedInputStream(new FileInputStream(metadataFile)));
-                        TabPersistentStore.readSavedStateFile(stream, null, tabIds, false);
-                    } catch (Exception e) {
-                        Log.e(TAG, "Unable to read state for " + metadataFile.getName() + ": " + e);
-                    } finally {
-                        StreamUtil.closeQuietly(stream);
-                    }
-                }
-            }
-        }
-
         @Override
         protected void onCancelled(Void result) {
             super.onCancelled(result);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicyTest.java
new file mode 100644
index 0000000..5e6baa6
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicyTest.java
@@ -0,0 +1,178 @@
+// 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.
+
+package org.chromium.chrome.browser.tabmodel;
+
+import android.app.Activity;
+import android.support.test.InstrumentationRegistry;
+
+import androidx.test.filters.MediumTest;
+
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.test.util.AdvancedMockContext;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
+import org.chromium.chrome.browser.app.tabmodel.TabbedModeTabModelOrchestrator;
+import org.chromium.chrome.browser.tab.MockTab;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabState;
+import org.chromium.chrome.browser.tab.TabStateExtractor;
+import org.chromium.chrome.browser.tab.WebContentsState;
+import org.chromium.chrome.browser.tabmodel.NextTabPolicy.NextTabPolicySupplier;
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabModelSelectorMetadata;
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver;
+import org.chromium.chrome.browser.tabpersistence.TabStateDirectory;
+import org.chromium.chrome.browser.tabpersistence.TabStateFileManager;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel;
+import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.url.GURL;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Tests for the tabbed-mode persisitence policy.
+ * TODO: Consider turning this into a unit test after resolving the task involving disk I/O.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+public class TabbedModeTabPersistencePolicyTest {
+    private static final WebContentsState WEB_CONTENTS_STATE =
+            new WebContentsState(ByteBuffer.allocateDirect(100));
+    private TestTabModelDirectory mMockDirectory;
+    private AdvancedMockContext mAppContext;
+
+    private static final TabModelSelectorFactory sMockTabModelSelectorFactory =
+            new TabModelSelectorFactory() {
+                @Override
+                public TabModelSelector buildSelector(Activity activity,
+                        TabCreatorManager tabCreatorManager,
+                        NextTabPolicySupplier nextTabPolicySupplier, int selectorIndex) {
+                    return new MockTabModelSelector(0, 0, null);
+                }
+            };
+
+    @Before
+    public void setUp() throws Exception {
+        TabWindowManagerSingleton.setTabModelSelectorFactoryForTesting(
+                sMockTabModelSelectorFactory);
+        mAppContext = new AdvancedMockContext(InstrumentationRegistry.getInstrumentation()
+                                                      .getTargetContext()
+                                                      .getApplicationContext());
+        ContextUtils.initApplicationContextForTests(mAppContext);
+
+        mMockDirectory = new TestTabModelDirectory(mAppContext,
+                "TabbedModeTabPersistencePolicyTest", TabStateDirectory.TABBED_MODE_DIRECTORY);
+        TabStateDirectory.setBaseStateDirectoryForTests(mMockDirectory.getBaseDirectory());
+    }
+
+    @After
+    public void tearDown() {
+        mMockDirectory.tearDown();
+
+        for (Activity activity : ApplicationStatus.getRunningActivities()) {
+            activity.finishAndRemoveTask();
+        }
+    }
+
+    private TabbedModeTabModelOrchestrator buildTestTabModelSelector(
+            int[] normalTabIds, int[] incognitoTabIds) throws Exception {
+        MockTabModel.MockTabModelDelegate tabModelDelegate =
+                new MockTabModel.MockTabModelDelegate() {
+                    @Override
+                    public Tab createTab(int id, boolean incognito) {
+                        Tab tab = new MockTab(id, incognito) {
+                            @Override
+                            public GURL getUrl() {
+                                return new GURL("https://www.google.com");
+                            }
+                        };
+                        return tab;
+                    }
+                };
+        final MockTabModel normalTabModel = new MockTabModel(false, tabModelDelegate);
+        final MockTabModel incognitoTabModel = new MockTabModel(true, tabModelDelegate);
+        TabbedModeTabModelOrchestrator orchestrator = new TabbedModeTabModelOrchestrator(false);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> orchestrator.createTabModels(new ChromeTabbedActivity(), null, null, 0));
+        TabModelSelector selector = orchestrator.getTabModelSelector();
+        ((MockTabModelSelector) selector).initializeTabModels(normalTabModel, incognitoTabModel);
+        final CallbackHelper callbackSignal = new CallbackHelper();
+        final int callCount = callbackSignal.getCallCount();
+        TabPersistentStore store = orchestrator.getTabPersistentStoreForTesting();
+        store.addObserver(new TabPersistentStoreObserver() {
+            @Override
+            public void onMetadataSavedAsynchronously(TabModelSelectorMetadata metadata) {
+                callbackSignal.notifyCalled();
+            }
+        });
+
+        // Adding tabs results in writing to disk running on AsyncTasks. Run on the main thread
+        // to turn the async operations + completion callback into a synchronous operation.
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            for (int tabId : normalTabIds) {
+                addTabToSaveQueue(store, normalTabModel, normalTabModel.addTab(tabId));
+            }
+            for (int tabId : incognitoTabIds) {
+                addTabToSaveQueue(store, incognitoTabModel, incognitoTabModel.addTab(tabId));
+            }
+            TabModelUtils.setIndex(normalTabModel, 0);
+            TabModelUtils.setIndex(incognitoTabModel, 0);
+        });
+        callbackSignal.waitForCallback(callCount);
+        return orchestrator;
+    }
+
+    private void addTabToSaveQueue(TabPersistentStore store, TabModel tabModel, Tab tab) {
+        TabState tabState = new TabState();
+        tabState.contentsState = WEB_CONTENTS_STATE;
+        TabStateExtractor.setTabStateForTesting(tab.getId(), tabState);
+        store.addTabToSaveQueue(tab);
+    }
+
+    /**
+     * Test the cleanup task path that deletes all the persistent state files for an instance.
+     * Ensure tabs not used by other instances only are collected for deletion. This may not
+     * be a real scenario likey to happen.
+     */
+    @Test
+    @Feature("TabPersistentStore")
+    @MediumTest
+    public void testCleanupInstanceState() throws Throwable {
+        Assert.assertNotNull(TabStateDirectory.getOrCreateBaseStateDirectory());
+
+        // Delete instance 1. Among the tabs (4, 6, 7) (12, 14, 19), only (4, 12, 14)
+        // are not used by any other instances, therefore will be the target for cleanup.
+        buildTestTabModelSelector(new int[] {3, 5, 7}, new int[] {11, 13, 17});
+        TabbedModeTabModelOrchestrator orchestrator1 =
+                buildTestTabModelSelector(new int[] {4, 6, 7}, new int[] {12, 14, 19});
+        buildTestTabModelSelector(new int[] {6, 8, 9}, new int[] {15, 18, 19});
+
+        final int id = 1;
+        TabPersistencePolicy policy =
+                orchestrator1.getTabPersistentStoreForTesting().getTabPersistencePolicyForTesting();
+        final CallbackHelper callbackSignal = new CallbackHelper();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            policy.cleanupInstanceState(id, (result) -> {
+                Assert.assertThat(result,
+                        Matchers.containsInAnyOrder(
+                                TabStateFileManager.getTabStateFilename(4, false),
+                                TabStateFileManager.getTabStateFilename(12, true),
+                                TabStateFileManager.getTabStateFilename(14, true)));
+                callbackSignal.notifyCalled();
+            });
+        });
+        callbackSignal.waitForCallback(0);
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
index d87300d..a97b9c4 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
@@ -24,8 +24,10 @@
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus.ActivityStateListener;
+import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.UiThreadTest;
+import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
 import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
@@ -65,6 +67,10 @@
     @Mock
     MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
     @Mock
+    ObservableSupplier<TabModelOrchestrator> mTabModelOrchestratorSupplier;
+    @Mock
+    TabModelOrchestrator mTabModelOrchestrator;
+    @Mock
     ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     @Mock
     MenuOrKeyboardActionController mMenuOrKeyboardActionController;
@@ -106,11 +112,12 @@
         private Activity mAdjacentInstance;
 
         private TestMultiInstanceManagerApi31(Activity activity,
+                ObservableSupplier<TabModelOrchestrator> tabModelOrchestratorSupplier,
                 MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
                 ActivityLifecycleDispatcher activityLifecycleDispatcher,
                 MenuOrKeyboardActionController menuOrKeyboardActionController) {
-            super(activity, null, multiWindowModeStateDispatcher, activityLifecycleDispatcher,
-                    menuOrKeyboardActionController);
+            super(activity, tabModelOrchestratorSupplier, multiWindowModeStateDispatcher,
+                    activityLifecycleDispatcher, menuOrKeyboardActionController);
         }
 
         private void createInstance(int instanceId, Activity activity) {
@@ -170,6 +177,8 @@
         when(mActivityTask59.getTaskId()).thenReturn(TASK_ID_59);
         when(mActivityTask60.getTaskId()).thenReturn(TASK_ID_60);
         when(mActivityTask61.getTaskId()).thenReturn(TASK_ID_61);
+        when(mTabModelOrchestratorSupplier.get()).thenReturn(mTabModelOrchestrator);
+
         mActivityPool = new Activity[] {
                 mActivityTask56,
                 mActivityTask57,
@@ -180,9 +189,9 @@
         };
         TabWindowManagerSingleton.setTabModelSelectorFactoryForTesting(
                 sMockTabModelSelectorFactory);
-        mMultiInstanceManager =
-                new TestMultiInstanceManagerApi31(mCurrentActivity, mMultiWindowModeStateDispatcher,
-                        mActivityLifecycleDispatcher, mMenuOrKeyboardActionController);
+        mMultiInstanceManager = new TestMultiInstanceManagerApi31(mCurrentActivity,
+                mTabModelOrchestratorSupplier, mMultiWindowModeStateDispatcher,
+                mActivityLifecycleDispatcher, mMenuOrKeyboardActionController);
         SharedPreferencesManager.getInstance().removeKeysWithPrefix(
                 ChromePreferenceKeys.MULTI_INSTANCE_TASK_MAP);
     }
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 4cb47f67..afa67bd 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-93.0.4577.20_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-93.0.4577.21_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 2dedb3e..d1b941ce 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2674,6 +2674,7 @@
 <translation id="3799128412641261490">Switch access settings</translation>
 <translation id="3799903419983101749">Continue from where you left off. You can set apps to restore automatically in Settings.</translation>
 <translation id="3800806661949714323">Show all (recommended)</translation>
+<translation id="380329542618494757">Name</translation>
 <translation id="3803345858388753269">Video quality</translation>
 <translation id="380408572480438692">Enabling collection of performance data will help Google improve the system over time. No data is sent until you file a feedback report (Alt-Shift-I) and include performance data. You can return to this screen to disable collection at any time.</translation>
 <translation id="3807249107536149332"><ph name="EXTENSION_NAME" /> (extension ID "<ph name="EXTENSION_ID" />") is not allowed on a login screen.</translation>
@@ -2735,6 +2736,7 @@
 <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation>
 <translation id="3856800405688283469">Select Time Zone</translation>
 <translation id="3857807444929313943">Lift, then touch again</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="3861638017150647085">Username '<ph name="USERNAME" />' is not available</translation>
 <translation id="3861977424605124250">Show on startup</translation>
 <translation id="386239283124269513">&amp;Restore group</translation>
@@ -4148,6 +4150,7 @@
 <translation id="5442550868130618860">Turn on automatic update</translation>
 <translation id="5445400788035474247">10x</translation>
 <translation id="5446983216438178612">Show certificates for organisation</translation>
+<translation id="5447384712203291074"><ph name="ITEM_COUNT_MULTIPLE" /> items</translation>
 <translation id="5448293924669608770">Oops, something went wrong with signing in</translation>
 <translation id="5449551289610225147">Invalid password</translation>
 <translation id="5449588825071916739">Bookmark All Tabs</translation>
@@ -4653,6 +4656,7 @@
 <translation id="6007240208646052708">Voice search in your language is not available.</translation>
 <translation id="6011193465932186973">Fingerprint</translation>
 <translation id="6011449291337289699">Clear site data</translation>
+<translation id="6011908034087870826">Sending link to <ph name="DEVICE_NAME" /></translation>
 <translation id="6013027779243312217">Get captions for your audio and video</translation>
 <translation id="6015796118275082299">Year</translation>
 <translation id="6016178549409952427">Navigate to extra content <ph name="CURRENT_ELEMENT" /> out of <ph name="TOTAL_ELEMENTS" /></translation>
@@ -5669,6 +5673,7 @@
 <translation id="7109543803214225826">Shortcut removed</translation>
 <translation id="7110644433780444336">{NUM_TABS,plural, =1{Add tab to group}other{Add tabs to group}}</translation>
 <translation id="7111822978084196600">Name this window</translation>
+<translation id="7113102733263608554"><ph name="ITEM_COUNT_ONE" /> item</translation>
 <translation id="7113502843173351041">Know your email address</translation>
 <translation id="7114054701490058191">Passwords don't match</translation>
 <translation id="7114648273807173152">To use Smart Lock to sign in to your Google Account, go to Settings &gt; Connected devices &gt; Your phone &gt; Smart Lock.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index a2543b6..64a7e53f 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -2662,6 +2662,7 @@
 <translation id="3799128412641261490">ප්‍රවේශය මාරු කිරීමේ සැකසීම්</translation>
 <translation id="3799903419983101749">ඔබ නතර කළ තැන සිට ඉදිරියට යයි. ඔබට සැකසීම් තුළ ස්වයංක්‍රියව ප්‍රතිසාධනය කිරීමට යෙදුම් සැකසිය හැකිය.</translation>
 <translation id="3800806661949714323">සියල්ල පෙන්වන්න (නිර්දේශිතයි)</translation>
+<translation id="380329542618494757">නම</translation>
 <translation id="3803345858388753269">වීඩියෝවේ ගුණත්වය</translation>
 <translation id="380408572480438692">ක්‍රියාකාරීත්ව දත්ත එක්රැස් කිරීම සබල කිරීම කාලයත් සමඟ Google හට පද්ධතිය වැඩි දියුණු කිරීමට සහය විය හැක. ඔබ ක්‍රියාකාරීත්ව දත්ත ඇතුළත් කර අදහස් හා යෝජනා වාර්තාවක් (Alt-Shift-I) යවන තෙක් කිසිඳු දත්තයක් නොයැවෙයි. එක්රැස් කිරීම නැවැත්වීමට ඔබට ඕනෑම වේලාවක මෙම තිරයට ආ හැක.</translation>
 <translation id="3807249107536149332"><ph name="EXTENSION_NAME" /> (දිගු ID "<ph name="EXTENSION_ID" />") ඇතුළු වීම් තිරයක ඉඩ නොදේ</translation>
@@ -2724,6 +2725,7 @@
 <translation id="3856096718352044181">මෙය වලංගු සැපයුම්කරුවෙක් බව සත්‍යාපන කරන්න, නැති නම් පසුව නැවත උත්සාහ කරන්න</translation>
 <translation id="3856800405688283469">වේලා කලාපය තෝරන්න</translation>
 <translation id="3857807444929313943">ඔසවා, පසුව නැවත ස්පර්ශ කරන්න</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3861638017150647085">පරිශීලක නාමය "<ph name="USERNAME" />" නොලැබේ</translation>
 <translation id="3861977424605124250">ඇරඹුමේදී පෙන්වන්න</translation>
 <translation id="386239283124269513">&amp;සමූහය ප්‍රතිසාධනය කරන්න</translation>
@@ -4136,6 +4138,7 @@
 <translation id="5442550868130618860">ස්වයං යාවත්කාලීනය ක්‍රියාත්මක කරන්න</translation>
 <translation id="5445400788035474247">10x</translation>
 <translation id="5446983216438178612">සංවිධානය සඳහා සහතික පෙන්වන්න</translation>
+<translation id="5447384712203291074">අයිතම <ph name="ITEM_COUNT_MULTIPLE" /></translation>
 <translation id="5448293924669608770">අහෝ, පිවිසීමේ ගැටළුවක් ඇතිවිය</translation>
 <translation id="5449551289610225147">වලංගු නොවන මුරපදය</translation>
 <translation id="5449588825071916739">සියලු ටැබ පිටු සලකුණු කරන්න</translation>
@@ -4642,6 +4645,7 @@
 <translation id="6007240208646052708">ඔබේ භාෂාවෙන් හඬ සෙවීම නොමැත.</translation>
 <translation id="6011193465932186973">ඇඟිලි සලකුණ</translation>
 <translation id="6011449291337289699">අඩවි දත්ත හිස් කරන්න</translation>
+<translation id="6011908034087870826">සබැඳිය <ph name="DEVICE_NAME" /> වෙත යවමින්</translation>
 <translation id="6013027779243312217">ඔබගේ ශ්‍රව්‍ය සහ වීඩියෝ සඳහා සිරස්තල ලබා ගන්න</translation>
 <translation id="6015796118275082299">වර්ශය</translation>
 <translation id="6016178549409952427"><ph name="TOTAL_ELEMENTS" />කින් <ph name="CURRENT_ELEMENT" /> අමතර අන්තර්ගතයට සංචාලනය කරන්න</translation>
@@ -5656,6 +5660,7 @@
 <translation id="7109543803214225826">කෙටිමඟ ඉවත් කර ඇත</translation>
 <translation id="7110644433780444336">{NUM_TABS,plural, =1{කණ්ඩායමට පටිත්ත එක් කරන්න}one{කණ්ඩායමට පටිති එක් කරන්න}other{කණ්ඩායමට පටිති එක් කරන්න}}</translation>
 <translation id="7111822978084196600">මෙම කවුළුව නම් කරන්න</translation>
+<translation id="7113102733263608554">අයිතම <ph name="ITEM_COUNT_ONE" /></translation>
 <translation id="7113502843173351041">ඔබගේ ඊතැපැල් ලිපිනය දැනගන්න</translation>
 <translation id="7114054701490058191">මුරපද නොගැළපේ</translation>
 <translation id="7114648273807173152">ඔබේ Google ගිණුමට පුරන්නට Smart Lock භාවිත කිරීමට, සැකසීම් &gt; සම්බන්ධිත උපාංග &gt; ඔබේ දුරකථනය &gt; Smart Lock වෙත යන්න.</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index f50a27a5..04464fa 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1254,7 +1254,7 @@
 <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" نے اضافی اجازتوں کی درخواست کی ہے۔</translation>
 <translation id="23055578400314116">صارف نام منتخب کریں</translation>
 <translation id="2307462900900812319">نیٹ ورک کنفیگر کریں</translation>
-<translation id="2307553512430195144">‏اگر آپ متفق ہیں تو Google اسسٹنٹ "Ok Google" کا پتا لگانے کے لیے اسٹینڈ بائی وضع میں انتظار کرے گی اور یہ شناخت کر سکتی ہے کہ <ph name="SUPERVISED_USER_NAME" /> Voice Match کے ساتھ بول رہا ہے۔
+<translation id="2307553512430195144">‏اگر آپ متفق ہیں تو Google اسسٹنٹ "Ok Google" کا پتا لگانے کے لیے اسٹینڈ بائی وضع میں انتظار کرے گی اور Voice Match کے ساتھ یہ شناخت کر سکتی ہے کہ <ph name="SUPERVISED_USER_NAME" /> بول رہا ہے۔
     <ph name="BR" />
     Voice Match کی مدد سے، Google اسسٹنٹ آپ کے <ph name="DEVICE_TYPE" /> پر <ph name="SUPERVISED_USER_NAME" /> کی آواز کی شناخت کر سکتی ہے اور اسے دوسرے لوگوں سے الگ کر سکتی ہے۔
     <ph name="BR" />
@@ -4684,7 +4684,7 @@
 <translation id="6059652578941944813">سرٹیفکیٹ کے مراتب</translation>
 <translation id="6059925163896151826">‏USB آلات</translation>
 <translation id="6061882183774845124">لنک اپنے آلات پر بھیجیں</translation>
-<translation id="6063847492705284550">‏<ph name="BEGIN_BOLD" />نوٹ:<ph name="END_BOLD" /> ایک ملتی جلتی آواز یا ریکارڈنگ سے <ph name="SUPERVISED_USER_NAME" /> کے ذاتی نتائج تک رسائی حاصل کی جا سکتی ہے۔ بیٹری بچانے کے لیے، آپ "Ok Google" آن کرنے کے لیے <ph name="SUPERVISED_USER_NAME" /> کی اسسٹنٹ کی ترتیبات میں صرف اس آلے کے پاور کے ماخذ سے منسلک ہو جانے پر منتخب کر سکتے ہیں۔</translation>
+<translation id="6063847492705284550">‏<ph name="BEGIN_BOLD" />نوٹ:<ph name="END_BOLD" /> ایک ملتی جلتی آواز یا ریکارڈنگ سے <ph name="SUPERVISED_USER_NAME" /> کے ذاتی نتائج تک رسائی حاصل کی جا سکتی ہے۔ بیٹری بچانے کے لیے، آپ <ph name="SUPERVISED_USER_NAME" /> کی اسسٹنٹ کی ترتیبات میں صرف اس آلے کے پاور کے ماخذ سے منسلک ہونے پر ہی "Ok Google" کے آن ہونے کا انتخاب کر سکتے ہیں۔</translation>
 <translation id="6064217302520318294">اسکرین لاک</translation>
 <translation id="6065289257230303064">سرٹیفیکیٹ موضوع ڈائریکٹری انتسابات</translation>
 <translation id="6066794465984119824">تصویری ہیش سیٹ نہیں ہے</translation>
@@ -5361,7 +5361,7 @@
 <translation id="6808039367995747522">جاری رکھنے کے لیے، اپنی سیکیورٹی کلید درج اور ٹچ کریں</translation>
 <translation id="6808193438228982088">لومڑی</translation>
 <translation id="6809470175540814047">پوشیدگی ونڈو میں کھولیں</translation>
-<translation id="6809656734323672573">‏اگر آپ متفق ہیں تو Google اسسٹنٹ "Ok Google" کا پتا لگانے کے لیے اسٹینڈ بائی وضع میں انتظار کرے گی اور یہ شناخت کر سکتی ہے کہ آپ ہی Voice Match کے ساتھ بات کر رہے ہیں۔
+<translation id="6809656734323672573">‏اگر آپ متفق ہیں تو Google اسسٹنٹ "Ok Google" کا پتا لگانے کے لیے اسٹینڈ بائی وضع میں انتظار کرے گی اور Voice Match کے ساتھ یہ شناخت کر سکتی ہے کہ آپ ہی بات کر رہے ہیں۔
     <ph name="BR" />
     Voice Match آپ کی اسسٹنٹ کو آپ کی شناخت کرنے اور آپ کو دوسروں سے ممتاز کرنے کی سہولت دیتی ہے۔ ایک منفرد صوتی ماڈل تخلیق کرنے کے لیے اسسٹنٹ آپ کی آواز کی کلپس حاصل کرتی ہے جو صرف آپ کے آلے پر اسٹور کیا جاتا ہے۔ آپ کی آواز کی اچھی طرح شناخت کرنے کے لیے آپ کے صوتی ماڈل کو عارضی طور پر Google کو بھیجا جا سکتا ہے۔
     <ph name="BR" />
@@ -6363,7 +6363,7 @@
 <translation id="7847212883280406910">‏<ph name="IDS_SHORT_PRODUCT_OS_NAME" /> پر سوئچ کرنے کیلئے Ctrl + Alt + S دبائیں</translation>
 <translation id="7849264908733290972">&amp;تصویر نئے ٹیب میں کھولیں</translation>
 <translation id="784934925303690534">وقت کی حد</translation>
-<translation id="7851021205959621355">‏<ph name="BEGIN_BOLD" />نوٹ:<ph name="END_BOLD" /> ایک ملتی جلتی آواز یا ریکارڈنگ سے آپ کے ذاتی نتائج یا آپ کی اسسٹنٹ تک رسائی حاصل کی جا سکتی ہے۔ بیٹری بچانے کے لیے، آپ "Ok Google" آن کرنے کے لیے اپنی اسسٹنٹ کی ترتیبات میں صرف اس آلے کے پاور کے ماخذ سے منسلک ہونے پر منتخب کر سکتے ہیں۔</translation>
+<translation id="7851021205959621355">‏<ph name="BEGIN_BOLD" />نوٹ:<ph name="END_BOLD" /> ایک ملتی جلتی آواز یا ریکارڈنگ سے آپ کے ذاتی نتائج یا آپ کی اسسٹنٹ تک رسائی حاصل کی جا سکتی ہے۔ بیٹری بچانے کے لیے، آپ اپنی اسسٹنٹ کی ترتیبات میں صرف اس آلے کے پاور کے ماخذ سے منسلک ہونے پر ہی "Ok Google" کے آن ہونے کا انتخاب کر سکتے ہیں۔</translation>
 <translation id="7851457902707056880">سائن ان کو صرف مالک کے اکاؤنٹ تک محدود کر دیا گیا ہے۔ براہ کرم ریبوٹ کریں اور مالک کے اکاؤنٹ کے ساتھ سائن ان کریں۔ مشین 30 سیکنڈ میں خودکار طور پر ریبوٹ ہو جائے گی۔</translation>
 <translation id="7851716364080026749">کیمرا اور مائیکروفون رسائی کو ہمیشہ مسدود کریں</translation>
 <translation id="7851720427268294554">‏IPP پارسر</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 3c2b352..ad2b45b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -5439,7 +5439,10 @@
       "crash_upload_list/crash_upload_list_fuchsia.cc",
       "crash_upload_list/crash_upload_list_fuchsia.h",
       "download/download_status_updater_fuchsia.cc",
+      "first_run/first_run_internal_fuchsia.cc",
+      "first_run/upgrade_util_fuchsia.cc",
       "icon_loader_fuchsia.cc",
+      "media/webrtc/window_icon_util_fuchsia.cc",
       "memory_details_fuchsia.cc",
       "obsolete_system/obsolete_system_stub.cc",
       "shell_integration_fuchsia.cc",
diff --git a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
index 387e1ed1..d254f253 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/web_applications/app_service/web_apps_publisher_host.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/chrome_features.h"
+#include "chromeos/lacros/lacros_service.h"
 #include "components/services/app_service/app_service_impl.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
@@ -146,6 +147,20 @@
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(&AppServiceProxyLacros::AddAppIconSource,
                                 weak_ptr_factory_.GetWeakPtr(), profile_));
+
+  auto* service = chromeos::LacrosService::Get();
+
+  if (!service) {
+    return;
+  }
+
+  if (!service->IsAvailable<crosapi::mojom::AppServiceProxy>()) {
+    return;
+  }
+
+  service->GetRemote<crosapi::mojom::AppServiceProxy>()
+      ->RegisterAppServiceSubscriber(
+          crosapi_receiver_.BindNewPipeAndPassRemote());
 }
 
 void AppServiceProxyLacros::ReInitializeForTesting(Profile* profile) {
diff --git a/chrome/browser/apps/app_service/app_service_proxy_lacros.h b/chrome/browser/apps/app_service/app_service_proxy_lacros.h
index ab905c8c..d6fdc52 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_lacros.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_lacros.h
@@ -14,6 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/apps/app_service/browser_app_launcher.h"
+#include "chromeos/crosapi/mojom/app_service.mojom.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/services/app_service/public/cpp/app_capability_access_cache.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
@@ -59,7 +60,8 @@
 class AppServiceProxyLacros : public KeyedService,
                               public apps::IconLoader,
                               public apps::mojom::Subscriber,
-                              public apps::AppRegistryCache::Observer {
+                              public apps::AppRegistryCache::Observer,
+                              public crosapi::mojom::AppServiceSubscriber {
  public:
   explicit AppServiceProxyLacros(Profile* profile);
   AppServiceProxyLacros(const AppServiceProxyLacros&) = delete;
@@ -364,6 +366,7 @@
 
   std::unique_ptr<FakeLacrosWebAppsHost> fake_lacros_web_apps_host_;
   std::unique_ptr<web_app::WebAppsPublisherHost> web_apps_publisher_host_;
+  mojo::Receiver<crosapi::mojom::AppServiceSubscriber> crosapi_receiver_{this};
 
   base::WeakPtrFactory<AppServiceProxyLacros> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/apps/app_service/subscriber_crosapi.cc b/chrome/browser/apps/app_service/subscriber_crosapi.cc
index d6721b4..5f868ec 100644
--- a/chrome/browser/apps/app_service/subscriber_crosapi.cc
+++ b/chrome/browser/apps/app_service/subscriber_crosapi.cc
@@ -6,11 +6,38 @@
 
 #include <utility>
 
+#include "base/bind.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/services/app_service/public/mojom/types.mojom.h"
 
 namespace apps {
 
+SubscriberCrosapi::SubscriberCrosapi(Profile* profile) {
+  auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile);
+  mojo::Remote<apps::mojom::AppService>& app_service = proxy->AppService();
+  DCHECK(app_service.is_bound());
+  mojo::PendingRemote<apps::mojom::Subscriber> subscriber;
+  receivers_.Add(this, subscriber.InitWithNewPipeAndPassReceiver());
+  app_service->RegisterSubscriber(std::move(subscriber), nullptr);
+}
+
+SubscriberCrosapi::~SubscriberCrosapi() = default;
+
+void SubscriberCrosapi::RegisterAppServiceProxyFromCrosapi(
+    mojo::PendingReceiver<crosapi::mojom::AppServiceProxy> receiver) {
+  // At the moment the app service subscriber will only accept one client
+  // connect to ash chrome. Any extra clients will be ignored.
+  // TODO(crbug.com/1174246): Support SxS lacros.
+  if (crosapi_receiver_.is_bound()) {
+    return;
+  }
+  crosapi_receiver_.Bind(std::move(receiver));
+  crosapi_receiver_.set_disconnect_handler(base::BindOnce(
+      &SubscriberCrosapi::OnCrosapiDisconnected, base::Unretained(this)));
+}
+
 void SubscriberCrosapi::OnApps(std::vector<apps::mojom::AppPtr> deltas,
                                apps::mojom::AppType app_type,
                                bool should_notify_initialized) {
@@ -44,4 +71,26 @@
   NOTIMPLEMENTED();
 }
 
+void SubscriberCrosapi::OnCrosapiDisconnected() {
+  crosapi_receiver_.reset();
+  subscriber_.reset();
+}
+
+void SubscriberCrosapi::RegisterAppServiceSubscriber(
+    mojo::PendingRemote<crosapi::mojom::AppServiceSubscriber> subscriber) {
+  // At the moment the app service subscriber will only accept one client
+  // connect to ash chrome. Any extra clients will be ignored.
+  // TODO(crbug.com/1174246): Support SxS lacros.
+  if (subscriber_.is_bound()) {
+    return;
+  }
+  subscriber_.Bind(std::move(subscriber));
+  subscriber_.set_disconnect_handler(base::BindOnce(
+      &SubscriberCrosapi::OnSubscriberDisconnected, base::Unretained(this)));
+}
+
+void SubscriberCrosapi::OnSubscriberDisconnected() {
+  subscriber_.reset();
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/subscriber_crosapi.h b/chrome/browser/apps/app_service/subscriber_crosapi.h
index 931891b..c67570ef 100644
--- a/chrome/browser/apps/app_service/subscriber_crosapi.h
+++ b/chrome/browser/apps/app_service/subscriber_crosapi.h
@@ -9,9 +9,14 @@
 #include <string>
 #include <vector>
 
+#include "chromeos/crosapi/mojom/app_service.mojom.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/services/app_service/public/cpp/preferred_apps_list.h"
 #include "components/services/app_service/public/mojom/app_service.mojom.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"
 
 class Profile;
 
@@ -22,13 +27,18 @@
 // crosapi and App Service.
 //
 // See components/services/app_service/README.md.
-class SubscriberCrosapi : public KeyedService, public apps::mojom::Subscriber {
+class SubscriberCrosapi : public KeyedService,
+                          public apps::mojom::Subscriber,
+                          public crosapi::mojom::AppServiceProxy {
  public:
   explicit SubscriberCrosapi(Profile* profile);
   SubscriberCrosapi(const SubscriberCrosapi&) = delete;
   SubscriberCrosapi& operator=(const SubscriberCrosapi&) = delete;
   ~SubscriberCrosapi() override;
 
+  void RegisterAppServiceProxyFromCrosapi(
+      mojo::PendingReceiver<crosapi::mojom::AppServiceProxy> receiver);
+
  protected:
   // apps::mojom::Subscriber overrides.
   void OnApps(std::vector<apps::mojom::AppPtr> deltas,
@@ -44,6 +54,18 @@
       apps::mojom::IntentFilterPtr intent_filter) override;
   void InitializePreferredApps(
       PreferredAppsList::PreferredApps preferred_apps) override;
+  void OnCrosapiDisconnected();
+
+  // crosapi::mojom::AppServiceProxy overrides.
+  void RegisterAppServiceSubscriber(
+      mojo::PendingRemote<crosapi::mojom::AppServiceSubscriber> subscriber)
+      override;
+
+  void OnSubscriberDisconnected();
+
+  mojo::Receiver<crosapi::mojom::AppServiceProxy> crosapi_receiver_{this};
+  mojo::ReceiverSet<apps::mojom::Subscriber> receivers_;
+  mojo::Remote<crosapi::mojom::AppServiceSubscriber> subscriber_;
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/platform_apps/api/music_manager_private/BUILD.gn b/chrome/browser/apps/platform_apps/api/music_manager_private/BUILD.gn
index 2b63f283..7f26db7 100644
--- a/chrome/browser/apps/platform_apps/api/music_manager_private/BUILD.gn
+++ b/chrome/browser/apps/platform_apps/api/music_manager_private/BUILD.gn
@@ -37,6 +37,8 @@
     sources += [ "device_id_linux.cc" ]
   } else if (is_mac) {
     sources += [ "device_id_mac.cc" ]
+  } else if (is_fuchsia) {
+    sources += [ "device_id_fuchsia.cc" ]
   } else if (is_win) {
     sources += [ "device_id_win.cc" ]
   }
diff --git a/chrome/browser/apps/platform_apps/api/music_manager_private/device_id_fuchsia.cc b/chrome/browser/apps/platform_apps/api/music_manager_private/device_id_fuchsia.cc
new file mode 100644
index 0000000..87d8b5d
--- /dev/null
+++ b/chrome/browser/apps/platform_apps/api/music_manager_private/device_id_fuchsia.cc
@@ -0,0 +1,23 @@
+// 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/apps/platform_apps/api/music_manager_private/device_id.h"
+
+#include <string>
+
+#include "base/callback.h"
+#include "base/notreached.h"
+
+namespace chrome_apps {
+namespace api {
+
+// static
+void DeviceId::GetRawDeviceId(IdCallback callback) {
+  // TODO(crbug.com/1234731)
+  NOTIMPLEMENTED_LOG_ONCE();
+  std::move(callback).Run(std::string());
+}
+
+}  // namespace api
+}  // namespace chrome_apps
diff --git a/chrome/browser/ash/arc/intent_helper/arc_settings_service_browsertest.cc b/chrome/browser/ash/arc/intent_helper/arc_settings_service_browsertest.cc
index 2b69c3d..6d050df 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_settings_service_browsertest.cc
+++ b/chrome/browser/ash/arc/intent_helper/arc_settings_service_browsertest.cc
@@ -16,7 +16,7 @@
 #include "base/run_loop.h"
 #include "base/task/current_thread.h"
 #include "base/values.h"
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/ash/arc/policy/arc_policy_util.cc b/chrome/browser/ash/arc/policy/arc_policy_util.cc
index c720bc6..9b669e4 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_util.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_util.cc
@@ -10,7 +10,7 @@
 #include "base/command_line.h"
 #include "base/json/json_reader.h"
 #include "base/values.h"
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/arc/arc_prefs.h"
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc
index ca376ec6..8b22dc3 100644
--- a/chrome/browser/ash/crosapi/browser_util.cc
+++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -270,6 +270,7 @@
     MakeInterfaceVersionEntry<crosapi::mojom::Automation>(),
     MakeInterfaceVersionEntry<crosapi::mojom::AccountManager>(),
     MakeInterfaceVersionEntry<crosapi::mojom::AppPublisher>(),
+    MakeInterfaceVersionEntry<crosapi::mojom::AppServiceProxy>(),
     MakeInterfaceVersionEntry<crosapi::mojom::BrowserServiceHost>(),
     MakeInterfaceVersionEntry<crosapi::mojom::CertDatabase>(),
     MakeInterfaceVersionEntry<crosapi::mojom::Clipboard>(),
@@ -356,7 +357,7 @@
 }
 
 static_assert(
-    crosapi::mojom::Crosapi::Version_ == 39,
+    crosapi::mojom::Crosapi::Version_ == 40,
     "if you add a new crosapi, please add it to kInterfaceVersionEntries");
 static_assert(!HasDuplicatedUuid(),
               "Each Crosapi Mojom interface should have unique UUID.");
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index 0b786cc..59fea43 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -14,6 +14,8 @@
 #include "chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps_factory.h"
 #include "chrome/browser/apps/app_service/publishers/web_apps_crosapi.h"
 #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/ash/crosapi/automation_ash.h"
 #include "chrome/browser/ash/crosapi/browser_manager.h"
 #include "chrome/browser/ash/crosapi/browser_service_host_ash.h"
@@ -173,6 +175,14 @@
   account_manager_mojo_service->BindReceiver(std::move(receiver));
 }
 
+void CrosapiAsh::BindAppServiceProxy(
+    mojo::PendingReceiver<crosapi::mojom::AppServiceProxy> receiver) {
+  Profile* profile = ProfileManager::GetPrimaryUserProfile();
+  auto* subscriber_crosapi =
+      apps::SubscriberCrosapiFactory::GetForProfile(profile);
+  subscriber_crosapi->RegisterAppServiceProxyFromCrosapi(std::move(receiver));
+}
+
 void CrosapiAsh::BindBrowserServiceHost(
     mojo::PendingReceiver<crosapi::mojom::BrowserServiceHost> receiver) {
   browser_service_host_ash_->BindReceiver(receiver_set_.current_context(),
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h
index fce46f7..c0f2607 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.h
+++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -70,6 +70,8 @@
       mojo::PendingReceiver<mojom::AutomationFactory> receiver) override;
   void BindAccountManager(
       mojo::PendingReceiver<mojom::AccountManager> receiver) override;
+  void BindAppServiceProxy(
+      mojo::PendingReceiver<mojom::AppServiceProxy> receiver) override;
   void BindBrowserServiceHost(
       mojo::PendingReceiver<mojom::BrowserServiceHost> receiver) override;
   void BindCertDatabase(
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index f2f48ff..57b7310 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -728,40 +728,39 @@
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("transferFromDriveToDownloads"),
-        // TODO: uncomment all FilesSwa() tests once copy/paste is fixed.
-        // TestCase("transferFromDriveToDownloads").FilesSwa(),
+        TestCase("transferFromDriveToDownloads").FilesSwa(),
         TestCase("transferFromDownloadsToMyFiles"),
-        // TestCase("transferFromDownloadsToMyFiles").FilesSwa(),
+        TestCase("transferFromDownloadsToMyFiles").FilesSwa(),
         TestCase("transferFromDownloadsToMyFilesMove"),
-        // TestCase("transferFromDownloadsToMyFilesMove").FilesSwa(),
+        TestCase("transferFromDownloadsToMyFilesMove").FilesSwa(),
         TestCase("transferFromDownloadsToDrive"),
-        // TestCase("transferFromDownloadsToDrive").FilesSwa(),
+        TestCase("transferFromDownloadsToDrive").FilesSwa(),
         TestCase("transferFromSharedWithMeToDownloads"),
-        // TestCase("transferFromSharedWithMeToDownloads").FilesSwa(),
+        TestCase("transferFromSharedWithMeToDownloads").FilesSwa(),
         TestCase("transferFromSharedWithMeToDrive"),
-        // TestCase("transferFromSharedWithMeToDrive").FilesSwa(),
+        TestCase("transferFromSharedWithMeToDrive").FilesSwa(),
         TestCase("transferFromDownloadsToSharedFolder"),
-        // TestCase("transferFromDownloadsToSharedFolder").FilesSwa(),
+        TestCase("transferFromDownloadsToSharedFolder").FilesSwa(),
         TestCase("transferFromDownloadsToSharedFolderMove"),
-        // TestCase("transferFromDownloadsToSharedFolderMove").FilesSwa(),
+        TestCase("transferFromDownloadsToSharedFolderMove").FilesSwa(),
         TestCase("transferFromSharedFolderToDownloads"),
-        // TestCase("transferFromSharedFolderToDownloads").FilesSwa(),
+        TestCase("transferFromSharedFolderToDownloads").FilesSwa(),
         TestCase("transferFromOfflineToDownloads"),
-        // TestCase("transferFromOfflineToDownloads").FilesSwa(),
+        TestCase("transferFromOfflineToDownloads").FilesSwa(),
         TestCase("transferFromOfflineToDrive"),
-        // TestCase("transferFromOfflineToDrive").FilesSwa(),
+        TestCase("transferFromOfflineToDrive").FilesSwa(),
         TestCase("transferFromTeamDriveToDrive"),
-        // TestCase("transferFromTeamDriveToDrive").FilesSwa(),
+        TestCase("transferFromTeamDriveToDrive").FilesSwa(),
         TestCase("transferFromDriveToTeamDrive"),
-        // TestCase("transferFromDriveToTeamDrive").FilesSwa(),
+        TestCase("transferFromDriveToTeamDrive").FilesSwa(),
         TestCase("transferFromTeamDriveToDownloads"),
-        // TestCase("transferFromTeamDriveToDownloads").FilesSwa(),
+        TestCase("transferFromTeamDriveToDownloads").FilesSwa(),
         TestCase("transferHostedFileFromTeamDriveToDownloads"),
         TestCase("transferHostedFileFromTeamDriveToDownloads").FilesSwa(),
         TestCase("transferFromDownloadsToTeamDrive"),
-        // TestCase("transferFromDownloadsToTeamDrive").FilesSwa(),
+        TestCase("transferFromDownloadsToTeamDrive").FilesSwa(),
         TestCase("transferBetweenTeamDrives"),
-        // TestCase("transferBetweenTeamDrives").FilesSwa(),
+        TestCase("transferBetweenTeamDrives").FilesSwa(),
         TestCase("transferDragDropActiveLeave"),
         TestCase("transferDragDropActiveLeave").FilesSwa(),
         TestCase("transferDragDropActiveDrop"),
@@ -788,20 +787,21 @@
         TestCase("transferFromDownloadsToDownloads"),
         TestCase("transferFromDownloadsToDownloads").FilesSwa(),
         TestCase("transferDeletedFile"),
-        // TestCase("transferDeletedFile").FilesSwa(),
+        TestCase("transferDeletedFile").FilesSwa(),
         TestCase("transferDeletedFile").EnableTrash(),
-        // TestCase("transferDeletedFile").FilesSwa().EnableTrash(),
+        TestCase("transferDeletedFile").FilesSwa().EnableTrash(),
         TestCase("transferInfoIsRemembered"),
         // TestCase("transferInfoIsRemembered").FilesSwa(),
         TestCase("transferToUsbHasDestinationText"),
-        // TestCase("transferToUsbHasDestinationText").FilesSwa(),
+        TestCase("transferToUsbHasDestinationText").FilesSwa(),
         TestCase("transferDismissedErrorIsRemembered"),
-        // TestCase("transferDismissedErrorIsRemembered").FilesSwa(),
+        TestCase("transferDismissedErrorIsRemembered").FilesSwa(),
         TestCase("transferNotSupportedOperationHasNoRemainingTimeText"),
-        // TestCase("transferNotSupportedOperationHasNoRemainingTimeText").FilesSwa(),
+        TestCase("transferNotSupportedOperationHasNoRemainingTimeText")
+            .FilesSwa(),
         TestCase("transferUpdateSamePanelItem"),
-        // TestCase("transferUpdateSamePanelItem").FilesSwa(),
-        // TestCase("transferShowPendingMessageForZeroRemainingTime").FilesSwa()));
+        TestCase("transferUpdateSamePanelItem").FilesSwa(),
+        TestCase("transferShowPendingMessageForZeroRemainingTime").FilesSwa(),
         TestCase("transferShowPendingMessageForZeroRemainingTime")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/ash/full_restore/arc_app_launch_handler.cc b/chrome/browser/ash/full_restore/arc_app_launch_handler.cc
index b917d96..c8a1c013 100644
--- a/chrome/browser/ash/full_restore/arc_app_launch_handler.cc
+++ b/chrome/browser/ash/full_restore/arc_app_launch_handler.cc
@@ -505,7 +505,7 @@
 
 void ArcAppLaunchHandler::MaybeLaunchApp() {
   // Check CanLaunchApp() first for record the system states.
-  if (CanLaunchApp() && !first_run_) {
+  if (!CanLaunchApp() && !first_run_) {
     MaybeReStartTimer(kAppLaunchCheckingDelay);
     return;
   }
diff --git a/chrome/browser/ash/input_method/DEPS b/chrome/browser/ash/input_method/DEPS
index 6ec605bf..9e8ab71 100644
--- a/chrome/browser/ash/input_method/DEPS
+++ b/chrome/browser/ash/input_method/DEPS
@@ -1,7 +1,3 @@
-# TODO(https://crbug.com/1164001): When this file is edited, same file in
-# //chrome/browser/chromeos/input_method should be updated as well. We need to
-# sync both files until the migration of //chrome/browser/chromeos/input_method
-# is done.
 include_rules = [
   "-chrome",
   "+chrome/browser",
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.cc b/chrome/browser/ash/input_method/assistive_window_controller.cc
index 529d0a1..f815757 100644
--- a/chrome/browser/ash/input_method/assistive_window_controller.cc
+++ b/chrome/browser/ash/input_method/assistive_window_controller.cc
@@ -12,7 +12,7 @@
 #include "ash/wm/window_util.h"
 #include "chrome/browser/ash/input_method/assistive_window_controller_delegate.h"
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/ime/chromeos/ime_bridge.h"
diff --git a/chrome/browser/ash/input_method/assistive_window_controller.h b/chrome/browser/ash/input_method/assistive_window_controller.h
index 64fa2fa..3c40d9b 100644
--- a/chrome/browser/ash/input_method/assistive_window_controller.h
+++ b/chrome/browser/ash/input_method/assistive_window_controller.h
@@ -10,10 +10,10 @@
 #include "base/macros.h"
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
 #include "chrome/browser/ash/input_method/tts_handler.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_window_view.h"
-#include "chrome/browser/chromeos/input_method/ui/undo_window.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/grammar_suggestion_window.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_window_view.h"
+#include "chrome/browser/ash/input_method/ui/undo_window.h"
 #include "ui/base/ime/chromeos/ime_assistive_window_handler_interface.h"
 #include "ui/gfx/native_widget_types.h"
 
diff --git a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc
index 52e9865..feba298 100644
--- a/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc
+++ b/chrome/browser/ash/input_method/assistive_window_controller_unittest.cc
@@ -7,7 +7,7 @@
 #include "ash/constants/ash_pref_names.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/ash/input_method/assistive_window_controller_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
diff --git a/chrome/browser/ash/input_method/assistive_window_properties.h b/chrome/browser/ash/input_method/assistive_window_properties.h
index 417c874..e2d595b0 100644
--- a/chrome/browser/ash/input_method/assistive_window_properties.h
+++ b/chrome/browser/ash/input_method/assistive_window_properties.h
@@ -7,7 +7,7 @@
 
 #include <string>
 #include <vector>
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 
 namespace chromeos {
 struct AssistiveWindowProperties {
diff --git a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc
index a0044bd..e4ef03fc 100644
--- a/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc
+++ b/chrome/browser/ash/input_method/autocorrect_manager_unittest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ash/input_method/autocorrect_manager.h"
 
 #include "base/test/metrics/histogram_tester.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
 #include "chrome/grit/generated_resources.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/ash/input_method/candidate_window_controller_impl.cc b/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
index 9b19abf..a3c6c3b 100644
--- a/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
+++ b/chrome/browser/ash/input_method/candidate_window_controller_impl.cc
@@ -11,7 +11,7 @@
 #include "ash/shell.h"
 #include "ash/wm/window_util.h"
 #include "base/logging.h"
-#include "chrome/browser/chromeos/input_method/ui/infolist_window.h"
+#include "chrome/browser/ash/input_method/ui/infolist_window.h"
 #include "ui/base/ime/chromeos/ime_bridge.h"
 #include "ui/views/widget/widget.h"
 
diff --git a/chrome/browser/ash/input_method/candidate_window_controller_impl.h b/chrome/browser/ash/input_method/candidate_window_controller_impl.h
index cebb591..2bb7fdee 100644
--- a/chrome/browser/ash/input_method/candidate_window_controller_impl.h
+++ b/chrome/browser/ash/input_method/candidate_window_controller_impl.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/ash/input_method/candidate_window_controller.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_view.h"
 #include "ui/base/ime/chromeos/ime_candidate_window_handler_interface.h"
 #include "ui/base/ime/infolist_entry.h"
 #include "ui/views/widget/widget_observer.h"
diff --git a/chrome/browser/ash/input_method/emoji_suggester.h b/chrome/browser/ash/input_method/emoji_suggester.h
index 9e55542a..ebb07ed 100644
--- a/chrome/browser/ash/input_method/emoji_suggester.h
+++ b/chrome/browser/ash/input_method/emoji_suggester.h
@@ -12,7 +12,7 @@
 #include "chrome/browser/ash/input_method/suggester.h"
 #include "chrome/browser/ash/input_method/suggestion_enums.h"
 #include "chrome/browser/ash/input_method/suggestion_handler_interface.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "chromeos/services/ime/public/cpp/suggestions.h"
 
 class Profile;
diff --git a/chrome/browser/ash/input_method/fake_suggestion_handler.h b/chrome/browser/ash/input_method/fake_suggestion_handler.h
index 468ddde8..ec5932a9 100644
--- a/chrome/browser/ash/input_method/fake_suggestion_handler.h
+++ b/chrome/browser/ash/input_method/fake_suggestion_handler.h
@@ -7,7 +7,7 @@
 
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
 #include "chrome/browser/ash/input_method/suggestion_handler_interface.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/ash/input_method/grammar_manager.cc b/chrome/browser/ash/input_method/grammar_manager.cc
index 1663e34..ed3946f 100644
--- a/chrome/browser/ash/input_method/grammar_manager.cc
+++ b/chrome/browser/ash/input_method/grammar_manager.cc
@@ -10,7 +10,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "ui/base/ime/chromeos/ime_bridge.h"
 #include "ui/base/ime/chromeos/ime_input_context_handler_interface.h"
 #include "ui/base/ime/text_input_flags.h"
diff --git a/chrome/browser/ash/input_method/grammar_manager.h b/chrome/browser/ash/input_method/grammar_manager.h
index 973e6f14..1ea30cd 100644
--- a/chrome/browser/ash/input_method/grammar_manager.h
+++ b/chrome/browser/ash/input_method/grammar_manager.h
@@ -13,7 +13,7 @@
 #include "chrome/browser/ash/input_method/grammar_service_client.h"
 #include "chrome/browser/ash/input_method/suggestion_handler_interface.h"
 #include "chrome/browser/ash/input_method/text_utils.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "chrome/browser/profiles/profile.h"
 #include "ui/events/event.h"
 
diff --git a/chrome/browser/ash/input_method/input_method_engine.cc b/chrome/browser/ash/input_method/input_method_engine.cc
index 48f9c44..f8f17de 100644
--- a/chrome/browser/ash/input_method/input_method_engine.cc
+++ b/chrome/browser/ash/input_method/input_method_engine.cc
@@ -16,8 +16,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
 #include "ui/aura/window.h"
diff --git a/chrome/browser/ash/input_method/input_method_engine_browsertests.cc b/chrome/browser/ash/input_method/input_method_engine_browsertests.cc
index e6afd9cd1..5fd86fcaa 100644
--- a/chrome/browser/ash/input_method/input_method_engine_browsertests.cc
+++ b/chrome/browser/ash/input_method/input_method_engine_browsertests.cc
@@ -11,8 +11,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/input_method/assistive_window_controller.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
 #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/ash/input_method/input_method_manager_impl.cc b/chrome/browser/ash/input_method/input_method_manager_impl.cc
index 74ecf14..9afbf22 100644
--- a/chrome/browser/ash/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/ash/input_method/input_method_manager_impl.cc
@@ -29,13 +29,13 @@
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/ash/input_method/assistive_window_controller.h"
 #include "chrome/browser/ash/input_method/candidate_window_controller.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 #include "chrome/browser/ash/login/session/user_session_manager.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
 #include "chrome/browser/chromeos/language_preferences.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
diff --git a/chrome/browser/ash/input_method/multi_word_suggester.cc b/chrome/browser/ash/input_method/multi_word_suggester.cc
index c1a8de3..a2d1fc6 100644
--- a/chrome/browser/ash/input_method/multi_word_suggester.cc
+++ b/chrome/browser/ash/input_method/multi_word_suggester.cc
@@ -7,7 +7,7 @@
 #include <cmath>
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chromeos/services/ime/public/cpp/suggestions.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 
diff --git a/chrome/browser/ash/input_method/personal_info_suggester.cc b/chrome/browser/ash/input_method/personal_info_suggester.cc
index 9c74f0e..f0f49af 100644
--- a/chrome/browser/ash/input_method/personal_info_suggester.cc
+++ b/chrome/browser/ash/input_method/personal_info_suggester.cc
@@ -12,10 +12,10 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/extensions/input_method_api.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
diff --git a/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc b/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
index 033bd20..0dde8456 100644
--- a/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
+++ b/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
diff --git a/chrome/browser/chromeos/input_method/ui/DEPS b/chrome/browser/ash/input_method/ui/DEPS
similarity index 100%
rename from chrome/browser/chromeos/input_method/ui/DEPS
rename to chrome/browser/ash/input_method/ui/DEPS
diff --git a/chrome/browser/chromeos/input_method/ui/DIR_METADATA b/chrome/browser/ash/input_method/ui/DIR_METADATA
similarity index 100%
rename from chrome/browser/chromeos/input_method/ui/DIR_METADATA
rename to chrome/browser/ash/input_method/ui/DIR_METADATA
diff --git a/chrome/browser/chromeos/input_method/ui/OWNERS b/chrome/browser/ash/input_method/ui/OWNERS
similarity index 100%
rename from chrome/browser/chromeos/input_method/ui/OWNERS
rename to chrome/browser/ash/input_method/ui/OWNERS
diff --git a/chrome/browser/chromeos/input_method/ui/assistive_delegate.h b/chrome/browser/ash/input_method/ui/assistive_delegate.h
similarity index 86%
rename from chrome/browser/chromeos/input_method/ui/assistive_delegate.h
rename to chrome/browser/ash/input_method/ui/assistive_delegate.h
index f56ad38..0a91e9f 100644
--- a/chrome/browser/chromeos/input_method/ui/assistive_delegate.h
+++ b/chrome/browser/ash/input_method/ui/assistive_delegate.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
 
 #include <string>
 
@@ -57,4 +57,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  //  CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
+#endif  //  CHROME_BROWSER_ASH_INPUT_METHOD_UI_ASSISTIVE_DELEGATE_H_
diff --git a/chrome/browser/chromeos/input_method/ui/border_factory.cc b/chrome/browser/ash/input_method/ui/border_factory.cc
similarity index 94%
rename from chrome/browser/chromeos/input_method/ui/border_factory.cc
rename to chrome/browser/ash/input_method/ui/border_factory.cc
index b810dcd8..40b8db7 100644
--- a/chrome/browser/chromeos/input_method/ui/border_factory.cc
+++ b/chrome/browser/ash/input_method/ui/border_factory.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/border_factory.h"
+#include "chrome/browser/ash/input_method/ui/border_factory.h"
 
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 
diff --git a/chrome/browser/chromeos/input_method/ui/border_factory.h b/chrome/browser/ash/input_method/ui/border_factory.h
similarity index 65%
rename from chrome/browser/chromeos/input_method/ui/border_factory.h
rename to chrome/browser/ash/input_method/ui/border_factory.h
index 3f882b8d..6e0dec5 100644
--- a/chrome/browser/chromeos/input_method/ui/border_factory.h
+++ b/chrome/browser/ash/input_method/ui/border_factory.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_BORDER_FACTORY_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_BORDER_FACTORY_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_BORDER_FACTORY_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_BORDER_FACTORY_H_
 
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "ui/chromeos/ui_chromeos_export.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/controls/button/label_button.h"
@@ -21,4 +21,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_BORDER_FACTORY_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_BORDER_FACTORY_H_
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_view.cc b/chrome/browser/ash/input_method/ui/candidate_view.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/candidate_view.cc
rename to chrome/browser/ash/input_method/ui/candidate_view.cc
index 6af89b7..1d936a6 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_view.cc
+++ b/chrome/browser/ash/input_method/ui/candidate_view.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/candidate_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_view.h"
 
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_constants.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_constants.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/ime/candidate_window.h"
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_view.h b/chrome/browser/ash/input_method/ui/candidate_view.h
similarity index 93%
rename from chrome/browser/chromeos/input_method/ui/candidate_view.h
rename to chrome/browser/ash/input_method/ui/candidate_view.h
index 72a40448..b8509452 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_view.h
+++ b/chrome/browser/ash/input_method/ui/candidate_view.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
@@ -90,4 +90,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::CandidateView)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_VIEW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_view_unittest.cc b/chrome/browser/ash/input_method/ui/candidate_view_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/candidate_view_unittest.cc
rename to chrome/browser/ash/input_method/ui/candidate_view_unittest.cc
index 63a134a..bdfd778 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_view_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/candidate_view_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/candidate_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_view.h"
 
 #include <stddef.h>
 
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_window_constants.h b/chrome/browser/ash/input_method/ui/candidate_window_constants.h
similarity index 84%
rename from chrome/browser/chromeos/input_method/ui/candidate_window_constants.h
rename to chrome/browser/ash/input_method/ui/candidate_window_constants.h
index c1e5d4f4..3dc1eaa 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_window_constants.h
+++ b/chrome/browser/ash/input_method/ui/candidate_window_constants.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
 
 namespace ui {
 namespace ime {
@@ -35,4 +35,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_CONSTANTS_H_
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_window_view.cc b/chrome/browser/ash/input_method/ui/candidate_window_view.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/candidate_window_view.cc
rename to chrome/browser/ash/input_method/ui/candidate_window_view.cc
index 3a333fe..17277b99 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_window_view.cc
+++ b/chrome/browser/ash/input_method/ui/candidate_window_view.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_view.h"
 
 #include <stddef.h>
 
 #include <string>
 
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_view.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_constants.h"
+#include "chrome/browser/ash/input_method/ui/candidate_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_constants.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_window_view.h b/chrome/browser/ash/input_method/ui/candidate_window_view.h
similarity index 94%
rename from chrome/browser/chromeos/input_method/ui/candidate_window_view.h
rename to chrome/browser/ash/input_method/ui/candidate_window_view.h
index 527a90e..d4ff3f37 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_window_view.h
+++ b/chrome/browser/ash/input_method/ui/candidate_window_view.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
 
 #include <memory>
 
@@ -142,4 +142,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::CandidateWindowView)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_CANDIDATE_WINDOW_VIEW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/candidate_window_view_unittest.cc b/chrome/browser/ash/input_method/ui/candidate_window_view_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/candidate_window_view_unittest.cc
rename to chrome/browser/ash/input_method/ui/candidate_window_view_unittest.cc
index a17eb1e2..7a3251c 100644
--- a/chrome/browser/chromeos/input_method/ui/candidate_window_view_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/candidate_window_view_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_view.h"
 
 #include <stddef.h>
 
@@ -12,7 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_view.h"
+#include "chrome/browser/ash/input_method/ui/candidate_view.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/views/test/views_test_base.h"
 #include "ui/views/widget/widget.h"
diff --git a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc b/chrome/browser/ash/input_method/ui/grammar_suggestion_window.cc
similarity index 96%
rename from chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc
rename to chrome/browser/ash/input_method/ui/grammar_suggestion_window.cc
index 38a751d..bd80365 100644
--- a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.cc
+++ b/chrome/browser/ash/input_method/ui/grammar_suggestion_window.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h"
+#include "chrome/browser/ash/input_method/ui/grammar_suggestion_window.h"
 
-#include "chrome/browser/chromeos/input_method/ui/border_factory.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/border_factory.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h b/chrome/browser/ash/input_method/ui/grammar_suggestion_window.h
similarity index 83%
rename from chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h
rename to chrome/browser/ash/input_method/ui/grammar_suggestion_window.h
index 90c80f3e..2d73404 100644
--- a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h
+++ b/chrome/browser/ash/input_method/ui/grammar_suggestion_window.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
 
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_view.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_view.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/chromeos/ui_chromeos_export.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -65,4 +65,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::GrammarSuggestionWindow)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_GRAMMAR_SUGGESTION_WINDOW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window_unittest.cc b/chrome/browser/ash/input_method/ui/grammar_suggestion_window_unittest.cc
similarity index 96%
rename from chrome/browser/chromeos/input_method/ui/grammar_suggestion_window_unittest.cc
rename to chrome/browser/ash/input_method/ui/grammar_suggestion_window_unittest.cc
index 067f695..4a43278c 100644
--- a/chrome/browser/chromeos/input_method/ui/grammar_suggestion_window_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/grammar_suggestion_window_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/grammar_suggestion_window.h"
+#include "chrome/browser/ash/input_method/ui/grammar_suggestion_window.h"
 
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/chromeos/input_method/ui/infolist_window.cc b/chrome/browser/ash/input_method/ui/infolist_window.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/infolist_window.cc
rename to chrome/browser/ash/input_method/ui/infolist_window.cc
index 53ae006..7cabe70 100644
--- a/chrome/browser/chromeos/input_method/ui/infolist_window.cc
+++ b/chrome/browser/ash/input_method/ui/infolist_window.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/infolist_window.h"
+#include "chrome/browser/ash/input_method/ui/infolist_window.h"
 
 #include <stddef.h>
 
@@ -11,7 +11,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "chrome/browser/chromeos/input_method/ui/candidate_window_constants.h"
+#include "chrome/browser/ash/input_method/ui/candidate_window_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/chromeos/strings/grit/ui_chromeos_strings.h"
diff --git a/chrome/browser/chromeos/input_method/ui/infolist_window.h b/chrome/browser/ash/input_method/ui/infolist_window.h
similarity index 90%
rename from chrome/browser/chromeos/input_method/ui/infolist_window.h
rename to chrome/browser/ash/input_method/ui/infolist_window.h
index aaa79d6..4672930 100644
--- a/chrome/browser/chromeos/input_method/ui/infolist_window.h
+++ b/chrome/browser/ash/input_method/ui/infolist_window.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
 
 #include <memory>
 #include <vector>
@@ -71,4 +71,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::InfolistWindow)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_INFOLIST_WINDOW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_item.cc b/chrome/browser/ash/input_method/ui/input_method_menu_item.cc
similarity index 95%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_item.cc
rename to chrome/browser/ash/input_method/ui/input_method_menu_item.cc
index 52b2ce6d..9a20680 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_item.cc
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_item.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
 
 #include <sstream>
 
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_item.h b/chrome/browser/ash/input_method/ui/input_method_menu_item.h
similarity index 86%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_item.h
rename to chrome/browser/ash/input_method/ui/input_method_menu_item.h
index 09b22fe..2061702 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_item.h
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_item.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
 
 #include <string>
 #include <vector>
@@ -41,4 +41,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_ITEM_H_
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_item_unittest.cc b/chrome/browser/ash/input_method/ui/input_method_menu_item_unittest.cc
similarity index 91%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_item_unittest.cc
rename to chrome/browser/ash/input_method/ui/input_method_menu_item_unittest.cc
index bbd0e89..9b861b4 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_item_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_item_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager.cc b/chrome/browser/ash/input_method/ui/input_method_menu_manager.cc
similarity index 94%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_manager.cc
rename to chrome/browser/ash/input_method/ui/input_method_menu_manager.cc
index 9003842..4efce0b 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager.cc
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 
 #include <stddef.h>
 
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h b/chrome/browser/ash/input_method/ui/input_method_menu_manager.h
similarity index 84%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h
rename to chrome/browser/ash/input_method/ui/input_method_menu_manager.h
index e34ca5d..0d807b97 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_manager.h
@@ -4,11 +4,11 @@
 
 #include "base/macros.h"
 #include "base/observer_list.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_item.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_item.h"
 #include "ui/chromeos/ui_chromeos_export.h"
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
 
 namespace base {
 template <typename Type>
@@ -65,4 +65,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_INPUT_METHOD_MENU_MANAGER_H_
diff --git a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager_unittest.cc b/chrome/browser/ash/input_method/ui/input_method_menu_manager_unittest.cc
similarity index 96%
rename from chrome/browser/chromeos/input_method/ui/input_method_menu_manager_unittest.cc
rename to chrome/browser/ash/input_method/ui/input_method_menu_manager_unittest.cc
index 784ca130..581e1a7 100644
--- a/chrome/browser/chromeos/input_method/ui/input_method_menu_manager_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/input_method_menu_manager_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 
 #include <memory>
 
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.cc b/chrome/browser/ash/input_method/ui/suggestion_accessibility_label.cc
similarity index 93%
rename from chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.cc
rename to chrome/browser/ash/input_method/ui/suggestion_accessibility_label.cc
index 76d5d81..6e3b2d4 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_accessibility_label.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_accessibility_label.h"
 
 namespace ui {
 namespace ime {
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.h b/chrome/browser/ash/input_method/ui/suggestion_accessibility_label.h
similarity index 84%
rename from chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.h
rename to chrome/browser/ash/input_method/ui/suggestion_accessibility_label.h
index 24ee86c..720f447 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.h
+++ b/chrome/browser/ash/input_method/ui/suggestion_accessibility_label.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
 
 #include <memory>
 #include "base/timer/timer.h"
@@ -42,4 +42,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_ACCESSIBILITY_LABEL_H_
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_details.h b/chrome/browser/ash/input_method/ui/suggestion_details.h
similarity index 82%
rename from chrome/browser/chromeos/input_method/ui/suggestion_details.h
rename to chrome/browser/ash/input_method/ui/suggestion_details.h
index 8b99c4a3..71c9e05 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_details.h
+++ b/chrome/browser/ash/input_method/ui/suggestion_details.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
 
 #include <string>
 
@@ -35,4 +35,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_DETAILS_H_
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_view.cc b/chrome/browser/ash/input_method/ui/suggestion_view.cc
similarity index 98%
rename from chrome/browser/chromeos/input_method/ui/suggestion_view.cc
rename to chrome/browser/ash/input_method/ui/suggestion_view.cc
index 471ce91..243c3fd2 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_view.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_view.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/suggestion_view.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_view.h"
 
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_view.h b/chrome/browser/ash/input_method/ui/suggestion_view.h
similarity index 94%
rename from chrome/browser/chromeos/input_method/ui/suggestion_view.h
rename to chrome/browser/ash/input_method/ui/suggestion_view.h
index d2f42ac69..0dd6e47f 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_view.h
+++ b/chrome/browser/ash/input_method/ui/suggestion_view.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
@@ -109,4 +109,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::SuggestionView)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_VIEW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc b/chrome/browser/ash/input_method/ui/suggestion_window_view.cc
similarity index 96%
rename from chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc
rename to chrome/browser/ash/input_method/ui/suggestion_window_view.cc
index c08c72c..e0eb2e7 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/suggestion_window_view.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_window_view.h"
 
 #include <string>
 #include <utility>
@@ -11,10 +11,10 @@
 #include "base/i18n/number_formatting.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/border_factory.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_view.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/border_factory.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_details.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_view.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/vector_icons/vector_icons.h"
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.h b/chrome/browser/ash/input_method/ui/suggestion_window_view.h
similarity index 92%
rename from chrome/browser/chromeos/input_method/ui/suggestion_window_view.h
rename to chrome/browser/ash/input_method/ui/suggestion_window_view.h
index 79d237f..db4c264 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.h
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
 
 #include <stddef.h>
 
 #include <memory>
 
 #include "base/containers/flat_map.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_accessibility_label.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_accessibility_label.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/chromeos/ui_chromeos_export.h"
 #include "ui/gfx/native_widget_types.h"
@@ -120,4 +120,4 @@
 }  // namespace ime
 }  // namespace ui
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_SUGGESTION_WINDOW_VIEW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_window_view_unittest.cc b/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/input_method/ui/suggestion_window_view_unittest.cc
rename to chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
index f417d2e..d1f310a 100644
--- a/chrome/browser/chromeos/input_method/ui/suggestion_window_view_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/suggestion_window_view_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/suggestion_window_view.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_window_view.h"
 
 #include <string>
 
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/ash/input_method/assistive_window_properties.h"
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
-#include "chrome/browser/chromeos/input_method/ui/suggestion_view.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/suggestion_view.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/chrome/browser/chromeos/input_method/ui/undo_window.cc b/chrome/browser/ash/input_method/ui/undo_window.cc
similarity index 96%
rename from chrome/browser/chromeos/input_method/ui/undo_window.cc
rename to chrome/browser/ash/input_method/ui/undo_window.cc
index 13a00ca7..b14193ac 100644
--- a/chrome/browser/chromeos/input_method/ui/undo_window.cc
+++ b/chrome/browser/ash/input_method/ui/undo_window.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/undo_window.h"
+#include "chrome/browser/ash/input_method/ui/undo_window.h"
 
 #include "ash/public/cpp/style/color_provider.h"
 #include "ash/style/scoped_light_mode_as_default.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/chromeos/input_method/ui/border_factory.h"
+#include "chrome/browser/ash/input_method/ui/border_factory.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/bubble/bubble_border.h"
diff --git a/chrome/browser/chromeos/input_method/ui/undo_window.h b/chrome/browser/ash/input_method/ui/undo_window.h
similarity index 85%
rename from chrome/browser/chromeos/input_method/ui/undo_window.h
rename to chrome/browser/ash/input_method/ui/undo_window.h
index 098aa7f5..724d2f6 100644
--- a/chrome/browser/chromeos/input_method/ui/undo_window.h
+++ b/chrome/browser/ash/input_method/ui/undo_window.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_UNDO_WINDOW_H_
-#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_UNDO_WINDOW_H_
+#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_UI_UNDO_WINDOW_H_
+#define CHROME_BROWSER_ASH_INPUT_METHOD_UI_UNDO_WINDOW_H_
 
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/chromeos/ui_chromeos_export.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -57,4 +57,4 @@
 
 DEFINE_VIEW_BUILDER(UI_CHROMEOS_EXPORT, ui::ime::UndoWindow)
 
-#endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_UI_UNDO_WINDOW_H_
+#endif  // CHROME_BROWSER_ASH_INPUT_METHOD_UI_UNDO_WINDOW_H_
diff --git a/chrome/browser/chromeos/input_method/ui/undo_window_unittest.cc b/chrome/browser/ash/input_method/ui/undo_window_unittest.cc
similarity index 94%
rename from chrome/browser/chromeos/input_method/ui/undo_window_unittest.cc
rename to chrome/browser/ash/input_method/ui/undo_window_unittest.cc
index 6411ef97..64768688 100644
--- a/chrome/browser/chromeos/input_method/ui/undo_window_unittest.cc
+++ b/chrome/browser/ash/input_method/ui/undo_window_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/input_method/ui/undo_window.h"
+#include "chrome/browser/ash/input_method/ui/undo_window.h"
 
-#include "chrome/browser/chromeos/input_method/ui/assistive_delegate.h"
+#include "chrome/browser/ash/input_method/ui/assistive_delegate.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/ash/policy/handlers/README.md b/chrome/browser/ash/policy/handlers/README.md
index 6714db78..1dc4e5d 100644
--- a/chrome/browser/ash/policy/handlers/README.md
+++ b/chrome/browser/ash/policy/handlers/README.md
@@ -4,6 +4,6 @@
 This directory should contain code that handles individual policies
 that do not fit in another subdirectory under chrome/browser/ash/policy.
 
-The file configuration_policy_handler_chromeos.h contains multiple possible
+The file configuration_policy_handler_ash.h contains multiple possible
 base classes that can be used to verify policy values of different formats.
 
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
similarity index 99%
rename from chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.cc
rename to chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
index c4d2768e..24b5847 100644
--- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.cc
+++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 
 #include <stdint.h>
 
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
similarity index 98%
rename from chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h
rename to chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
index 3f1377a..74794e0 100644
--- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h
+++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_CHROMEOS_H_
-#define CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_CHROMEOS_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_
+#define CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_
 
 #include <string>
 
@@ -134,7 +134,7 @@
   DeprecatedIdleActionHandler();
   ~DeprecatedIdleActionHandler() override;
 
-  // ConfigurationPolicyHandler methods:
+  // IntRangePolicyHandlerBase:
   void ApplyPolicySettings(const PolicyMap& policies,
                            PrefValueMap* prefs) override;
 
@@ -212,4 +212,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_CHROMEOS_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_HANDLERS_CONFIGURATION_POLICY_HANDLER_ASH_H_
diff --git a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos_unittest.cc b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc
similarity index 99%
rename from chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos_unittest.cc
rename to chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc
index 2165a976..42ed9cb 100644
--- a/chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/configuration_policy_handler_ash_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 
 #include <memory>
 #include <utility>
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification_unittest.cc b/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification_unittest.cc
index 0930803f..c017985 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification_unittest.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_discover_tab_notification_unittest.cc
@@ -15,6 +15,8 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
+#include "ui/base/l10n/l10n_util.h"
 
 namespace chromeos {
 
@@ -69,10 +71,12 @@
   discover_tab_notification_->Show();
 
   EXPECT_EQ(true, HasDiscoverTabNotification());
-  EXPECT_EQ("Design and build your own games",
-            base::UTF16ToASCII(GetDiscoverTabNotification().title()));
-  EXPECT_EQ("Learn from a game creator, get game design apps, and more",
-            base::UTF16ToASCII(GetDiscoverTabNotification().message()));
+  EXPECT_EQ(
+      l10n_util::GetStringUTF16(IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE),
+      GetDiscoverTabNotification().title());
+  EXPECT_EQ(
+      l10n_util::GetStringUTF16(IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE),
+      GetDiscoverTabNotification().message());
 }
 
 TEST_F(HelpAppDiscoverTabNotificationTest, LogsMetricWhenNotificationShown) {
diff --git a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
index ba8f311..7a67afe 100644
--- a/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
+++ b/chrome/browser/chrome_content_browser_client_receiver_bindings.cc
@@ -31,6 +31,7 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "components/metrics/call_stack_profile_collector.h"
 #include "components/offline_pages/buildflags/buildflags.h"
+#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
 #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/content/browser/mojo_safe_browsing_impl.h"
@@ -411,6 +412,13 @@
     return true;
   }
 #endif
+  if (interface_name == page_load_metrics::mojom::PageLoadMetrics::Name_) {
+    page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
+        mojo::PendingAssociatedReceiver<
+            page_load_metrics::mojom::PageLoadMetrics>(std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
 #if !defined(OS_ANDROID)
   if (interface_name == pdf::mojom::PdfService::Name_) {
     pdf::PDFWebContentsHelper::BindPdfService(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 699f3d9..4c6ed66c 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1520,6 +1520,31 @@
     "../ash/input_method/text_utils.h",
     "../ash/input_method/tts_handler.cc",
     "../ash/input_method/tts_handler.h",
+    "../ash/input_method/ui/assistive_delegate.h",
+    "../ash/input_method/ui/border_factory.cc",
+    "../ash/input_method/ui/border_factory.h",
+    "../ash/input_method/ui/candidate_view.cc",
+    "../ash/input_method/ui/candidate_view.h",
+    "../ash/input_method/ui/candidate_window_constants.h",
+    "../ash/input_method/ui/candidate_window_view.cc",
+    "../ash/input_method/ui/candidate_window_view.h",
+    "../ash/input_method/ui/grammar_suggestion_window.cc",
+    "../ash/input_method/ui/grammar_suggestion_window.h",
+    "../ash/input_method/ui/infolist_window.cc",
+    "../ash/input_method/ui/infolist_window.h",
+    "../ash/input_method/ui/input_method_menu_item.cc",
+    "../ash/input_method/ui/input_method_menu_item.h",
+    "../ash/input_method/ui/input_method_menu_manager.cc",
+    "../ash/input_method/ui/input_method_menu_manager.h",
+    "../ash/input_method/ui/suggestion_accessibility_label.cc",
+    "../ash/input_method/ui/suggestion_accessibility_label.h",
+    "../ash/input_method/ui/suggestion_details.h",
+    "../ash/input_method/ui/suggestion_view.cc",
+    "../ash/input_method/ui/suggestion_view.h",
+    "../ash/input_method/ui/suggestion_window_view.cc",
+    "../ash/input_method/ui/suggestion_window_view.h",
+    "../ash/input_method/ui/undo_window.cc",
+    "../ash/input_method/ui/undo_window.h",
     "../ash/kerberos/kerberos_credentials_manager.cc",
     "../ash/kerberos/kerberos_credentials_manager.h",
     "../ash/kerberos/kerberos_credentials_manager_factory.cc",
@@ -2184,8 +2209,8 @@
     "../ash/policy/handlers/adb_sideloading_allowance_mode_policy_handler.h",
     "../ash/policy/handlers/bluetooth_policy_handler.cc",
     "../ash/policy/handlers/bluetooth_policy_handler.h",
-    "../ash/policy/handlers/configuration_policy_handler_chromeos.cc",
-    "../ash/policy/handlers/configuration_policy_handler_chromeos.h",
+    "../ash/policy/handlers/configuration_policy_handler_ash.cc",
+    "../ash/policy/handlers/configuration_policy_handler_ash.h",
     "../ash/policy/handlers/device_dock_mac_address_source_handler.cc",
     "../ash/policy/handlers/device_dock_mac_address_source_handler.h",
     "../ash/policy/handlers/device_name_policy_handler.cc",
@@ -2865,31 +2890,6 @@
     "fileapi/recent_source.h",
     "idle_detector.cc",
     "idle_detector.h",
-    "input_method/ui/assistive_delegate.h",
-    "input_method/ui/border_factory.cc",
-    "input_method/ui/border_factory.h",
-    "input_method/ui/candidate_view.cc",
-    "input_method/ui/candidate_view.h",
-    "input_method/ui/candidate_window_constants.h",
-    "input_method/ui/candidate_window_view.cc",
-    "input_method/ui/candidate_window_view.h",
-    "input_method/ui/grammar_suggestion_window.cc",
-    "input_method/ui/grammar_suggestion_window.h",
-    "input_method/ui/infolist_window.cc",
-    "input_method/ui/infolist_window.h",
-    "input_method/ui/input_method_menu_item.cc",
-    "input_method/ui/input_method_menu_item.h",
-    "input_method/ui/input_method_menu_manager.cc",
-    "input_method/ui/input_method_menu_manager.h",
-    "input_method/ui/suggestion_accessibility_label.cc",
-    "input_method/ui/suggestion_accessibility_label.h",
-    "input_method/ui/suggestion_details.h",
-    "input_method/ui/suggestion_view.cc",
-    "input_method/ui/suggestion_view.h",
-    "input_method/ui/suggestion_window_view.cc",
-    "input_method/ui/suggestion_window_view.h",
-    "input_method/ui/undo_window.cc",
-    "input_method/ui/undo_window.h",
     "language_preferences.cc",
     "language_preferences.h",
     "locale_change_guard.cc",
@@ -3901,6 +3901,13 @@
     "../ash/input_method/suggestions_collector_unittest.cc",
     "../ash/input_method/suggestions_service_client_unittest.cc",
     "../ash/input_method/text_utils_unittest.cc",
+    "../ash/input_method/ui/candidate_view_unittest.cc",
+    "../ash/input_method/ui/candidate_window_view_unittest.cc",
+    "../ash/input_method/ui/grammar_suggestion_window_unittest.cc",
+    "../ash/input_method/ui/input_method_menu_item_unittest.cc",
+    "../ash/input_method/ui/input_method_menu_manager_unittest.cc",
+    "../ash/input_method/ui/suggestion_window_view_unittest.cc",
+    "../ash/input_method/ui/undo_window_unittest.cc",
     "../ash/kerberos/kerberos_credentials_manager_test.cc",
     "../ash/kerberos/kerberos_ticket_expiry_notification_test.cc",
     "../ash/lock_screen_apps/app_manager_impl_unittest.cc",
@@ -4022,7 +4029,7 @@
     "../ash/policy/external_data/handlers/device_printers_external_data_handler_unittest.cc",
     "../ash/policy/handlers/adb_sideloading_allowance_mode_policy_handler_unittest.cc",
     "../ash/policy/handlers/bluetooth_policy_handler_unittest.cc",
-    "../ash/policy/handlers/configuration_policy_handler_chromeos_unittest.cc",
+    "../ash/policy/handlers/configuration_policy_handler_ash_unittest.cc",
     "../ash/policy/handlers/device_dock_mac_address_source_handler_unittest.cc",
     "../ash/policy/handlers/device_name_policy_handler_impl_unittest.cc",
     "../ash/policy/handlers/device_name_policy_handler_name_generator_unittest.cc",
@@ -4231,13 +4238,6 @@
     "fileapi/recent_disk_source_unittest.cc",
     "fileapi/recent_model_unittest.cc",
     "fileapi/test/fake_recent_source.cc",
-    "input_method/ui/candidate_view_unittest.cc",
-    "input_method/ui/candidate_window_view_unittest.cc",
-    "input_method/ui/grammar_suggestion_window_unittest.cc",
-    "input_method/ui/input_method_menu_item_unittest.cc",
-    "input_method/ui/input_method_menu_manager_unittest.cc",
-    "input_method/ui/suggestion_window_view_unittest.cc",
-    "input_method/ui/undo_window_unittest.cc",
     "locale_change_guard_unittest.cc",
     "nearby/bluetooth_adapter_manager_unittest.cc",
     "nearby/nearby_process_manager_impl_unittest.cc",
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index f6b2ba2e..9d357e1 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -3947,19 +3947,6 @@
           &AutotestPrivateSetAppWindowStateFunction::WindowStateChanged, this,
           expected_state));
 
-  // TODO(crbug.com/990713): Make WMEvent trigger split view in tablet mode.
-  if (ash::TabletMode::Get()->InTabletMode()) {
-    if (expected_state == chromeos::WindowStateType::kPrimarySnapped) {
-      ash::SplitViewTestApi().SnapWindow(
-          window, ash::SplitViewTestApi::SnapPosition::LEFT);
-      return RespondLater();
-    } else if (expected_state == chromeos::WindowStateType::kSecondarySnapped) {
-      ash::SplitViewTestApi().SnapWindow(
-          window, ash::SplitViewTestApi::SnapPosition::RIGHT);
-      return RespondLater();
-    }
-  }
-
   const ash::WMEvent event(ToWMEventType(params->change.event_type));
   ash::WindowState::Get(window)->OnWMEvent(&event);
 
diff --git a/chrome/browser/chromeos/input_method/DEPS b/chrome/browser/chromeos/input_method/DEPS
deleted file mode 100644
index 0aef4396..0000000
--- a/chrome/browser/chromeos/input_method/DEPS
+++ /dev/null
@@ -1,55 +0,0 @@
-# TODO(https://crbug.com/1164001): When this file is edited, same file in
-# //chrome/browser/ash/input_method should be updated as well. We need to sync
-# both files until the migration of //chrome/browser/chromeos/input_method is
-# done.
-include_rules = [
-  "-chrome",
-  "+chrome/browser",
-  "+chrome/common",
-  "+chrome/grit",
-  "-content",
-]
-
-specific_include_rules = {
-  # The configuration layer.
-  "(input_method_delegate_impl|input_method_persistence|browser_state_monitor)"
-  "\.(h|cc)": [
-    "+chrome/common",
-    "+chrome/browser",
-    "+chrome/test",
-    "+content/public",
-  ],
-
-  # TODO(erikwright): Bring this list to zero.
-  # Do not add to the list of temporarily-allowed dependencies below,
-  # and please do not introduce more #includes of these files.
-  "input_method_manager_impl\.cc": [
-    # TODO(erikwright): Much/all of language_preferences can/should be decoupled
-    # from chrome/browser.
-    "!chrome/browser/chromeos/language_preferences.h",
-  ],
-
-  # For testing.
-  ".*(_browsertest|_browsertests|_unittest|_test_helper)\.(h|cc)": [
-    "+chrome/common",
-    "+chrome/browser",
-    "+chrome/test",
-    "+content/public",
-    "+mojo/core/embedder/embedder.h",
-  ],
-  "xkeyboard_unittest\.cc": [
-    "!content/public/test/test_browser_thread.h",
-  ],
-
-  # TODO: This should not be an allowed dep; see
-  # http://crbug.com/1148093 and
-  # http://b/173144152.
-  "tts_handler\.h": [
-    "!content/public/browser/tts_controller.h",
-  ],
-
-  # TODO: input method owners should audit this block.
-  "(input|ime).*\.(h|cc)": [
-    "+content/public/browser",
-  ],
-}
diff --git a/chrome/browser/chromeos/input_method/OWNERS b/chrome/browser/chromeos/input_method/OWNERS
deleted file mode 100644
index 93111b3..0000000
--- a/chrome/browser/chromeos/input_method/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# TODO(https://crbug.com/1164001): Share OWNERS until the migration of
-# //chrome/browser/chromeos/input_method completes.
-file://chrome/browser/ash/input_method/OWNERS
diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc
index 8daa09d..a11fcc5 100644
--- a/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -224,7 +224,15 @@
       << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(AutomationApiTest, TabsAutomationBooleanPermissions) {
+// Flaky on Mac: crbug.com/1235249
+#if defined(OS_MAC)
+#define MAYBE_TabsAutomationBooleanPermissions \
+  DISABLED_TabsAutomationBooleanPermissions
+#else
+#define MAYBE_TabsAutomationBooleanPermissions TabsAutomationBooleanPermissions
+#endif
+IN_PROC_BROWSER_TEST_F(AutomationApiTest,
+                       MAYBE_TabsAutomationBooleanPermissions) {
   StartEmbeddedTestServer();
   ASSERT_TRUE(RunExtensionTest("automation/tests/tabs_automation_boolean",
                                {.page_url = "permissions.html"}))
@@ -253,7 +261,13 @@
       << message_;
 }
 
-IN_PROC_BROWSER_TEST_F(AutomationApiTest, CloseTab) {
+// Flaky on Mac: crbug.com/1235249
+#if defined(OS_MAC)
+#define MAYBE_CloseTab DISABLED_CloseTab
+#else
+#define MAYBE_CloseTab CloseTab
+#endif
+IN_PROC_BROWSER_TEST_F(AutomationApiTest, MAYBE_CloseTab) {
   StartEmbeddedTestServer();
   ASSERT_TRUE(
       RunExtensionTest("automation/tests/tabs", {.page_url = "close_tab.html"}))
diff --git a/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc b/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
index c16be48..8ffaeb0 100644
--- a/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
+++ b/chrome/browser/extensions/api/crash_report_private/crash_report_private_apitest.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
+#include "chrome/common/chrome_features.h"
 #include "components/crash/content/browser/error_reporting/mock_crash_endpoint.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/browser_test.h"
@@ -310,6 +311,10 @@
 // window.
 IN_PROC_BROWSER_TEST_P(CrashReportPrivateCalledFromSwaTest,
                        CalledFromWebContentsInWebAppWindow) {
+  if (base::FeatureList::IsEnabled(features::kWebAppsCrosapi)) {
+    // TODO(crbug.com/1234938): Support Crosapi (web apps running in Lacros).
+    return;
+  }
   WaitForTestSystemAppInstall();
   // Set up test server to listen to handle crash reports & serve fake web app
   // content. Note: Creating a |MockCrashEndpoint| starts the server.
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
index 4e8e732..313feec 100644
--- a/chrome/browser/first_run/first_run.cc
+++ b/chrome/browser/first_run/first_run.cc
@@ -278,7 +278,8 @@
 
 // -- Platform-specific functions --
 
-#if !defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_BSD)
+#if !defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_BSD) && \
+    !defined(OS_FUCHSIA)
 bool IsOrganicFirstRun() {
   std::string brand;
   google_brand::GetBrand(&brand);
diff --git a/chrome/browser/first_run/first_run_internal_fuchsia.cc b/chrome/browser/first_run/first_run_internal_fuchsia.cc
new file mode 100644
index 0000000..613201f5
--- /dev/null
+++ b/chrome/browser/first_run/first_run_internal_fuchsia.cc
@@ -0,0 +1,35 @@
+// 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/first_run/first_run_internal.h"
+
+#include "base/files/file_path.h"
+#include "base/notreached.h"
+
+namespace first_run {
+namespace internal {
+
+bool IsOrganicFirstRun() {
+  // We treat all installs as organic.
+  return true;
+}
+
+base::FilePath InitialPrefsPath() {
+  // TODO(crbug.com/1234776)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return base::FilePath();
+}
+
+void DoPostImportPlatformSpecificTasks(Profile* profile) {
+  // TODO(crbug.com/1234776)
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
+bool ShowPostInstallEULAIfNeeded(installer::InitialPreferences* install_prefs) {
+  // The EULA is only handled on Windows.
+  return true;
+}
+
+}  // namespace internal
+}  // namespace first_run
diff --git a/chrome/browser/first_run/upgrade_util_fuchsia.cc b/chrome/browser/first_run/upgrade_util_fuchsia.cc
new file mode 100644
index 0000000..18710993
--- /dev/null
+++ b/chrome/browser/first_run/upgrade_util_fuchsia.cc
@@ -0,0 +1,23 @@
+// 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/first_run/upgrade_util.h"
+
+#include "base/notreached.h"
+
+namespace upgrade_util {
+
+bool RelaunchChromeBrowserImpl(const base::CommandLine& command_line) {
+  // TODO(crbug.com/1234776)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return false;
+}
+
+bool IsUpdatePendingRestart() {
+  // TODO(crbug.com/1234776)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return false;
+}
+
+}  // namespace upgrade_util
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 625cc4c5..3c6ad929 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1260,7 +1260,7 @@
   {
     "name": "drive-fs-bidirectional-native-messaging",
     "owners": [ "austinct@chromium.org", "simmonsjosh@google.com" ],
-    "expiry_milestone": 93
+    "expiry_milestone": 98
   },
   {
       "name": "dynamic-color-android",
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn
index 708b699b..8c3f81d6 100644
--- a/chrome/browser/media/router/discovery/BUILD.gn
+++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -90,6 +90,10 @@
     sources += [ "discovery_network_list_posix.cc" ]
   }
 
+  if (is_fuchsia) {
+    sources += [ "discovery_network_list_fuchsia.cc" ]
+  }
+
   if (is_mac) {
     sources += [ "discovery_network_list_wifi_mac.mm" ]
     frameworks = [ "CoreWLAN.framework" ]
diff --git a/chrome/browser/media/router/discovery/discovery_network_list_fuchsia.cc b/chrome/browser/media/router/discovery/discovery_network_list_fuchsia.cc
new file mode 100644
index 0000000..169d3e1
--- /dev/null
+++ b/chrome/browser/media/router/discovery/discovery_network_list_fuchsia.cc
@@ -0,0 +1,17 @@
+// 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/media/router/discovery/discovery_network_list.h"
+
+#include "base/notreached.h"
+
+namespace media_router {
+
+std::vector<DiscoveryNetworkInfo> GetDiscoveryNetworkInfoList() {
+  // TODO(crbug.com/1234750)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return {};
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
index dd743c6..6c7da791 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_uploader.cc
@@ -44,6 +44,8 @@
 const char kProduct[] = "Chrome_Linux";
 #elif defined(OS_ANDROID)
 const char kProduct[] = "Chrome_Android";
+#elif defined(OS_FUCHSIA)
+const char kProduct[] = "Chrome_Fuchsia";
 #else
 #error Platform not supported.
 #endif
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
index 9544cfb3..aff1c0a 100644
--- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc
+++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
@@ -361,6 +361,8 @@
   const char product[] = "Chrome_Android";
 #elif BUILDFLAG(IS_CHROMEOS_ASH)
   const char product[] = "Chrome_ChromeOS";
+#elif defined(OS_FUCHSIA)
+  const char product[] = "Chrome_Fuchsia";
 #else
 #error Platform not supported.
 #endif
diff --git a/chrome/browser/media/webrtc/window_icon_util_fuchsia.cc b/chrome/browser/media/webrtc/window_icon_util_fuchsia.cc
new file mode 100644
index 0000000..bcee8a8b
--- /dev/null
+++ b/chrome/browser/media/webrtc/window_icon_util_fuchsia.cc
@@ -0,0 +1,15 @@
+// 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/media/webrtc/window_icon_util.h"
+
+#include "base/notreached.h"
+#include "content/public/browser/desktop_media_id.h"
+#include "ui/gfx/image/image_skia.h"
+
+gfx::ImageSkia GetWindowIcon(content::DesktopMediaID id) {
+  // TODO(crbug.com/1234750)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return gfx::ImageSkia();
+}
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 40d54bde..31c2af0 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -129,7 +129,7 @@
 #include "chrome/browser/ash/borealis/borealis_prefs.h"
 #include "chrome/browser/ash/crostini/crostini_pref_names.h"
 #include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 #include "chrome/browser/ash/policy/handlers/lacros_availability_policy_handler.h"
 #include "chrome/browser/ash/policy/handlers/system_features_disable_list_policy_handler.h"
 #include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_policy_handler.h"
diff --git a/chrome/browser/policy/test/arc_policy_browsertest.cc b/chrome/browser/policy/test/arc_policy_browsertest.cc
index 36bcb390..7725427c 100644
--- a/chrome/browser/policy/test/arc_policy_browsertest.cc
+++ b/chrome/browser/policy/test/arc_policy_browsertest.cc
@@ -4,7 +4,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/ash/arc/session/arc_session_manager.h"
-#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_chromeos.h"
+#include "chrome/browser/ash/policy/handlers/configuration_policy_handler_ash.h"
 #include "chrome/browser/policy/policy_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
index 0563b2b..7dd29f4 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -3624,3 +3624,25 @@
         .replay();
   });
 });
+
+TEST_F('ChromeVoxBackgroundTest', 'EndOfText', function() {
+  const mockFeedback = this.createMockFeedback();
+  const site = `
+    <p>start</p>
+    <div tabindex=0 role="textbox" contenteditable>123</div>
+  `;
+  this.runWithLoadedTree(site, function(root) {
+    const contentEditable = root.find({role: RoleType.TEXT_FIELD});
+
+    this.listenOnce(contentEditable, EventType.FOCUS, function() {
+      mockFeedback.call(press(KeyCode.RIGHT))
+          .expectSpeech('2')
+          .call(press(KeyCode.RIGHT))
+          .expectSpeech('3')
+          .call(press(KeyCode.RIGHT))
+          .expectSpeech('End of text')
+          .replay();
+    }.bind(this));
+    contentEditable.focus();
+  });
+});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
index 701dd62..11749a4f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -659,7 +659,13 @@
   createCharRange() {
     const start = this.start_;
     let end = start.move(Unit.CHARACTER, Movement.DIRECTIONAL, Dir.FORWARD);
-    if (start.node !== end.node) {
+
+    // The following conditions detect when|start|moves across a node boundary
+    // to|end|.
+    if (start.node !== end.node ||
+        // When |start| and |end| are equal, that means we've reached
+        // the end of the document. This is a node boundary as well.
+        start.equals(end)) {
       end = new cursors.Cursor(start.node, start.index + 1);
     }
     return new Range(start, end);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
index 8c895ae..f92b32f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -461,6 +461,22 @@
       return;
     }
 
+    // End of document announcements are special because it's the only situation
+    // in which there's no more content to the right of the  on the last
+    // linecursor. This condition has to detect a precise state change where a
+    // user moves (not changes) within the last line.
+    if (this.isSelectionOnLastLine() && cur.hasCollapsedSelection() &&
+        cur.text.length === cur.endOffset && prev.isSameLine(cur) &&
+        cur.text === prev.text) {
+      // Omit announcements if the document is completely empty.
+      if (!this.isSelectionOnFirstLine() || cur.text.length > 0) {
+        ChromeVox.tts.speak(
+            Msgs.getMsg('end_of_text_verbose'), QueueMode.CATEGORY_FLUSH);
+      }
+      this.updateIntraLineState_(cur);
+      return;
+    }
+
     // Before entering into our state machine below, use selected intents to
     // decipher ambiguous cases.
     if (this.maybeSpeakUsingIntents_(intents, cur, prev)) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
index 45799c4..05a5c682 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -512,7 +512,7 @@
               .expectSpeech('t')
               .expectBraille(lineText, {startIndex: 3, endIndex: 3})
               .call(moveByChar)
-              .expectSpeech('\n')
+              .expectSpeech('End of text')
               .expectBraille(lineText, {startIndex: 4, endIndex: 4})
 
               .replay();
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
index 9e6a055..86ec36d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
@@ -425,6 +425,7 @@
 <translation id="3813387282697781382">Light Coral</translation>
 <translation id="3816633764618089385">Next media</translation>
 <translation id="3840823741487267909">Abbreviation</translation>
+<translation id="3841319830220785495">Default natural voice</translation>
 <translation id="385383972552776628">Open options page</translation>
 <translation id="3856075812838139784">Read only</translation>
 <translation id="3857141338659865495">Medium Turquoise</translation>
@@ -982,6 +983,7 @@
 <translation id="7968340748835037139">Dark Green</translation>
 <translation id="7972507042926081808">Chocolate</translation>
 <translation id="7974390230414479278">Menu item</translation>
+<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> Voice <ph name="COUNT" /></translation>
 <translation id="8004507136466386272">Words</translation>
 <translation id="8004512796067398576">Increment</translation>
 <translation id="8007540374018858731">h3</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_si.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_si.xtb
index fb78ff03..fcd6346 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_si.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_si.xtb
@@ -425,6 +425,7 @@
 <translation id="3813387282697781382">ළා හිරිගල</translation>
 <translation id="3816633764618089385">ඊලඟ මාධ්‍යය</translation>
 <translation id="3840823741487267909">කෙටි කිරීම</translation>
+<translation id="3841319830220785495">පෙරනිමි ස්වභාවික කටහඬ</translation>
 <translation id="385383972552776628">අභිප්‍රේත පිටුව විවෘත කරන්න</translation>
 <translation id="3856075812838139784">කියවීම පමණයි</translation>
 <translation id="3857141338659865495">මධ්‍යම නිල්මිණි</translation>
@@ -982,6 +983,7 @@
 <translation id="7968340748835037139">තද කොළ</translation>
 <translation id="7972507042926081808">චොකොලට්</translation>
 <translation id="7974390230414479278">මෙනූ අයිතමය</translation>
+<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> කටහඬ <ph name="COUNT" /></translation>
 <translation id="8004507136466386272">වචන</translation>
 <translation id="8004512796067398576">වැඩිවීම</translation>
 <translation id="8007540374018858731">h3</translation>
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.html b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.html
index f7b27a6b..b2a9de4 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.html
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.html
@@ -22,7 +22,9 @@
         <div id="tabModeText">
           <iron-icon icon="cr:info-outline"></iron-icon>
           [[getAppNameTabModeExplanation_(app)]]
-          <a href="google.com">$i18n{appManagementIntentSharingTabLearnMore}</a>
+          <a href="https://support.google.com/chromebook?p=app_intent ">
+            $i18n{appManagementIntentSharingTabLearnMore}
+          </a>
         </div>
       </template>
       <div class="list-frame">
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java
index 112da7f..65746b0 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelFilterProvider.java
@@ -119,4 +119,11 @@
     public void onTabStateInitialized() {
         markTabStateInitialized();
     }
+
+    /**
+     * Reset the internal filter list to allow initialization again.
+     */
+    public void resetTabModelFilterListForTesting() {
+        mTabModelFilterList = Collections.emptyList();
+    }
 }
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
index 3663a1c9..99c82ad 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
@@ -88,4 +88,11 @@
      * @return Specified {@link Tab} or {@code null} if the {@link Tab} is not found.
      */
     Tab getTabById(int tabId);
+
+    /**
+     * Finds the {@link TabModelSelector} bound to an Activity instance of a given index.
+     * @param index The index of {@link TabModelSelector} to get.
+     * @return Specified {@link TabModelSelector} or {@code null} if not found.
+     */
+    TabModelSelector getTabModelSelectorById(int index);
 }
diff --git a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
index 2344346e..61c826b0 100644
--- a/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
+++ b/chrome/browser/tabmodel/internal/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerImpl.java
@@ -150,6 +150,11 @@
         return null;
     }
 
+    @Override
+    public TabModelSelector getTabModelSelectorById(int index) {
+        return mSelectors.get(index);
+    }
+
     // ActivityStateListener
     @Override
     public void onActivityStateChange(Activity activity, int newState) {
diff --git a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateDirectory.java b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateDirectory.java
index 7268c09..d5a485b 100644
--- a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateDirectory.java
+++ b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateDirectory.java
@@ -26,7 +26,8 @@
     private static final String BASE_STATE_FOLDER = "tabs";
 
     /** The name of the directory where the state for tabbed mode is saved. */
-    private static final String TABBED_MODE_DIRECTORY = "0";
+    @VisibleForTesting
+    public static final String TABBED_MODE_DIRECTORY = "0";
 
     /** The name of the directory where the state for custom tabs is saved. */
     public static final String CUSTOM_TABS_DIRECTORY = "custom_tabs";
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 25e2d16..f8a8a417 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -439,7 +439,6 @@
     "//components/content_settings/core/browser",
     "//components/content_settings/core/common",
     "//components/country_codes",
-    "//components/crash/core/app",
     "//components/crash/core/browser",
     "//components/crx_file",
     "//components/data_reduction_proxy/core/browser",
@@ -643,6 +642,10 @@
     ]
   }
 
+  if (!is_fuchsia) {
+    deps += [ "//components/crash/core/app" ]
+  }
+
   if (is_android) {
     sources += [
       "android/android_about_app_info.cc",
@@ -2971,7 +2974,7 @@
     ]
   }
 
-  if (is_win || is_mac || is_linux || is_chromeos) {
+  if (is_win || is_mac || is_linux || is_chromeos || is_fuchsia) {
     sources += [
       "autofill/payments/virtual_card_selection_dialog_controller.h",
       "autofill/payments/virtual_card_selection_dialog_controller_impl.cc",
@@ -3049,7 +3052,7 @@
     ]
   }
 
-  if (is_win || is_mac || (is_linux || is_chromeos_lacros)) {
+  if (is_win || is_mac || is_fuchsia || (is_linux || is_chromeos_lacros)) {
     sources += [
       "profile_picker.cc",
       "profile_picker.h",
@@ -3411,7 +3414,7 @@
       "views/frame/glass_browser_frame_view.h",
       "views/frame/minimize_button_metrics_win.cc",
       "views/frame/minimize_button_metrics_win.h",
-      "views/frame/native_browser_frame_factory_aurawin.cc",
+      "views/frame/native_browser_frame_factory_aura.cc",
       "views/frame/system_menu_insertion_delegate_win.cc",
       "views/frame/system_menu_insertion_delegate_win.h",
       "views/frame/windows_10_caption_button.cc",
@@ -3522,9 +3525,12 @@
     ]
   }
 
+  if (is_linux || is_chromeos_lacros || is_fuchsia) {
+    sources += [ "views/apps/chrome_app_window_client_views_aura.cc" ]
+  }
+
   if (is_linux || is_chromeos_lacros) {
     sources += [
-      "views/apps/chrome_app_window_client_views_linux.cc",
       "views/frame/browser_desktop_window_tree_host.h",
       "webui/help/version_updater_basic.cc",
       "webui/help/version_updater_basic.h",
@@ -4606,6 +4612,19 @@
     if (is_chromeos) {
       sources += [ "views/status_icons/status_tray_chromeos.cc" ]
     }
+    if (is_fuchsia) {
+      sources += [
+        "views/certificate_viewer_fuchsia.cc",
+        "views/chrome_views_delegate_fuchsia.cc",
+        "views/frame/browser_desktop_window_tree_host.h",
+        "views/frame/browser_desktop_window_tree_host_fuchsia.cc",
+        "views/frame/native_browser_frame_factory_aura.cc",
+        "views/status_icons/status_tray_fuchsia.cc",
+        "webui/help/version_updater_basic.cc",
+        "webui/help/version_updater_basic.h",
+        "webui/settings/settings_utils_fuchsia.cc",
+      ]
+    }
 
     if (is_mac) {
       sources += [
@@ -4636,7 +4655,7 @@
       ]
     }
 
-    if (is_win || (is_linux || is_chromeos_lacros)) {
+    if (is_win || is_fuchsia || (is_linux || is_chromeos_lacros)) {
       sources += [
         "views/native_widget_factory.cc",
         "views/native_widget_factory.h",
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 937d8f83..e826f397 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
@@ -314,6 +314,7 @@
 <translation id="2979025552038692506">Selected Incognito Tab</translation>
 <translation id="2979448359891869301">Can\u2019t extend screenshot. Try again when your phone isn\u2019t busy.</translation>
 <translation id="2979639724566107830">Open in new window</translation>
+<translation id="2981364137500752533">You can have up to 5 windows.</translation>
 <translation id="2987620471460279764">Text shared from other device</translation>
 <translation id="2989523299700148168">Recently Visited</translation>
 <translation id="2992473221983447149">Image descriptions</translation>
@@ -445,6 +446,7 @@
 <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads deleted</translation>
 <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="3861633093716975811">Popular videos</translation>
 <translation id="3892148308691398805">Copy text</translation>
 <translation id="3894427358181296146">Add folder</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
index 342d93e..2feaa45 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -314,6 +314,7 @@
 <translation id="2979025552038692506">තෝරා ගත් අප්‍රකට ටැබය</translation>
 <translation id="2979448359891869301">තිර රුව පුළුල් කළ නොහැකිය. ඔබගෙ දුරකථනය කාර්ය බහුල නොවන විට නැවත උත්සාහ කරන්න.</translation>
 <translation id="2979639724566107830">නව කවුළුවක විවෘත කරන්න</translation>
+<translation id="2981364137500752533">ඔබට කවුළු 5ක් දක්වා තිබිය හැකිය.</translation>
 <translation id="2987620471460279764">අනෙකුත් උපාංගයෙන් බෙදා ගත් පාඨය</translation>
 <translation id="2989523299700148168">මෑතදී පිවිසි</translation>
 <translation id="2992473221983447149">රූප විස්තර</translation>
@@ -445,6 +446,7 @@
 <translation id="3819178904835489326">බාගැනීම් <ph name="NUMBER_OF_DOWNLOADS" />ක් මැකිණි</translation>
 <translation id="3845098929839618392">අප්‍රකට ටැබයක විවෘත කරන්න</translation>
 <translation id="3856096718352044181">මෙය වලංගු සැපයුම්කරුවෙක් බව සත්‍යාපන කරන්න, නැති නම් පසුව නැවත උත්සාහ කරන්න</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3861633093716975811">ජනප්‍රිය වීඩියෝ</translation>
 <translation id="3892148308691398805">පෙළ පිටපත් කරන්න</translation>
 <translation id="3894427358181296146">ෆෝල්ඩරය එක් කරන්න</translation>
diff --git a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
index 27636f6..8011a280 100644
--- a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
@@ -48,9 +48,11 @@
 #include "chromeos/components/help_app_ui/help_app_manager_factory.h"
 #include "chromeos/components/help_app_ui/search/search.mojom.h"
 #include "chromeos/components/help_app_ui/search/search_handler.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_navigation_observer.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/events/event_constants.h"
 
 using web_app::test::CrosapiParam;
@@ -188,7 +190,8 @@
 
   ChromeSearchResult* result = FindResult("help-app://discover");
   ASSERT_TRUE(result);
-  EXPECT_EQ(base::UTF16ToASCII(result->title()), "Make your own game");
+  EXPECT_EQ(result->title(), l10n_util::GetStringUTF16(
+                                 IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP));
   EXPECT_EQ(result->metrics_type(), ash::HELP_APP_DISCOVER);
 
   // Open the search result. This should open the help app at the expected url.
@@ -231,7 +234,8 @@
 
   auto* result = FindResult("help-app://updates");
   ASSERT_TRUE(result);
-  EXPECT_EQ(base::UTF16ToASCII(result->title()), "What's new with Chrome OS");
+  EXPECT_EQ(result->title(),
+            l10n_util::GetStringUTF16(IDS_HELP_APP_WHATS_NEW_SUGGESTION_CHIP));
   EXPECT_EQ(result->metrics_type(), ash::HELP_APP_UPDATES);
   // Displayed in first position.
   EXPECT_EQ(result->position_priority(), 1.0f);
diff --git a/chrome/browser/ui/app_list/search/files/file_result.cc b/chrome/browser/ui/app_list/search/files/file_result.cc
index de34eb7..69623df 100644
--- a/chrome/browser/ui/app_list/search/files/file_result.cc
+++ b/chrome/browser/ui/app_list/search/files/file_result.cc
@@ -9,10 +9,12 @@
 #include <vector>
 
 #include "ash/constants/ash_features.h"
+#include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_types.h"
 #include "ash/public/cpp/file_icon_util.h"
 #include "ash/public/cpp/style/color_provider.h"
 #include "base/bind.h"
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/i18n/rtl.h"
 #include "base/macros.h"
@@ -22,9 +24,13 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/ui/app_list/search/search_tags_util.h"
+#include "chrome/browser/ui/ash/thumbnail_loader.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/components/string_matching/tokenized_string_match.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/image/image_skia.h"
 
 namespace app_list {
 
@@ -228,6 +234,37 @@
   return match.relevance();
 }
 
+void FileResult::RequestThumbnail(ash::ThumbnailLoader* thumbnail_loader) {
+  // Thumbnails are only available for list results.
+  DCHECK_EQ(display_type(), DisplayType::kList);
+
+  // Request a thumbnail for all file types. For unsupported types, this will
+  // just call OnThumbnailLoaded with an error.
+  const gfx::Size size =
+      ash::SharedAppListConfig::instance().search_list_thumbnail_size();
+  thumbnail_loader->Load({filepath_, size},
+                         base::BindOnce(&FileResult::OnThumbnailLoaded,
+                                        weak_factory_.GetWeakPtr()));
+}
+
+void FileResult::OnThumbnailLoaded(const SkBitmap* bitmap,
+                                   base::File::Error error) {
+  if (!bitmap) {
+    DCHECK_NE(error, base::File::Error::FILE_OK);
+    // TODO(crbug.com/1225161): Record error metrics.
+    return;
+  }
+
+  DCHECK_EQ(error, base::File::Error::FILE_OK);
+
+  const int dimension =
+      ash::SharedAppListConfig::instance().search_list_thumbnail_dimension();
+  const auto image = gfx::ImageSkia::CreateFromBitmap(*bitmap, 1.0f);
+
+  SetIcon(ChromeSearchResult::IconInfo(image, dimension,
+                                       ash::SearchResultIconShape::kCircle));
+}
+
 ::std::ostream& operator<<(::std::ostream& os, const FileResult& result) {
   return os << "{" << result.title() << ", " << result.relevance() << "}";
 }
diff --git a/chrome/browser/ui/app_list/search/files/file_result.h b/chrome/browser/ui/app_list/search/files/file_result.h
index 2309f33..9c3ed24 100644
--- a/chrome/browser/ui/app_list/search/files/file_result.h
+++ b/chrome/browser/ui/app_list/search/files/file_result.h
@@ -7,12 +7,18 @@
 
 #include <iosfwd>
 
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
 #include "chromeos/components/string_matching/tokenized_string.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 class Profile;
+class SkBitmap;
+
+namespace ash {
+class ThumbnailLoader;
+}
 
 namespace app_list {
 
@@ -49,6 +55,11 @@
       const absl::optional<chromeos::string_matching::TokenizedString>& query,
       const base::FilePath& filepath);
 
+  // Depending on the file type and display type, request a thumbnail for this
+  // result. If the request is successful, the current icon will be replaced by
+  // the thumbnail.
+  void RequestThumbnail(ash::ThumbnailLoader* thumbnail_loader);
+
  private:
   FileResult(const std::string& schema,
              const base::FilePath& filepath,
@@ -57,9 +68,15 @@
              Type type,
              Profile* profile);
 
+  // Callback for the result of MaybeRequestThumbnail's call to the
+  // ThumbnailLoader.
+  void OnThumbnailLoaded(const SkBitmap* bitmap, base::File::Error error);
+
   const base::FilePath filepath_;
   const Type type_;
   Profile* const profile_;
+
+  base::WeakPtrFactory<FileResult> weak_factory_{this};
 };
 
 ::std::ostream& operator<<(::std::ostream& os, const FileResult& result);
diff --git a/chrome/browser/ui/app_list/search/files/file_search_provider.cc b/chrome/browser/ui/app_list/search/files/file_search_provider.cc
index ac3b75d1..f985dac 100644
--- a/chrome/browser/ui/app_list/search/files/file_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/file_search_provider.cc
@@ -91,6 +91,7 @@
 
 FileSearchProvider::FileSearchProvider(Profile* profile)
     : profile_(profile),
+      thumbnail_loader_(profile),
       root_path_(file_manager::util::GetMyFilesFolderForProfile(profile)) {
   DCHECK(profile_);
   DCHECK(!root_path_.empty());
@@ -156,9 +157,11 @@
     const double relevance) {
   const auto type = path.is_directory ? FileResult::Type::kDirectory
                                       : FileResult::Type::kFile;
-  return std::make_unique<FileResult>(kFileSearchSchema, path.path,
-                                      ash::AppListSearchResultType::kFileSearch,
-                                      last_query_, relevance, type, profile_);
+  auto result = std::make_unique<FileResult>(
+      kFileSearchSchema, path.path, ash::AppListSearchResultType::kFileSearch,
+      last_query_, relevance, type, profile_);
+  result->RequestThumbnail(&thumbnail_loader_);
+  return result;
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/file_search_provider.h b/chrome/browser/ui/app_list/search/files/file_search_provider.h
index cda1407..aa4eaac 100644
--- a/chrome/browser/ui/app_list/search/files/file_search_provider.h
+++ b/chrome/browser/ui/app_list/search/files/file_search_provider.h
@@ -13,6 +13,7 @@
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
 #include "chrome/browser/ui/app_list/search/search_provider.h"
+#include "chrome/browser/ui/ash/thumbnail_loader.h"
 #include "chromeos/components/string_matching/tokenized_string.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -63,6 +64,7 @@
       last_tokenized_query_;
 
   Profile* const profile_;
+  ash::ThumbnailLoader thumbnail_loader_;
   base::FilePath root_path_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
index 17fb2a0..2a25a0a0 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
@@ -61,7 +61,7 @@
 }  // namespace
 
 ZeroStateFileProvider::ZeroStateFileProvider(Profile* profile)
-    : profile_(profile) {
+    : profile_(profile), thumbnail_loader_(profile) {
   DCHECK(profile_);
   task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
       {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
@@ -125,10 +125,12 @@
   // Use valid results for search results.
   SearchProvider::Results new_results;
   for (const auto& filepath_score : results.first) {
-    new_results.emplace_back(std::make_unique<FileResult>(
+    auto result = std::make_unique<FileResult>(
         kZeroStateFileSchema, filepath_score.first,
         ash::AppListSearchResultType::kZeroStateFile,
-        ash::SearchResultDisplayType::kList, filepath_score.second, profile_));
+        ash::SearchResultDisplayType::kList, filepath_score.second, profile_);
+    result->RequestThumbnail(&thumbnail_loader_);
+    new_results.push_back(std::move(result));
 
     // Add suggestion chip file results
     if (app_list_features::IsSuggestedFilesEnabled() &&
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
index 2c1c7bf..626257c 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
@@ -21,6 +21,7 @@
 #include "chrome/browser/ash/file_manager/file_tasks_observer.h"
 #include "chrome/browser/ui/app_list/search/score_normalizer/score_normalizer.h"
 #include "chrome/browser/ui/app_list/search/search_provider.h"
+#include "chrome/browser/ui/ash/thumbnail_loader.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 class Profile;
@@ -60,6 +61,8 @@
   // The reference to profile to get ZeroStateFileProvider service.
   Profile* const profile_;
 
+  ash::ThumbnailLoader thumbnail_loader_;
+
   // The ranking model used to produce local file results for searches with an
   // empty query.
   std::unique_ptr<RecurrenceRanker> files_ranker_;
diff --git a/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc b/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
index a00680d..102f65e9 100644
--- a/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
@@ -9,13 +9,14 @@
 
 #include "ash/constants/ash_features.h"
 #include "base/feature_list.h"
-#include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ui/app_list/app_list_test_util.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/strings/grit/chromeos_strings.h"
 #include "components/prefs/pref_service.h"
+#include "ui/base/l10n/l10n_util.h"
 
 namespace app_list {
 namespace test {
@@ -23,14 +24,17 @@
 namespace {
 void ExpectDiscoverTabChip(ChromeSearchResult* result) {
   EXPECT_EQ("help-app://discover", result->id());
-  EXPECT_EQ("Make your own game", base::UTF16ToASCII(result->title()));
+  EXPECT_EQ(
+      l10n_util::GetStringUTF16(IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP),
+      result->title());
   EXPECT_EQ(ash::AppListSearchResultType::kHelpApp, result->result_type());
   EXPECT_EQ(ash::SearchResultDisplayType::kChip, result->display_type());
 }
 
 void ExpectReleaseNotesChip(ChromeSearchResult* result) {
   EXPECT_EQ("help-app://updates", result->id());
-  EXPECT_EQ("What's new with Chrome OS", base::UTF16ToASCII(result->title()));
+  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_HELP_APP_WHATS_NEW_SUGGESTION_CHIP),
+            result->title());
   EXPECT_EQ(ash::AppListSearchResultType::kHelpApp, result->result_type());
   EXPECT_EQ(ash::SearchResultDisplayType::kChip, result->display_type());
 }
diff --git a/chrome/browser/ui/ash/ime_controller_client_impl.h b/chrome/browser/ui/ash/ime_controller_client_impl.h
index 4b059a5..b594607 100644
--- a/chrome/browser/ui/ash/ime_controller_client_impl.h
+++ b/chrome/browser/ui/ash/ime_controller_client_impl.h
@@ -8,7 +8,7 @@
 #include "ash/public/cpp/ime_controller.h"
 #include "ash/public/cpp/ime_info.h"
 #include "base/macros.h"
-#include "chrome/browser/chromeos/input_method/ui/input_method_menu_manager.h"
+#include "chrome/browser/ash/input_method/ui/input_method_menu_manager.h"
 #include "ui/base/ime/chromeos/ime_keyboard.h"
 #include "ui/base/ime/chromeos/input_method_manager.h"
 
diff --git a/chrome/browser/ui/login/login_handler_browsertest.cc b/chrome/browser/ui/login/login_handler_browsertest.cc
index 95d946a..b924eff 100644
--- a/chrome/browser/ui/login/login_handler_browsertest.cc
+++ b/chrome/browser/ui/login/login_handler_browsertest.cc
@@ -2450,20 +2450,115 @@
     ::testing::Values(SplitAuthCacheByNetworkIsolationKey::kFalse,
                       SplitAuthCacheByNetworkIsolationKey::kTrue));
 
-IN_PROC_BROWSER_TEST_P(LoginPromptPrerenderBrowserTest,
-                       TestBasicAuthDisabledOnPrerendering) {
-  GURL initial_url = embedded_test_server()->GetURL("/title1.html");
-  ui_test_utils::NavigateToURL(browser(), initial_url);
+IN_PROC_BROWSER_TEST_P(LoginPromptPrerenderBrowserTest, CancelOnAuthRequested) {
+  base::HistogramTester histogram_tester;
 
+  // Navigate to an initial page.
+  const GURL kInitialUrl = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), kInitialUrl);
+
+  // Keep an observer for auth requests.
   NavigationController* controller = &GetWebContents()->GetController();
   LoginPromptBrowserTestObserver observer;
   observer.Register(content::Source<NavigationController>(controller));
 
-  GURL prerender_url = embedded_test_server()->GetURL(kAuthBasicPage);
-  prerender_helper().AddPrerenderAsync(prerender_url);
-  prerender_helper().WaitForPrerenderLoadCompletion(prerender_url);
-  int host_id = prerender_helper().GetHostForUrl(prerender_url);
-  EXPECT_EQ(host_id, content::RenderFrameHost::kNoFrameTreeNodeId);
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = embedded_test_server()->GetURL(kAuthBasicPage);
+  prerender_helper().AddPrerenderAsync(kPrerenderingUrl);
+  content::test::PrerenderHostRegistryObserver registry_observer(
+      *GetWebContents());
+  registry_observer.WaitForTrigger(kPrerenderingUrl);
+  int host_id = prerender_helper().GetHostForUrl(kPrerenderingUrl);
+  content::test::PrerenderHostObserver host_observer(*GetWebContents(),
+                                                     host_id);
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(prerender_helper().GetHostForUrl(kPrerenderingUrl),
+            content::RenderFrameHost::kNoFrameTreeNodeId);
+
+  // No authentication request has been prompted to the user.
+  EXPECT_EQ(0, observer.auth_needed_count());
+}
+
+IN_PROC_BROWSER_TEST_P(LoginPromptPrerenderBrowserTest,
+                       CancelOnAuthRequestedSubFrame) {
+  base::HistogramTester histogram_tester;
+
+  // Navigate to an initial page.
+  const GURL kInitialUrl = embedded_test_server()->GetURL("/title1.html");
+  ui_test_utils::NavigateToURL(browser(), kInitialUrl);
+
+  // Keep an observer for auth requests.
+  NavigationController* controller = &GetWebContents()->GetController();
+  LoginPromptBrowserTestObserver observer;
+  observer.Register(content::Source<NavigationController>(controller));
+
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = embedded_test_server()->GetURL("/title1.html");
+  int host_id = prerender_helper().AddPrerender(kPrerenderingUrl);
+  content::test::PrerenderHostObserver host_observer(*GetWebContents(),
+                                                     host_id);
+  prerender_helper().WaitForPrerenderLoadCompletion(kPrerenderingUrl);
+
+  // Fetch a subframe that requires authentication.
+  const GURL kAuthIFrameUrl = embedded_test_server()->GetURL(kAuthBasicPage);
+  content::RenderFrameHost* prerender_rfh =
+      prerender_helper().GetPrerenderedMainFrameHost(host_id);
+  ignore_result(ExecJs(prerender_rfh,
+                       "var i = document.createElement('iframe'); i.src = '" +
+                           kAuthIFrameUrl.spec() +
+                           "'; document.body.appendChild(i);"));
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(prerender_helper().GetHostForUrl(kPrerenderingUrl),
+            content::RenderFrameHost::kNoFrameTreeNodeId);
+
+  // No authentication request has been prompted to the user.
+  EXPECT_EQ(0, observer.auth_needed_count());
+}
+
+IN_PROC_BROWSER_TEST_P(LoginPromptPrerenderBrowserTest,
+                       CancelOnAuthRequestedSubResource) {
+  base::HistogramTester histogram_tester;
+
+  // Navigate to an initial page.
+  const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialUrl));
+  content::test::PrerenderHostRegistryObserver registry_observer(
+      *GetWebContents());
+
+  // Keep an observer for auth requests.
+  NavigationController* controller = &GetWebContents()->GetController();
+  LoginPromptBrowserTestObserver observer;
+  observer.Register(content::Source<NavigationController>(controller));
+
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = embedded_test_server()->GetURL("/title1.html");
+  int host_id = prerender_helper().AddPrerender(kPrerenderingUrl);
+  content::test::PrerenderHostObserver host_observer(*GetWebContents(),
+                                                     host_id);
+  prerender_helper().WaitForPrerenderLoadCompletion(kPrerenderingUrl);
+
+  ASSERT_NE(prerender_helper().GetHostForUrl(kPrerenderingUrl),
+            content::RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Fetch a subresrouce.
+  std::string fetch_subresource_script = R"(
+        const imgElement = document.createElement('img');
+        imgElement.src = '/auth-basic/favicon.gif';
+        document.body.appendChild(imgElement);
+  )";
+  ignore_result(ExecJs(prerender_helper().GetPrerenderedMainFrameHost(host_id),
+                       fetch_subresource_script));
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(prerender_helper().GetHostForUrl(kPrerenderingUrl),
+            content::RenderFrameHost::kNoFrameTreeNodeId);
+
+  // No authentication request has been prompted to the user.
   EXPECT_EQ(0, observer.auth_needed_count());
 }
 }  // namespace
diff --git a/chrome/browser/ui/views/apps/chrome_app_window_client_views_linux.cc b/chrome/browser/ui/views/apps/chrome_app_window_client_views_aura.cc
similarity index 81%
rename from chrome/browser/ui/views/apps/chrome_app_window_client_views_linux.cc
rename to chrome/browser/ui/views/apps/chrome_app_window_client_views_aura.cc
index 6fa0744..5abca79 100644
--- a/chrome/browser/ui/views/apps/chrome_app_window_client_views_linux.cc
+++ b/chrome/browser/ui/views/apps/chrome_app_window_client_views_aura.cc
@@ -4,13 +4,15 @@
 
 #include "chrome/browser/ui/apps/chrome_app_window_client.h"
 
+#include <memory>
+
 #include "chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.h"
 
 // static
 extensions::NativeAppWindow* ChromeAppWindowClient::CreateNativeAppWindowImpl(
     extensions::AppWindow* app_window,
     const extensions::AppWindow::CreateParams& params) {
-  ChromeNativeAppWindowViewsAura* window = new ChromeNativeAppWindowViewsAura;
+  auto window = std::make_unique<ChromeNativeAppWindowViewsAura>();
   window->Init(app_window, params);
-  return window;
+  return window.release();
 }
diff --git a/chrome/browser/ui/views/certificate_viewer_fuchsia.cc b/chrome/browser/ui/views/certificate_viewer_fuchsia.cc
new file mode 100644
index 0000000..c0f1065
--- /dev/null
+++ b/chrome/browser/ui/views/certificate_viewer_fuchsia.cc
@@ -0,0 +1,14 @@
+// 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/certificate_viewer.h"
+
+#include "base/notreached.h"
+
+void ShowCertificateViewer(content::WebContents* web_contents,
+                           gfx::NativeWindow parent,
+                           net::X509Certificate* cert) {
+  // TODO(crbug.com/1234748)
+  NOTIMPLEMENTED_LOG_ONCE();
+}
diff --git a/chrome/browser/ui/views/chrome_views_delegate_fuchsia.cc b/chrome/browser/ui/views/chrome_views_delegate_fuchsia.cc
new file mode 100644
index 0000000..7cacffc9
--- /dev/null
+++ b/chrome/browser/ui/views/chrome_views_delegate_fuchsia.cc
@@ -0,0 +1,13 @@
+// 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/ui/views/chrome_views_delegate.h"
+
+views::NativeWidget* ChromeViewsDelegate::CreateNativeWidget(
+    views::Widget::InitParams* params,
+    views::internal::NativeWidgetDelegate* delegate) {
+  // TODO(crbug.com/1234748)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return nullptr;
+}
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_fuchsia.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_fuchsia.cc
new file mode 100644
index 0000000..ce00774
--- /dev/null
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_fuchsia.cc
@@ -0,0 +1,18 @@
+// 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/ui/views/frame/browser_desktop_window_tree_host.h"
+
+#include "base/notreached.h"
+
+BrowserDesktopWindowTreeHost*
+BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost(
+    views::internal::NativeWidgetDelegate* native_widget_delegate,
+    views::DesktopNativeWidgetAura* desktop_native_widget_aura,
+    BrowserView* browser_view,
+    BrowserFrame* browser_frame) {
+  // TODO(crbug.com/1234748)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return nullptr;
+}
diff --git a/chrome/browser/ui/views/frame/native_browser_frame_factory_aurawin.cc b/chrome/browser/ui/views/frame/native_browser_frame_factory_aura.cc
similarity index 100%
rename from chrome/browser/ui/views/frame/native_browser_frame_factory_aurawin.cc
rename to chrome/browser/ui/views/frame/native_browser_frame_factory_aura.cc
diff --git a/chrome/browser/ui/views/status_icons/status_tray_fuchsia.cc b/chrome/browser/ui/views/status_icons/status_tray_fuchsia.cc
new file mode 100644
index 0000000..c5499b45
--- /dev/null
+++ b/chrome/browser/ui/views/status_icons/status_tray_fuchsia.cc
@@ -0,0 +1,13 @@
+// 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/status_icons/status_tray.h"
+
+#include "base/notreached.h"
+
+std::unique_ptr<StatusTray> StatusTray::Create() {
+  // TODO(crbug.com/1234769)
+  NOTIMPLEMENTED_LOG_ONCE();
+  return nullptr;
+}
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc
index b119749..64dfaa9 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc
@@ -68,6 +68,10 @@
     "Mac";
 #elif defined(OS_WIN)
     "Win";
+#elif defined(OS_FUCHSIA)
+    "Fuchsia";
+#else
+#error "Unknown platform"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Command-line switch that overrides test case input. Takes a comma
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc
index faf93244..3211e08 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -116,8 +116,8 @@
         extensions::ExtensionRegistry::Get(browser->profile())
             ->GetExtensionById(app_id,
                                extensions::ExtensionRegistry::EVERYTHING);
-    if (extension && extension->is_hosted_app()) {
-      DCHECK(!extension->from_bookmark());
+    if (extension && extension->is_hosted_app() &&
+        !extension->from_bookmark()) {
       controller =
           std::make_unique<extensions::HostedAppBrowserController>(browser);
     }
diff --git a/chrome/browser/ui/web_applications/share_target_utils.cc b/chrome/browser/ui/web_applications/share_target_utils.cc
index 125a448c..257d236 100644
--- a/chrome/browser/ui/web_applications/share_target_utils.cc
+++ b/chrome/browser/ui/web_applications/share_target_utils.cc
@@ -92,67 +92,69 @@
       data_pipe_getters;
 
   if (intent.mime_type.has_value() && intent.files.has_value()) {
-    const std::string& mime_type = intent.mime_type.value();
-    std::string name;
-    for (const apps::ShareTarget::Files& files : share_target.params.files) {
-      // Filter on MIME types. Chrome OS does not filter on file extensions.
-      // https://w3c.github.io/web-share-target/level-2/#dfn-accepted
-      if (base::ranges::any_of(
-              files.accept, [&mime_type](const auto& criteria) {
-                return !base::StartsWith(criteria, ".") &&
-                       net::MatchesMimeType(criteria, mime_type);
-              })) {
-        name = files.name;
-        break;
+    // Files for Web Share intents are created by the browser in
+    // a .WebShare directory, with generated file names and file urls - see
+    // //chrome/browser/webshare/chromeos/sharesheet_client.cc
+    for (const auto& file : intent.files.value()) {
+      const std::string& mime_type = file->mime_type.has_value()
+                                         ? file->mime_type.value()
+                                         : intent.mime_type.value();
+      std::string name;
+      for (const apps::ShareTarget::Files& files : share_target.params.files) {
+        // Filter on MIME types. Chrome OS does not filter on file extensions.
+        // https://w3c.github.io/web-share-target/level-2/#dfn-accepted
+        if (base::ranges::any_of(
+                files.accept, [&mime_type](const auto& criteria) {
+                  return !base::StartsWith(criteria, ".") &&
+                         net::MatchesMimeType(criteria, mime_type);
+                })) {
+          name = files.name;
+          break;
+        }
       }
-    }
-    if (!name.empty()) {
-      // Files for Web Share intents are created by the browser in
-      // a .WebShare directory, with generated file names and file urls - see
-      // //chrome/browser/webshare/chromeos/sharesheet_client.cc
-      for (const auto& file : intent.files.value()) {
-        storage::FileSystemContext* file_system_context =
-            file_manager::util::GetFileManagerFileSystemContext(
-                browser->profile());
-        storage::FileSystemURL file_system_url =
-            file_system_context->CrackURLInFirstPartyContext(file->url);
+      if (name.empty())
+        continue;
 
-        mojo::PendingRemote<network::mojom::DataPipeGetter> data_pipe_getter;
+      storage::FileSystemContext* file_system_context =
+          file_manager::util::GetFileManagerFileSystemContext(
+              browser->profile());
+      storage::FileSystemURL file_system_url =
+          file_system_context->CrackURLInFirstPartyContext(file->url);
+
+      mojo::PendingRemote<network::mojom::DataPipeGetter> data_pipe_getter;
+      if (!file_system_url.is_valid()) {
+        // TODO(crbug.com/1166982): We could be more intelligent here and
+        // decide which cracking method to use based on the scheme.
+        auto file_system_url_and_handle =
+            arc::ShareInfoFileHandler::GetFileSystemURL(browser->profile(),
+                                                        file->url);
+        file_system_url = file_system_url_and_handle.url;
         if (!file_system_url.is_valid()) {
-          // TODO(crbug.com/1166982): We could be more intelligent here and
-          // decide which cracking method to use based on the scheme.
-          auto file_system_url_and_handle =
-              arc::ShareInfoFileHandler::GetFileSystemURL(browser->profile(),
-                                                          file->url);
-          file_system_url = file_system_url_and_handle.url;
-          if (!file_system_url.is_valid()) {
-            LOG(WARNING) << "Received unexpected file URL: "
-                         << file->url.spec();
-            continue;
-          }
-
-          mojo::MakeSelfOwnedReceiver(
-              std::make_unique<FileStreamDataPipeGetter>(
-                  /*context=*/file_system_context,
-                  /*url=*/file_system_url,
-                  /*offset=*/0,
-                  /*file_size=*/file->file_size,
-                  /*buf_size=*/kBufSize),
-              data_pipe_getter.InitWithNewPipeAndPassReceiver());
+          LOG(WARNING) << "Received unexpected file URL: " << file->url.spec();
+          continue;
         }
 
-        const std::string filename =
-            (file->file_name.has_value() && !file->file_name->empty())
-                ? (*file->file_name)
-                : file_system_url.path().BaseName().AsUTF8Unsafe();
-
-        names.push_back(name);
-        values.push_back(file_system_url.path().AsUTF8Unsafe());
-        is_value_file_uris.push_back(true);
-        filenames.push_back(filename);
-        types.push_back(mime_type);
-        data_pipe_getters.push_back(std::move(data_pipe_getter));
+        mojo::MakeSelfOwnedReceiver(
+            std::make_unique<FileStreamDataPipeGetter>(
+                /*context=*/file_system_context,
+                /*url=*/file_system_url,
+                /*offset=*/0,
+                /*file_size=*/file->file_size,
+                /*buf_size=*/kBufSize),
+            data_pipe_getter.InitWithNewPipeAndPassReceiver());
       }
+
+      const std::string filename =
+          (file->file_name.has_value() && !file->file_name->empty())
+              ? (*file->file_name)
+              : file_system_url.path().BaseName().AsUTF8Unsafe();
+
+      names.push_back(name);
+      values.push_back(file_system_url.path().AsUTF8Unsafe());
+      is_value_file_uris.push_back(true);
+      filenames.push_back(filename);
+      types.push_back(mime_type);
+      data_pipe_getters.push_back(std::move(data_pipe_getter));
     }
   }
 
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index 269947f0..06121df 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -952,7 +952,13 @@
 }
 
 #if defined(OS_MAC) || defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ShortcutIconCorrectColor) {
+// crbug.com/1235246: Disable the test on Windows due to a consistent failure.
+#if defined(OS_WIN)
+#define MAYBE_ShortcutIconCorrectColor DISABLED_ShortcutIconCorrectColor
+#else
+#define MAYBE_ShortcutIconCorrectColor ShortcutIconCorrectColor
+#endif
+IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, MAYBE_ShortcutIconCorrectColor) {
   os_hooks_suppress_.reset();
   base::ScopedAllowBlockingForTesting allow_blocking;
 
diff --git a/chrome/browser/ui/web_applications/web_share_target_browsertest.cc b/chrome/browser/ui/web_applications/web_share_target_browsertest.cc
index 0b47f323..f158f87 100644
--- a/chrome/browser/ui/web_applications/web_share_target_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_share_target_browsertest.cc
@@ -370,6 +370,31 @@
   EXPECT_EQ(NumRecentFiles(web_contents), 0U);
 }
 
+IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareImage) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL app_url =
+      embedded_test_server()->GetURL("/web_share_target/multimedia.html");
+  const AppId app_id = web_app::InstallWebAppFromManifest(browser(), app_url);
+  sharesheet::SharesheetService::SetSelectedAppForTesting(
+      base::UTF8ToUTF16(app_id));
+
+  content::WebContents* web_contents = ShareToTarget("share_single_file()");
+  EXPECT_EQ(std::string(12, '*'), ReadTextContent(web_contents, "image"));
+}
+
+IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareMultimedia) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL app_url =
+      embedded_test_server()->GetURL("/web_share_target/multimedia.html");
+  const AppId app_id = web_app::InstallWebAppFromManifest(browser(), app_url);
+  sharesheet::SharesheetService::SetSelectedAppForTesting(
+      base::UTF8ToUTF16(app_id));
+
+  content::WebContents* web_contents = ShareToTarget("share_multiple_files()");
+  EXPECT_EQ(std::string(345, '*'), ReadTextContent(web_contents, "audio"));
+  EXPECT_EQ(std::string(67890, '*'), ReadTextContent(web_contents, "video"));
+}
+
 IN_PROC_BROWSER_TEST_F(WebShareTargetBrowserTest, ShareToPartialWild) {
   ASSERT_TRUE(embedded_test_server()->Start());
   const GURL app_url =
diff --git a/chrome/browser/ui/webui/settings/settings_utils_fuchsia.cc b/chrome/browser/ui/webui/settings/settings_utils_fuchsia.cc
new file mode 100644
index 0000000..4f9a345
--- /dev/null
+++ b/chrome/browser/ui/webui/settings/settings_utils_fuchsia.cc
@@ -0,0 +1,16 @@
+// Copyright 2016 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/ui/webui/settings/settings_utils.h"
+
+#include "base/notreached.h"
+
+namespace settings_utils {
+
+void ShowNetworkProxySettings(content::WebContents* web_contents) {
+  // TODO(crbug.com/1234748)
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
+}  // namespace settings_utils
diff --git a/chrome/browser/web_applications/components/web_app_helpers.h b/chrome/browser/web_applications/components/web_app_helpers.h
index 55cec6b..7094189 100644
--- a/chrome/browser/web_applications/components/web_app_helpers.h
+++ b/chrome/browser/web_applications/components/web_app_helpers.h
@@ -50,7 +50,6 @@
     const GURL& start_url);
 
 AppId GenerateAppIdFromManifest(const blink::Manifest& manifest);
-std::string GenerateAppKeyFromURL(const GURL& url);
 
 // Returns whether the given |app_url| is a valid web app url.
 bool IsValidWebAppUrl(const GURL& app_url);
diff --git a/chrome/browser/web_applications/web_app_helpers.cc b/chrome/browser/web_applications/web_app_helpers.cc
index be42f58..1f0836ac 100644
--- a/chrome/browser/web_applications/web_app_helpers.cc
+++ b/chrome/browser/web_applications/web_app_helpers.cc
@@ -47,10 +47,6 @@
   return app_name.substr(prefix.length());
 }
 
-static std::string GenerateAppHashFromURL(const GURL& url) {
-  return crypto::SHA256HashString(url.spec());
-}
-
 std::string GenerateAppIdUnhashed(
     const absl::optional<std::string>& manifest_id,
     const GURL& start_url) {
@@ -79,23 +75,6 @@
       manifest.start_url);
 }
 
-// Generate the public key for the fake extension that we synthesize to contain
-// a web app.
-//
-// Web apps are not signed, but the public key for an extension doubles as
-// its unique identity, and we need one of those. A web app's unique identity
-// is its manifest URL, so we hash that (*) to create a public key. There will
-// be no corresponding private key, which means that these extensions cannot be
-// auto-updated using ExtensionUpdater.
-//
-// (*) The comment above says that we hash the manifest URL, but in practice,
-// it seems that we hash the start URL.
-std::string GenerateAppKeyFromURL(const GURL& url) {
-  std::string key;
-  base::Base64Encode(GenerateAppHashFromURL(url), &key);
-  return key;
-}
-
 bool IsValidWebAppUrl(const GURL& app_url) {
   if (app_url.is_empty() || app_url.inner_url())
     return false;
diff --git a/chrome/browser/webshare/chromeos/sharesheet_client.cc b/chrome/browser/webshare/chromeos/sharesheet_client.cc
index 826abb84..f99e6c1 100644
--- a/chrome/browser/webshare/chromeos/sharesheet_client.cc
+++ b/chrome/browser/webshare/chromeos/sharesheet_client.cc
@@ -137,8 +137,8 @@
   if (current_share_->files.empty()) {
     GetSharesheetCallback().Run(
         web_contents(), current_share_->file_paths,
-        current_share_->content_types, current_share_->text,
-        current_share_->title,
+        current_share_->content_types, current_share_->file_sizes,
+        current_share_->text, current_share_->title,
         base::BindOnce(&SharesheetClient::OnShowSharesheet,
                        weak_ptr_factory_.GetWeakPtr()));
     return;
@@ -173,6 +173,7 @@
     current_share_->content_types.push_back(file->blob->content_type);
     current_share_->file_paths.push_back(
         GenerateFileName(current_share_->directory, file->name));
+    current_share_->file_sizes.push_back(file->blob->size);
   }
 
   std::unique_ptr<StoreFilesTask> store_files_task =
@@ -201,7 +202,7 @@
 
   GetSharesheetCallback().Run(
       web_contents(), current_share_->file_paths, current_share_->content_types,
-      current_share_->text, current_share_->title,
+      current_share_->file_sizes, current_share_->text, current_share_->title,
       base::BindOnce(&SharesheetClient::OnShowSharesheet,
                      weak_ptr_factory_.GetWeakPtr()));
 }
@@ -222,9 +223,12 @@
     content::WebContents* web_contents,
     const std::vector<base::FilePath>& file_paths,
     const std::vector<std::string>& content_types,
+    const std::vector<uint64_t>& file_sizes,
     const std::string& text,
     const std::string& title,
     DeliveredCallback delivered_callback) {
+  DCHECK_EQ(file_paths.size(), content_types.size());
+  DCHECK_EQ(file_paths.size(), file_sizes.size());
   if (!base::FeatureList::IsEnabled(features::kSharesheet)) {
     std::move(delivered_callback).Run(sharesheet::SharesheetResult::kCancel);
     return;
@@ -241,6 +245,12 @@
       file_paths.empty() ? apps_util::CreateShareIntentFromText(text, title)
                          : apps_util::CreateShareIntentFromFiles(
                                profile, file_paths, content_types, text, title);
+  if (intent->files.has_value() && intent->files->size() == file_paths.size()) {
+    for (size_t index = 0; index < file_paths.size(); ++index) {
+      (*intent->files)[index]->mime_type = content_types[index];
+      (*intent->files)[index]->file_size = file_sizes[index];
+    }
+  }
   sharesheet_service->ShowBubble(
       web_contents, std::move(intent),
       sharesheet::SharesheetMetrics::LaunchSource::kWebShare,
diff --git a/chrome/browser/webshare/chromeos/sharesheet_client.h b/chrome/browser/webshare/chromeos/sharesheet_client.h
index d0b78e3..718694e 100644
--- a/chrome/browser/webshare/chromeos/sharesheet_client.h
+++ b/chrome/browser/webshare/chromeos/sharesheet_client.h
@@ -32,6 +32,7 @@
       content::WebContents* web_contents,
       const std::vector<base::FilePath>& file_paths,
       const std::vector<std::string>& content_types,
+      const std::vector<uint64_t>& file_sizes,
       const std::string& text,
       const std::string& title,
       DeliveredCallback delivered_callback)>;
@@ -59,6 +60,7 @@
   static void ShowSharesheet(content::WebContents* web_contents,
                              const std::vector<base::FilePath>& file_paths,
                              const std::vector<std::string>& content_types,
+                             const std::vector<uint64_t>& file_sizes,
                              const std::string& text,
                              const std::string& title,
                              DeliveredCallback delivered_callback);
@@ -80,6 +82,7 @@
     base::FilePath directory;
     std::vector<base::FilePath> file_paths;
     std::vector<std::string> content_types;
+    std::vector<uint64_t> file_sizes;
     std::string text;
     std::string title;
     blink::mojom::ShareService::ShareCallback callback;
diff --git a/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc b/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc
index 2635004..e43b39d2 100644
--- a/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc
+++ b/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc
@@ -70,6 +70,7 @@
                 content::WebContents* in_contents,
                 const std::vector<base::FilePath>& file_paths,
                 const std::vector<std::string>& content_types,
+                const std::vector<uint64_t>& file_sizes,
                 const std::string& text, const std::string& title,
                 SharesheetClient::DeliveredCallback delivered_callback) {
               EXPECT_EQ(text, expected_text);
@@ -102,7 +103,8 @@
           content::WebContents* in_contents,
           const std::vector<base::FilePath>& in_file_paths,
           const std::vector<std::string>& content_types,
-          const std::string& text, const std::string& title,
+          const std::vector<uint64_t>& file_sizes, const std::string& text,
+          const std::string& title,
           SharesheetClient::DeliveredCallback delivered_callback) {
         EXPECT_EQ(contents, in_contents);
 
@@ -145,6 +147,7 @@
                 content::WebContents* in_contents,
                 const std::vector<base::FilePath>& in_file_paths,
                 const std::vector<std::string>& content_types,
+                const std::vector<uint64_t>& file_sizes,
                 const std::string& text, const std::string& title,
                 SharesheetClient::DeliveredCallback delivered_callback) {
               EXPECT_EQ(contents, in_contents);
@@ -174,7 +177,8 @@
   SharesheetClient::SetSharesheetCallbackForTesting(base::BindLambdaForTesting(
       [](content::WebContents* in_contents,
          const std::vector<base::FilePath>& file_paths,
-         const std::vector<std::string>& content_types, const std::string& text,
+         const std::vector<std::string>& content_types,
+         const std::vector<uint64_t>& file_sizes, const std::string& text,
          const std::string& title,
          SharesheetClient::DeliveredCallback delivered_callback) {
         std::move(delivered_callback)
diff --git a/chrome/browser/webshare/chromeos/sharesheet_client_unittest.cc b/chrome/browser/webshare/chromeos/sharesheet_client_unittest.cc
index db45573..45f5e23 100644
--- a/chrome/browser/webshare/chromeos/sharesheet_client_unittest.cc
+++ b/chrome/browser/webshare/chromeos/sharesheet_client_unittest.cc
@@ -67,6 +67,7 @@
       content::WebContents* web_contents,
       const std::vector<base::FilePath>& file_paths,
       const std::vector<std::string>& content_types,
+      const std::vector<uint64_t>& file_sizes,
       const std::string& text,
       const std::string& title,
       sharesheet::DeliveredCallback delivered_callback) {
diff --git a/chrome/browser/webshare/share_service_browsertest.cc b/chrome/browser/webshare/share_service_browsertest.cc
index 2bff49e..17c583a 100644
--- a/chrome/browser/webshare/share_service_browsertest.cc
+++ b/chrome/browser/webshare/share_service_browsertest.cc
@@ -60,6 +60,7 @@
       content::WebContents* web_contents,
       const std::vector<base::FilePath>& file_paths,
       const std::vector<std::string>& content_types,
+      const std::vector<uint64_t>& file_sizes,
       const std::string& text,
       const std::string& title,
       sharesheet::DeliveredCallback delivered_callback) {
diff --git a/chrome/browser/webshare/share_service_unittest.cc b/chrome/browser/webshare/share_service_unittest.cc
index 4c8a50fb..349c2b68 100644
--- a/chrome/browser/webshare/share_service_unittest.cc
+++ b/chrome/browser/webshare/share_service_unittest.cc
@@ -109,6 +109,7 @@
     auto blob = blink::mojom::SerializedBlob::New();
     blob->uuid = uuid;
     blob->content_type = content_type;
+    blob->size = file_length;
 
     base::RunLoop run_loop;
     auto blob_context_getter = browser_context()->GetBlobStorageContext();
@@ -143,6 +144,7 @@
       content::WebContents* web_contents,
       const std::vector<base::FilePath>& file_paths,
       const std::vector<std::string>& content_types,
+      const std::vector<uint64_t>& file_sizes,
       const std::string& text,
       const std::string& title,
       sharesheet::DeliveredCallback delivered_callback) {
diff --git a/chrome/browser/webshare/store_file_task.cc b/chrome/browser/webshare/store_file_task.cc
index df9e042..54a0632 100644
--- a/chrome/browser/webshare/store_file_task.cc
+++ b/chrome/browser/webshare/store_file_task.cc
@@ -133,7 +133,8 @@
                                      uint64_t expected_content_size) {
   DCHECK_EQ(total_size, expected_content_size);
 
-  if (expected_content_size > available_space_) {
+  if (expected_content_size > available_space_ ||
+      expected_content_size != file_->blob->size) {
     VLOG(1) << "Share too large: " << expected_content_size << " bytes";
     std::move(callback_).Run(blink::mojom::ShareError::PERMISSION_DENIED);
     return;
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index 4bea5040..d95f15c2 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -295,7 +295,10 @@
   }
 
   if (is_chromeos_ash) {
-    deps += [ "//ash/constants" ]
+    deps += [
+      "//ash/constants",
+      "//ash/webui/file_manager:constants",
+    ]
   }
 
   if (enable_widevine_cdm_component) {
diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS
index 97c2ece..57139456 100644
--- a/chrome/renderer/DEPS
+++ b/chrome/renderer/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+ash/webui/file_manager/url_constants.h",
   "+chrome/grit",
   "+components/autofill/content/common",
   "+components/autofill/content/renderer",
diff --git a/chrome/renderer/chrome_content_settings_agent_delegate.cc b/chrome/renderer/chrome_content_settings_agent_delegate.cc
index b67302b..d29535d 100644
--- a/chrome/renderer/chrome_content_settings_agent_delegate.cc
+++ b/chrome/renderer/chrome_content_settings_agent_delegate.cc
@@ -4,8 +4,12 @@
 
 #include "chrome/renderer/chrome_content_settings_agent_delegate.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/webui/file_manager/url_constants.h"
+#endif
 #include "base/containers/contains.h"
 #include "chrome/common/ssl_insecure_content.h"
+#include "content/public/common/url_constants.h"
 #include "content/public/renderer/render_frame.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 
@@ -78,6 +82,10 @@
           extensions::mojom::APIPermissionID::kClipboardRead)) {
     return true;
   }
+
+  if (IsAllowListedSystemWebApp()) {
+    return true;
+  }
 #endif
   return absl::nullopt;
 }
@@ -139,6 +147,20 @@
 #endif
 }
 
+bool ChromeContentSettingsAgentDelegate::IsAllowListedSystemWebApp() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  blink::WebLocalFrame* frame = render_frame_->GetWebFrame();
+  blink::WebSecurityOrigin origin = frame->GetDocument().GetSecurityOrigin();
+  // TODO(crbug.com/1233395): Migrate Files SWA to Clipboard API and remove this
+  // allow-list.
+  if (origin.Protocol().Ascii() == ::content::kChromeUIScheme &&
+      origin.Host().Utf8() == ::ash::file_manager::kChromeUIFileManagerHost) {
+    return true;
+  }
+#endif
+  return false;
+}
+
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 const extensions::Extension* ChromeContentSettingsAgentDelegate::GetExtension(
     const blink::WebSecurityOrigin& origin) const {
diff --git a/chrome/renderer/chrome_content_settings_agent_delegate.h b/chrome/renderer/chrome_content_settings_agent_delegate.h
index 56d90c3..8c7eaadf 100644
--- a/chrome/renderer/chrome_content_settings_agent_delegate.h
+++ b/chrome/renderer/chrome_content_settings_agent_delegate.h
@@ -52,6 +52,9 @@
   // Whether the observed RenderFrame is for a platform app.
   bool IsPlatformApp();
 
+  // Whether the observed RenderFrame is an allow-listed System Web App.
+  bool IsAllowListedSystemWebApp();
+
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   // If |origin| corresponds to an installed extension, returns that extension.
   // Otherwise returns null.
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java
index b2342c2b..2cb7e029 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java
@@ -7,6 +7,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
+import org.chromium.chrome.browser.tabmodel.IncognitoTabModel;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorBase;
@@ -37,6 +38,17 @@
         if (incognitoTabCount > 0) TabModelUtils.setIndex(getModel(true), 0);
     }
 
+    /**
+     * Exposed to allow tests to initialize the selector with different tab models.
+     * @param normalModel The normal tab model.
+     * @param incognitoModel The incognito tab model.
+     */
+    public void initializeTabModels(TabModel normalModel, IncognitoTabModel incognitoModel) {
+        destroy();
+        getTabModelFilterProvider().resetTabModelFilterListForTesting();
+        initialize(normalModel, incognitoModel);
+    }
+
     private static int nextIdOffset() {
         return sCurTabOffset++;
     }
diff --git a/chrome/test/data/web_share_target/multimedia.html b/chrome/test/data/web_share_target/multimedia.html
new file mode 100644
index 0000000..adcacdf
--- /dev/null
+++ b/chrome/test/data/web_share_target/multimedia.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <link rel="manifest" href="multimedia.json">
+  <link rel="icon" href="basic-48.png">
+</head>
+<body>
+  <h1>Multimedia web app</h1>
+  <script>
+    window.onload = () => {
+      navigator.serviceWorker.register('/web_share_target/service_worker.js');
+    };
+  </script>
+</body>
+</html>
diff --git a/chrome/test/data/web_share_target/multimedia.json b/chrome/test/data/web_share_target/multimedia.json
new file mode 100644
index 0000000..d955dec
--- /dev/null
+++ b/chrome/test/data/web_share_target/multimedia.json
@@ -0,0 +1,43 @@
+{
+  "name": "Multimedia web app",
+  "icons": [
+    {
+      "src": "basic-48.png",
+      "sizes": "48x48",
+      "type": "image/png"
+    },
+    {
+      "src": "basic-192.png",
+      "sizes": "192x192",
+      "type": "image/png"
+    }
+  ],
+  "start_url": "multimedia.html",
+  "display": "minimal-ui",
+
+  "share_target": {
+    "action": "/web_share_target/share.html",
+    "method": "POST",
+    "enctype": "multipart/form-data",
+    "params": {
+      "files": [
+        {
+          "name": "audio",
+          "accept": ["audio/*"]
+        },
+        {
+          "name": "image",
+          "accept": ["image/*"]
+        },
+        {
+          "name": "video",
+          "accept": ["video/*"]
+        },
+        {
+          "name": "notes",
+          "accept": ["*/*"]
+        }
+      ]
+    }
+  }
+}
diff --git a/chrome/test/data/web_share_target/service_worker.js b/chrome/test/data/web_share_target/service_worker.js
index 426bded..9be148c 100644
--- a/chrome/test/data/web_share_target/service_worker.js
+++ b/chrome/test/data/web_share_target/service_worker.js
@@ -37,7 +37,7 @@
       headers: {'Content-Type': 'text/html'}
     };
 
-    const file_fields = ['records', 'graphs', 'notes'];
+    const file_fields = ['records', 'graphs', 'notes', 'audio', 'image', 'video'];
 
     let field_index = 0;
     let files = undefined;
diff --git a/chrome/test/data/web_share_target/share.template.html b/chrome/test/data/web_share_target/share.template.html
index 9045c98..cc176d1 100644
--- a/chrome/test/data/web_share_target/share.template.html
+++ b/chrome/test/data/web_share_target/share.template.html
@@ -15,5 +15,9 @@
   <section id="records">{{records}}</section>
   <section id="graphs">{{graphs}}</section>
   <section id="notes">{{notes}}</section>
+
+  <section id="audio">{{audio}}</section>
+  <section id="image">{{image}}</section>
+  <section id="video">{{video}}</section>
 </body>
 </html>
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index a5016d38..649a8c2 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -329,17 +329,17 @@
       <message name="IDS_HELP_APP_PERKS" desc="Name of a tab in the Help app that offers users additional perks like apps or drive storage space.">
         Perks
       </message>
-      <message name="IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP" desc="Text for the suggestion chip to view a magazine showing the user how they could build/code/develop a game. [CHAR_LIMIT=24]">
-        Make your own game
+      <message name="IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP" desc="Text for the suggestion chip to view a magazine showing the user tools they can use for art and design on a Chromebook. [CHAR_LIMIT=24]">
+        Discover design tools
       </message>
       <message name="IDS_HELP_APP_WHATS_NEW_SUGGESTION_CHIP" desc="Text for the suggestion chip to view updated patch notes are available. [CHAR_LIMIT=24]">
         What's new with Chrome OS
       </message>
-      <message name="IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE" desc="Title for a notification that points to the Help app's Discover tab, which features a magazine to teach users how they can create games with Chrome OS.">
-        Design and build your own games
+      <message name="IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE" desc="Title for a notification that points to the Help app's Discover tab, which features a magazine to teach users how they can use their Chromebooks for art and design.">
+        Discover new drawing and design tools
       </message>
-      <message name="IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE" desc="Message on a notification that points to the Help app's Discover tab, which features a magazine to teach users how they can create games with Chrome OS.">
-        Learn from a game creator, get game design apps, and more
+      <message name="IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE" desc="Message on a notification that points to the Help app's Discover tab, which features a magazine to teach users how they can use their Chromebooks for art and design.">
+        Check out Chromebook's new digital magazine for creators
       </message>
 
       <!-- Media App -->
diff --git a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE.png.sha1
index 9de0c7b80..0ef8f71 100644
--- a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_MESSAGE.png.sha1
@@ -1 +1 @@
-673f00fa2e76cb8f4ac3ceadf24ef30012a62aa0
\ No newline at end of file
+0919c89f84390fa4728530dd5627535322f43f2f
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE.png.sha1
index 9de0c7b80..0ef8f71 100644
--- a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_NOTIFICATION_TITLE.png.sha1
@@ -1 +1 @@
-673f00fa2e76cb8f4ac3ceadf24ef30012a62aa0
\ No newline at end of file
+0919c89f84390fa4728530dd5627535322f43f2f
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1 b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
index 11bb390..c91f553 100644
--- a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
@@ -1 +1 @@
-aceea7866d2030a9788e4b3666a128f994b563fd
\ No newline at end of file
+81778a7e263ac5d2df488e4d8269b70c2e59b7dd
\ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/js/device/stream_manager.js b/chromeos/components/camera_app_ui/resources/js/device/stream_manager.js
index bcc2723b..9e0ec9f 100644
--- a/chromeos/components/camera_app_ui/resources/js/device/stream_manager.js
+++ b/chromeos/components/camera_app_ui/resources/js/device/stream_manager.js
@@ -176,7 +176,7 @@
   /**
    * Registers listener to be called when state of available real devices
    * changes.
-   * @param {function(!Array<!DeviceInfo>)} listener
+   * @param {function(!Array<!DeviceInfo>): !Promise} listener
    */
   addRealDeviceChangeListener(listener) {
     this.realListeners_.push(listener);
diff --git a/chromeos/components/camera_app_ui/resources/js/error.js b/chromeos/components/camera_app_ui/resources/js/error.js
index 89bf54d5..b67dbbe 100644
--- a/chromeos/components/camera_app_ui/resources/js/error.js
+++ b/chromeos/components/camera_app_ui/resources/js/error.js
@@ -82,17 +82,13 @@
 /**
  * Gets formatted string stack from error.
  * @param {!Error} error
+ * @param {?Array<!StackFrame>} frames
  * @return {string}
  */
-function formatErrorStack(error) {
-  if (typeof error.stack === 'string') {
-    return error.stack;
-  }
-  const frames = error.stack || /** @type {!Array<!StackFrame>} */ ([]);
-
+function formatErrorStack(error, frames) {
   const errorDesc = getErrorDescription(error);
   return errorDesc +
-      frames
+      (frames || [])
           .map(({fileName, funcName, lineNo, colNo}) => {
             let position = '';
             if (lineNo !== -1) {
@@ -159,7 +155,7 @@
   }
   triggeredErrorSet.add(hash);
 
-  const stackStr = formatErrorStack(error);
+  const stackStr = formatErrorStack(error, frames);
   if (appWindow !== null) {
     appWindow.reportError({
       type,
diff --git a/chromeos/components/camera_app_ui/resources/js/externs/types.d.ts b/chromeos/components/camera_app_ui/resources/js/externs/types.d.ts
index 15cb9e5..5626406 100644
--- a/chromeos/components/camera_app_ui/resources/js/externs/types.d.ts
+++ b/chromeos/components/camera_app_ui/resources/js/externs/types.d.ts
@@ -149,3 +149,8 @@
   getLineNumber(): number|undefined;
   getColumnNumber(): number|undefined;
 }
+
+// v8 specific stack trace customizing, see https://v8.dev/docs/stack-trace-api
+interface ErrorConstructor {
+  prepareStackTrace(error: Error, structuredStackTrace: CallSite[]): void;
+}
diff --git a/chromeos/components/camera_app_ui/resources/js/h264.js b/chromeos/components/camera_app_ui/resources/js/h264.js
index afa1b1a..055c9de 100644
--- a/chromeos/components/camera_app_ui/resources/js/h264.js
+++ b/chromeos/components/camera_app_ui/resources/js/h264.js
@@ -97,22 +97,21 @@
  * @type {!Map<!Level, !LevelLimit>}
  */
 const levelLimits = (() => {
-  const limit =
-      (level, processRate, frameSize,
-       mainBitrate) => [level, {processRate, frameSize, mainBitrate}];
+  const limit = (processRate, frameSize, mainBitrate) =>
+      ({processRate, frameSize, mainBitrate});
   return new Map([
-    limit(Level.LV30, 40500, 1620, 10000),
-    limit(Level.LV31, 108000, 3600, 14000),
-    limit(Level.LV32, 216000, 5120, 20000),
-    limit(Level.LV40, 245760, 8192, 20000),
-    limit(Level.LV41, 245760, 8192, 50000),
-    limit(Level.LV42, 522240, 8704, 50000),
-    limit(Level.LV50, 589824, 22080, 135000),
-    limit(Level.LV51, 983040, 36864, 240000),
-    limit(Level.LV52, 2073600, 36864, 240000),
-    limit(Level.LV60, 4177920, 139264, 240000),
-    limit(Level.LV61, 8355840, 139264, 480000),
-    limit(Level.LV62, 16711680, 139264, 800000),
+    [Level.LV30, limit(40500, 1620, 10000)],
+    [Level.LV31, limit(108000, 3600, 14000)],
+    [Level.LV32, limit(216000, 5120, 20000)],
+    [Level.LV40, limit(245760, 8192, 20000)],
+    [Level.LV41, limit(245760, 8192, 50000)],
+    [Level.LV42, limit(522240, 8704, 50000)],
+    [Level.LV50, limit(589824, 22080, 135000)],
+    [Level.LV51, limit(983040, 36864, 240000)],
+    [Level.LV52, limit(2073600, 36864, 240000)],
+    [Level.LV60, limit(4177920, 139264, 240000)],
+    [Level.LV61, limit(8355840, 139264, 480000)],
+    [Level.LV62, limit(16711680, 139264, 800000)],
   ]);
 })();
 
diff --git a/chromeos/crosapi/mojom/app_service.mojom b/chromeos/crosapi/mojom/app_service.mojom
index c96d7ea..37b652b 100644
--- a/chromeos/crosapi/mojom/app_service.mojom
+++ b/chromeos/crosapi/mojom/app_service.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 8
+// Next MinVersion: 9
 
 module crosapi.mojom;
 
@@ -101,3 +101,22 @@
       string app_id,
       WindowMode window_mode);
 };
+
+// Interacts with the app service. Implemented in ash-chrome and called in
+// lacros-chrome. This interface will allow the browser to interact with
+// all types of apps installed in Chrome OS.
+[Stable, Uuid="a8979226-04ab-4c29-bca6-1b487ca769f7"]
+interface AppServiceProxy {
+  // Lacros exposes an AppServiceSubscriber interface to Ash. This allows Ash
+  // to update the info for apps that registered in app service.
+  [MinVersion=8]
+  RegisterAppServiceSubscriber@0(
+      pending_remote<AppServiceSubscriber> subscriber);
+};
+
+// Interacts with the app service. Implemented in lacros-chrome and called in
+// ash-chrome. This interface will allow the app service to push updates to
+// the lacros-chrome so that the browser can access the app service info
+// in the same process.
+[Stable, Uuid="d77d3b7e-ef90-4615-b81b-7e43482a4d5e"]
+interface AppServiceSubscriber {};
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index d215221..17e7895 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -88,6 +88,12 @@
   [MinVersion=4]
   BindAccountManager@7(pending_receiver<AccountManager> receiver);
 
+  // Bind the app service proxy, which allows the Lacros Browser to
+  // interact with all apps installed in App Service in ash-chrome.
+  // Added in M93.
+  [MinVersion=40]
+  BindAppServiceProxy@45(pending_receiver<AppServiceProxy> receiver);
+
   // Binds the BrowserServiceHost interface to prepare registering
   // a BrowserService to crosapi.
   // This is a part of lacros-chrome bootstrap sequence. First, Crosapi
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc
index 758c7d8..c9e9acfa 100644
--- a/chromeos/lacros/lacros_service.cc
+++ b/chromeos/lacros/lacros_service.cc
@@ -191,6 +191,9 @@
   ConstructRemote<
       crosapi::mojom::AutomationFactory, &Crosapi::BindAutomationFactory,
       Crosapi::MethodMinVersions::kBindAutomationFactoryMinVersion>();
+  ConstructRemote<crosapi::mojom::AppServiceProxy,
+                  &Crosapi::BindAppServiceProxy,
+                  Crosapi::MethodMinVersions::kBindAppServiceProxyMinVersion>();
   ConstructRemote<
       crosapi::mojom::BrowserServiceHost, &Crosapi::BindBrowserServiceHost,
       Crosapi::MethodMinVersions::kBindBrowserServiceHostMinVersion>();
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index c3498ceb..d94ebf9f8 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-93-4577.5-1627292532-benchmark-93.0.4577.20-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-93-4577.5-1627292532-benchmark-93.0.4577.21-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index b341429..0cd1fc8 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -120,6 +120,7 @@
 <translation id="3532980081107202182">About <ph name="MIN_REMAINING" /> minutes remaining</translation>
 <translation id="3540383942695635079">MAC address</translation>
 <translation id="357889014807611375">metered Wi-Fi</translation>
+<translation id="3582041541988388905">No <ph name="NETWORK_NAME" /> connection detected</translation>
 <translation id="3595596368722241419">Battery full</translation>
 <translation id="360565022852130722">Wi-Fi network is secured with weak protocol WEP 802.1x</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> test</translation>
@@ -130,6 +131,7 @@
 <translation id="38114475217616659">Clear all history</translation>
 <translation id="3820172043799983114">Invalid PIN.</translation>
 <translation id="3838338534323494292">New password</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="3865414814144988605">Resolution</translation>
 <translation id="387301095347517405">The number of times that your battery has gone through a full charging cycle</translation>
 <translation id="3941014780699102620">Failed to resolve host</translation>
@@ -375,6 +377,7 @@
 <translation id="8214184102975786227">Scan multiple pages to one PDF</translation>
 <translation id="8230672074305416752">Failed to ping the default network gateway</translation>
 <translation id="8246209727385807362">Unknown operator</translation>
+<translation id="8286154143153872371">Please connect to a network and reload the page to view wallpaper.</translation>
 <translation id="8291967909914612644">Home provider country</translation>
 <translation id="8294431847097064396">Source</translation>
 <translation id="8297006494302853456">Weak</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index a572c62..0d4d6ae 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -120,6 +120,7 @@
 <translation id="3532980081107202182">මිනිත්තු <ph name="MIN_REMAINING" />ක් පමණ ඉතිරිය</translation>
 <translation id="3540383942695635079">MAC ලිපිනය</translation>
 <translation id="357889014807611375">මනුගත Wi-Fi</translation>
+<translation id="3582041541988388905"><ph name="NETWORK_NAME" /> සම්බන්ධතාවයක් අනාවරණය කර නොගැනිණි</translation>
 <translation id="3595596368722241419">බැටරිය ආරෝපිතයි</translation>
 <translation id="360565022852130722">WiFi ජාලය දුර්වල ප්‍රොටොකෝලයකින් ආරක්ෂිතයි WEP 802.1x</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> පරීක්ෂණය</translation>
@@ -130,6 +131,7 @@
 <translation id="38114475217616659">සියලු ඉතිහාසය හිස් කරන්න</translation>
 <translation id="3820172043799983114">වලංගු නොවන PIN.</translation>
 <translation id="3838338534323494292">නව මුරපදය</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3865414814144988605">විභේදනය</translation>
 <translation id="387301095347517405">ඔබගේ බැටරිය පූර්ණ ආරෝපණ චක්‍රයක් හරහා ගිය වාර ගණන</translation>
 <translation id="3941014780699102620">සත්කාරක විසඳීම අසාර්ථක විය</translation>
@@ -375,6 +377,7 @@
 <translation id="8214184102975786227">එක් PDF එකකට පිටු කිහිපයක් ස්කෑන් කරන්න</translation>
 <translation id="8230672074305416752">පෙරනිමි ජාල වාහල පින්ග් කිරීම අසාර්ථක විය</translation>
 <translation id="8246209727385807362">නොදන්නා වාහකයෙකි</translation>
+<translation id="8286154143153872371">වෝල්පේපරය බැලීමට කරුණාකර ජාලයකට සම්බන්ධ වී පිටුව නැවත පූරණය කරන්න.</translation>
 <translation id="8291967909914612644">නිවෙස් සපයන්නාගේ රට</translation>
 <translation id="8294431847097064396">මූලාශ්‍රය</translation>
 <translation id="8297006494302853456">දුර්වලයි</translation>
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.cc b/components/autofill/content/browser/content_autofill_driver_factory.cc
index 99906014d..9593cc21 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory.cc
+++ b/components/autofill/content/browser/content_autofill_driver_factory.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 #include <utility>
-#include <vector>
 
 #include "base/bind.h"
 #include "base/feature_list.h"
diff --git a/components/autofill/core/browser/autofill_profile_save_strike_database_unittest.cc b/components/autofill/core/browser/autofill_profile_save_strike_database_unittest.cc
index b8262dc..99fb838 100644
--- a/components/autofill/core/browser/autofill_profile_save_strike_database_unittest.cc
+++ b/components/autofill/core/browser/autofill_profile_save_strike_database_unittest.cc
@@ -5,7 +5,6 @@
 #include "components/autofill/core/browser/strike_database_integrator_test_strike_database.h"
 
 #include <utility>
-#include <vector>
 
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/components/autofill/core/browser/data_model/contact_info.h b/components/autofill/core/browser/data_model/contact_info.h
index 9e75f1a..ab6c10b 100644
--- a/components/autofill/core/browser/data_model/contact_info.h
+++ b/components/autofill/core/browser/data_model/contact_info.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 #include <string>
-#include <vector>
 
 #include "base/compiler_specific.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_name.h"
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h
index bde6f863..f09eb00 100644
--- a/components/autofill/core/browser/data_model/credit_card.h
+++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -8,7 +8,6 @@
 #include <iosfwd>
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
diff --git a/components/autofill/core/browser/data_model/phone_number.h b/components/autofill/core/browser/data_model/phone_number.h
index 556941e6..aa76657 100644
--- a/components/autofill/core/browser/data_model/phone_number.h
+++ b/components/autofill/core/browser/data_model/phone_number.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 
 #include <string>
-#include <vector>
 
 #include "components/autofill/core/browser/data_model/form_group.h"
 #include "components/autofill/core/browser/geo/phone_number_i18n.h"
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index ddba86c..0cdf18ae 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -9,7 +9,6 @@
 #include <memory>
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
diff --git a/components/autofill/core/browser/form_parsing/address_field_unittest.cc b/components/autofill/core/browser/form_parsing/address_field_unittest.cc
index 4625cc6..69846794 100644
--- a/components/autofill/core/browser/form_parsing/address_field_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/address_field_unittest.cc
@@ -5,7 +5,6 @@
 #include "components/autofill/core/browser/form_parsing/address_field.h"
 
 #include <memory>
-#include <vector>
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
diff --git a/components/autofill/core/browser/form_parsing/name_field.h b/components/autofill/core/browser/form_parsing/name_field.h
index 99c011e..b4e34eb 100644
--- a/components/autofill/core/browser/form_parsing/name_field.h
+++ b/components/autofill/core/browser/form_parsing/name_field.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NAME_FIELD_H_
 
 #include <memory>
-#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
diff --git a/components/autofill/core/browser/form_parsing/phone_field.h b/components/autofill/core/browser/form_parsing/phone_field.h
index 6408914..4261c91 100644
--- a/components/autofill/core/browser/form_parsing/phone_field.h
+++ b/components/autofill/core/browser/form_parsing/phone_field.h
@@ -9,7 +9,6 @@
 
 #include <memory>
 #include <string>
-#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
diff --git a/components/autofill/core/browser/geo/autofill_country.h b/components/autofill/core/browser/geo/autofill_country.h
index eaab92d..b71ec4f 100644
--- a/components/autofill/core/browser/geo/autofill_country.h
+++ b/components/autofill/core/browser/geo/autofill_country.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_GEO_AUTOFILL_COUNTRY_H_
 
 #include <string>
-#include <vector>
 
 #include "base/macros.h"
 #include "components/autofill/core/browser/geo/country_data.h"
diff --git a/components/autofill/core/browser/geo/phone_number_i18n.h b/components/autofill/core/browser/geo/phone_number_i18n.h
index e5158ae4..b608e66c 100644
--- a/components/autofill/core/browser/geo/phone_number_i18n.h
+++ b/components/autofill/core/browser/geo/phone_number_i18n.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 #include <string>
-#include <vector>
 
 #include "base/compiler_specific.h"
 
diff --git a/components/autofill/core/browser/metrics/address_form_event_logger.cc b/components/autofill/core/browser/metrics/address_form_event_logger.cc
index 9513cf2..f326512 100644
--- a/components/autofill/core/browser/metrics/address_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/address_form_event_logger.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <iterator>
 #include <memory>
-#include <vector>
 
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/user_metrics.h"
diff --git a/components/autofill/core/browser/validation.h b/components/autofill/core/browser/validation.h
index 06b90d55..93b3e02 100644
--- a/components/autofill/core/browser/validation.h
+++ b/components/autofill/core/browser/validation.h
@@ -7,7 +7,6 @@
 
 #include <set>
 #include <string>
-#include <vector>
 
 #include "base/strings/string_piece_forward.h"
 #include "components/autofill/core/browser/field_types.h"
diff --git a/components/autofill/core/common/form_field_data_predictions.h b/components/autofill/core/common/form_field_data_predictions.h
index f0786f5..4fd0f2c0 100644
--- a/components/autofill/core/common/form_field_data_predictions.h
+++ b/components/autofill/core/common/form_field_data_predictions.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_AUTOFILL_CORE_COMMON_FORM_FIELD_DATA_PREDICTIONS_H_
 
 #include <string>
-#include <vector>
 
 #include "components/autofill/core/common/form_field_data.h"
 
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
index d892f2c..2fd1921 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -313,6 +313,7 @@
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}}</translation>
 <translation id="913657688200966289">Turn on permissions for <ph name="APP_NAME" /> in <ph name="BEGIN_LINK" />Android settings<ph name="END_LINK" />.</translation>
+<translation id="9162462602695099906">This page is dangerous</translation>
 <translation id="930525582205581608">Forget this site?</translation>
 <translation id="967624055006145463">Data stored</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
index f135eac4..685499a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -313,6 +313,7 @@
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}}</translation>
 <translation id="913657688200966289"><ph name="APP_NAME" /> සඳහා අවසර <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ ක්‍රියාත්මක කරන්න.</translation>
+<translation id="9162462602695099906">මෙම පිටුව අනතුරුදායකයි</translation>
 <translation id="930525582205581608">මෙම අඩවිය අමතක කරන්නද?</translation>
 <translation id="967624055006145463">දත්ත ගබඩා කර ඇත</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/components/dom_distiller/content/browser/distiller_page_web_contents.cc b/components/dom_distiller/content/browser/distiller_page_web_contents.cc
index 6dfc09c..c5a83d8 100644
--- a/components/dom_distiller/content/browser/distiller_page_web_contents.cc
+++ b/components/dom_distiller/content/browser/distiller_page_web_contents.cc
@@ -90,8 +90,9 @@
   if (source_page_handle_ && source_page_handle_->web_contents() &&
       source_page_handle_->web_contents()->GetLastCommittedURL() == url) {
     if (source_page_handle_->web_contents()
-            ->GetMainFrame()
-            ->IsDOMContentLoaded()) {
+            ->GetPrimaryPage()
+            .GetMainDocument()
+            .IsDOMContentLoaded()) {
       // Main frame has already loaded for the current WebContents, so execute
       // JavaScript immediately.
       ExecuteJavaScript();
@@ -143,8 +144,9 @@
 
 void DistillerPageWebContents::DOMContentLoaded(
     content::RenderFrameHost* render_frame_host) {
-  if (render_frame_host ==
-      source_page_handle_->web_contents()->GetMainFrame()) {
+  if (render_frame_host == &source_page_handle_->web_contents()
+                                ->GetPrimaryPage()
+                                .GetMainDocument()) {
     ExecuteJavaScript();
   }
 }
@@ -162,9 +164,8 @@
 }
 
 void DistillerPageWebContents::ExecuteJavaScript() {
-  content::RenderFrameHost* frame =
-      source_page_handle_->web_contents()->GetMainFrame();
-  DCHECK(frame);
+  content::RenderFrameHost& frame =
+      source_page_handle_->web_contents()->GetPrimaryPage().GetMainDocument();
   DCHECK_EQ(LOADING_PAGE, state_);
   state_ = EXECUTING_JAVASCRIPT;
   content::WebContentsObserver::Observe(nullptr);
@@ -173,7 +174,7 @@
   source_page_handle_->web_contents()->Stop();
   DVLOG(1) << "Beginning distillation";
   RunIsolatedJavaScript(
-      frame, script_,
+      &frame, script_,
       base::BindOnce(&DistillerPageWebContents::OnWebContentsDistillationDone,
                      weak_factory_.GetWeakPtr(),
                      source_page_handle_->web_contents()->GetLastCommittedURL(),
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
index 1c67c9b..97d54a7b 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -115,6 +115,19 @@
   return metrics;
 }
 
+// static
+void MetricsWebContentsObserver::BindPageLoadMetrics(
+    mojo::PendingAssociatedReceiver<mojom::PageLoadMetrics> receiver,
+    content::RenderFrameHost* rfh) {
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents)
+    return;
+  auto* observer = MetricsWebContentsObserver::FromWebContents(web_contents);
+  if (!observer)
+    return;
+  observer->page_load_metrics_receivers_.Bind(rfh, std::move(receiver));
+}
+
 MetricsWebContentsObserver::~MetricsWebContentsObserver() {}
 
 void MetricsWebContentsObserver::WebContentsWillSoonBeDestroyed() {
@@ -222,10 +235,7 @@
                      content::Visibility::HIDDEN),
       embedder_interface_(std::move(embedder_interface)),
       has_navigated_(false),
-      page_load_metrics_receiver_(
-          web_contents,
-          this,
-          content::WebContentsFrameReceiverSetPassKey()) {
+      page_load_metrics_receivers_(web_contents, this) {
   // NoStatePrefetch loads erroneously report that they are initially visible,
   // so we manually override visibility state for prerender.
   if (embedder_interface_->IsNoStatePrefetch(web_contents))
@@ -985,7 +995,7 @@
     mojom::InputTimingPtr input_timing_delta,
     const blink::MobileFriendliness& mobile_friendliness) {
   content::RenderFrameHost* render_frame_host =
-      page_load_metrics_receiver_.GetCurrentTargetFrame();
+      page_load_metrics_receivers_.GetCurrentTargetFrame();
   OnTimingUpdated(render_frame_host, std::move(timing), std::move(metadata),
                   new_features, resources, std::move(render_data),
                   std::move(cpu_timing), std::move(new_deferred_resource_data),
@@ -996,7 +1006,7 @@
 void MetricsWebContentsObserver::SetUpSharedMemoryForSmoothness(
     base::ReadOnlySharedMemoryRegion shared_memory) {
   content::RenderFrameHost* render_frame_host =
-      page_load_metrics_receiver_.GetCurrentTargetFrame();
+      page_load_metrics_receivers_.GetCurrentTargetFrame();
   const bool is_main_frame = render_frame_host->GetParent() == nullptr;
   if (!is_main_frame) {
     // TODO(1115136): Merge smoothness metrics from OOPIFs with the main-frame.
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h
index b19392e..b3ca49f0 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.h
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -17,10 +17,10 @@
 #include "components/page_load_metrics/browser/page_load_metrics_observer.h"
 #include "components/page_load_metrics/common/page_load_metrics.mojom.h"
 #include "components/page_load_metrics/common/page_load_timing.h"
+#include "content/public/browser/render_frame_host_receiver_set.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_contents_receiver_set.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "net/cookies/canonical_cookie.h"
 #include "services/network/public/mojom/fetch_api.mojom-forward.h"
@@ -103,6 +103,11 @@
       std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface);
   ~MetricsWebContentsObserver() override;
 
+  // Binds a Mojo receiver to the instance associated with the RenderFrameHost.
+  static void BindPageLoadMetrics(
+      mojo::PendingAssociatedReceiver<mojom::PageLoadMetrics> receiver,
+      content::RenderFrameHost* rfh);
+
   // Any visibility changes that occur after this method should be ignored since
   // they are just clean up prior to destroying the WebContents instance.
   void WebContentsWillSoonBeDestroyed();
@@ -348,8 +353,8 @@
   bool has_navigated_;
 
   base::ObserverList<TestingObserver>::Unchecked testing_observers_;
-  content::WebContentsFrameReceiverSet<mojom::PageLoadMetrics>
-      page_load_metrics_receiver_;
+  content::RenderFrameHostReceiverSet<mojom::PageLoadMetrics>
+      page_load_metrics_receivers_;
 
   bool web_contents_will_soon_be_destroyed_ = false;
 
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 6945cba..d1134649 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -808,6 +808,7 @@
 <translation id="3793574014653384240">Numbers and causes of the crashes that occurred recently</translation>
 <translation id="3797522431967816232">Prc3 (Envelope)</translation>
 <translation id="3799805948399000906">Font requested</translation>
+<translation id="380329542618494757">Name</translation>
 <translation id="3807366285948165054">Image X shift</translation>
 <translation id="3807873520724684969">Harmful content blocked.</translation>
 <translation id="3810973564298564668">Manage</translation>
@@ -822,6 +823,7 @@
 <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />: press Tab then Enter to create a new Google Doc quickly</translation>
 <translation id="385051799172605136">Back</translation>
 <translation id="3858027520442213535">Update date and time</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="3881478300875776315">Show fewer lines</translation>
 <translation id="3884278016824448484">Conflicting device identifier</translation>
 <translation id="3885155851504623709">Parish</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb
index 52d8295..1a812b63 100644
--- a/components/strings/components_strings_si.xtb
+++ b/components/strings/components_strings_si.xtb
@@ -809,6 +809,7 @@
 <translation id="3793574014653384240">මෑතදී සිදු වූ බිඳ වැටීම් සංඛ්‍යාව සහ හේතු</translation>
 <translation id="3797522431967816232">Prc3 (ලියුම් කවරය)</translation>
 <translation id="3799805948399000906">අකුරු වර්ගය ඉල්ලුවා</translation>
+<translation id="380329542618494757">නම</translation>
 <translation id="3807366285948165054">රූපයේ X වැඩ මුරය</translation>
 <translation id="3807873520724684969">අහිතකර අන්තර්ගතය අවහිරයි.</translation>
 <translation id="3810973564298564668">කළමනාකරණය</translation>
@@ -823,6 +824,7 @@
 <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, ඉක්මනින් නව Google Doc එකක් තැනීමට Tab ඔබා අනතුරුව Enter ඔබන්න</translation>
 <translation id="385051799172605136">ආපසු</translation>
 <translation id="3858027520442213535">දිනය සහ වේලාව යාවත්කාලීන කරන්න</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3881478300875776315">පේළි අඩුවෙන් පෙන්වන්න</translation>
 <translation id="3884278016824448484">උපාංගය හඳුනා ගැනීම ප්‍රතිවිරුද්ධයි</translation>
 <translation id="3885155851504623709">කෝරලය</translation>
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc
index ba4d9ba0..da15b33 100644
--- a/content/browser/prerender/prerender_browsertest.cc
+++ b/content/browser/prerender/prerender_browsertest.cc
@@ -517,6 +517,101 @@
       PrerenderHost::FinalStatus::kNavigationBadHttpStatus, 1);
 }
 
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelOnAuthRequested) {
+  base::HistogramTester histogram_tester;
+
+  // Navigate to an initial page.
+  const GURL kInitialUrl = GetUrl("/title1.html");
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = GetUrl("/auth-basic");
+  AddPrerenderAsync(kPrerenderingUrl);
+  test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
+  registry_observer.WaitForTrigger(kPrerenderingUrl);
+  int host_id = GetHostForUrl(kPrerenderingUrl);
+  test::PrerenderHostObserver host_observer(*web_contents_impl(), host_id);
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(GetHostForUrl(kPrerenderingUrl),
+            RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Cancellation must have occurred due to authentication request.
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus",
+      PrerenderHost::FinalStatus::kLoginAuthRequested, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelOnAuthRequestedSubframe) {
+  base::HistogramTester histogram_tester;
+
+  // Navigate to an initial page.
+  const GURL kInitialUrl = GetUrl("/title1.html");
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = GetUrl("/title1.html");
+  int host_id = AddPrerender(kPrerenderingUrl);
+  test::PrerenderHostObserver host_observer(*web_contents_impl(), host_id);
+  WaitForPrerenderLoadCompletion(kPrerenderingUrl);
+
+  // Fetch a subframe that requires authentication.
+  const GURL kAuthIFrameUrl = GetUrl("/auth-basic");
+  RenderFrameHost* prerender_rfh = GetPrerenderedMainFrameHost(host_id);
+  ignore_result(ExecJs(prerender_rfh,
+                       "var i = document.createElement('iframe'); i.src = '" +
+                           kAuthIFrameUrl.spec() +
+                           "'; document.body.appendChild(i);"));
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(GetHostForUrl(kPrerenderingUrl),
+            RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Cancellation must have occurred due to authentication request.
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus",
+      PrerenderHost::FinalStatus::kLoginAuthRequested, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, CancelOnAuthRequestedSubResource) {
+  base::HistogramTester histogram_tester;
+
+  // Navigate to an initial page.
+  const GURL kInitialUrl = GetUrl("/empty.html");
+  ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
+  test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
+
+  // Start prerendering `kPrerenderingUrl`.
+  const GURL kPrerenderingUrl = GetUrl("/title1.html");
+  int host_id = AddPrerender(kPrerenderingUrl);
+  test::PrerenderHostObserver host_observer(*web_contents_impl(), host_id);
+  WaitForPrerenderLoadCompletion(kPrerenderingUrl);
+
+  ASSERT_NE(GetHostForUrl(kPrerenderingUrl),
+            RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Fetch a subresrouce.
+  std::string fetch_subresource_script = R"(
+        const imgElement = document.createElement('img');
+        imgElement.src = '/auth-basic/favicon.gif';
+        document.body.appendChild(imgElement);
+  )";
+  ignore_result(
+      ExecJs(GetPrerenderedMainFrameHost(host_id), fetch_subresource_script));
+
+  // The prerender should be destroyed.
+  host_observer.WaitForDestroyed();
+  EXPECT_EQ(GetHostForUrl(kPrerenderingUrl),
+            RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Cancellation must have occurred due to authentication request.
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus",
+      PrerenderHost::FinalStatus::kLoginAuthRequested, 1);
+}
+
 // Tests that prerendering triggered by prerendered pages is deferred until
 // activation.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderChain) {
diff --git a/content/browser/prerender/prerender_host.h b/content/browser/prerender/prerender_host.h
index c50fdc9f..4f95cec 100644
--- a/content/browser/prerender/prerender_host.h
+++ b/content/browser/prerender/prerender_host.h
@@ -77,7 +77,8 @@
     kDidFailLoad = 23,
     kStop = 24,
     kSslCertificateError = 25,
-    kMaxValue = kSslCertificateError,
+    kLoginAuthRequested = 26,
+    kMaxValue = kLoginAuthRequested,
   };
 
   PrerenderHost(blink::mojom::PrerenderAttributesPtr attributes,
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 68fae7b5..3ed99ee 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -569,14 +569,6 @@
          frame_tree_node->current_frame_host()->IsInPrimaryMainFrame();
 }
 
-bool IsMainFrameRequest(int process_id, int routing_id) {
-  if (process_id != network::mojom::kBrowserProcessId)
-    return false;
-
-  auto* frame_tree_node = FrameTreeNode::GloballyFindByID(routing_id);
-  return frame_tree_node && frame_tree_node->IsMainFrame();
-}
-
 // This class lives on the UI thread. It is self-owned and will delete itself
 // after any of the SSLClientAuthHandler::Delegate methods are invoked (or when
 // a mojo connection error occurs).
@@ -1747,38 +1739,65 @@
     const scoped_refptr<net::HttpResponseHeaders>& head_headers,
     mojo::PendingRemote<network::mojom::AuthChallengeResponder>
         auth_challenge_responder) {
-  bool is_main_frame = false;
+  bool is_primary_main_frame = false;
   base::RepeatingCallback<WebContents*(void)> web_contents_getter;
   int process_id = url_loader_network_observers_.current_context().process_id;
   int routing_id = url_loader_network_observers_.current_context().routing_id;
-  if (window_id) {
-    DCHECK_EQ(network::mojom::kBrowserProcessId, process_id);
-    DCHECK_EQ(routing_id, RenderFrameHost::kNoFrameTreeNodeId);
-    if (service_worker_context_->context()) {
-      auto* container_host =
-          service_worker_context_->context()->GetContainerHostByWindowId(
-              *window_id);
-      if (container_host) {
-        int frame_tree_node_id = container_host->frame_tree_node_id();
-        if (FrameTreeNode* frame_tree_node =
-                FrameTreeNode::GloballyFindByID(frame_tree_node_id)) {
-          is_main_frame = frame_tree_node->IsMainFrame();
-          web_contents_getter = base::BindRepeating(
-              &WebContents::FromFrameTreeNodeId, frame_tree_node_id);
+
+  if (process_id == network::mojom::kBrowserProcessId) {
+    // Route via `frame_tree_node_id`.
+    int frame_tree_node_id = RenderFrameHost::kNoFrameTreeNodeId;
+    if (window_id) {
+      // Use `window_id` if it is provided. This observer is created for service
+      // workers.
+      DCHECK_EQ(routing_id, RenderFrameHost::kNoFrameTreeNodeId);
+      if (service_worker_context_->context()) {
+        auto* container_host =
+            service_worker_context_->context()->GetContainerHostByWindowId(
+                *window_id);
+        if (container_host) {
+          // TODO(https://crbug.com/1223838): Use RenderFrameHost instead of
+          // FrameTreeNode when possible.
+          frame_tree_node_id = container_host->frame_tree_node_id();
         }
       }
+    } else {
+      // This observer is created for NavigationRequest. See
+      // `CreateURLLoaderNetworkObserverForNavigationRequest()`.
+      frame_tree_node_id = routing_id;
+    }
+    if (CancelIfPrerendering(frame_tree_node_id,
+                             PrerenderHost::FinalStatus::kLoginAuthRequested)) {
+      return;
+    }
+
+    FrameTreeNode* frame_tree_node =
+        FrameTreeNode::GloballyFindByID(frame_tree_node_id);
+    if (frame_tree_node) {
+      is_primary_main_frame =
+          frame_tree_node->current_frame_host()->IsInPrimaryMainFrame();
+      web_contents_getter = base::BindRepeating(
+          &WebContents::FromFrameTreeNodeId, frame_tree_node_id);
     }
   } else {
-    // TODO(https://crbug.com/1219655): Use IsPrimaryMainFrameRequest and remove
-    // IsMainFrameRequest.
-    is_main_frame = IsMainFrameRequest(process_id, routing_id);
+    DCHECK(!window_id);
+    if (CancelIfPrerendering(GlobalRenderFrameHostId(process_id, routing_id),
+                             PrerenderHost::FinalStatus::kLoginAuthRequested)) {
+      return;
+    }
+
+    is_primary_main_frame = IsPrimaryMainFrameRequest(process_id, routing_id);
+  }
+
+  if (!web_contents_getter) {
     web_contents_getter =
         base::BindRepeating(GetWebContents, process_id, routing_id);
   }
-  OnAuthRequiredContinuation(process_id, routing_id, request_id, url,
-                             is_main_frame, first_auth_attempt, auth_info,
-                             head_headers, std::move(auth_challenge_responder),
-                             web_contents_getter);
+
+  OnAuthRequiredContinuation(
+      process_id, routing_id, request_id, url, is_primary_main_frame,
+      first_auth_attempt, auth_info, head_headers,
+      std::move(auth_challenge_responder), web_contents_getter);
 }
 
 void StoragePartitionImpl::OnCertificateRequested(
diff --git a/content/public/browser/web_contents_receiver_set.h b/content/public/browser/web_contents_receiver_set.h
index a3e6499..85c8875c 100644
--- a/content/public/browser/web_contents_receiver_set.h
+++ b/content/public/browser/web_contents_receiver_set.h
@@ -26,9 +26,6 @@
 namespace extensions {
 class ExtensionFrameHost;
 }  // namespace extensions
-namespace page_load_metrics {
-class MetricsWebContentsObserver;
-}
 namespace printing {
 class PrintManager;
 }
@@ -104,7 +101,6 @@
   friend class ::EmbeddedSearchClientFactoryImpl;
   friend class ::chrome_browser_net::NetErrorTabHelper;
   friend class ::extensions::ExtensionFrameHost;
-  friend class ::page_load_metrics::MetricsWebContentsObserver;
   friend class ::printing::PrintManager;
   friend class ::subresource_redirect::SubresourceRedirectObserver;
   friend class ScreenOrientationProvider;
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_android.png b/content/test/data/forms/form_controls_browsertest_checkbox_android.png
index d819a9b..258b74f3 100644
--- a/content/test/data/forms/form_controls_browsertest_checkbox_android.png
+++ b/content/test/data/forms/form_controls_browsertest_checkbox_android.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_multi_select_android.png b/content/test/data/forms/form_controls_browsertest_multi_select_android.png
index c166623..edaf6cb 100644
--- a/content/test/data/forms/form_controls_browsertest_multi_select_android.png
+++ b/content/test/data/forms/form_controls_browsertest_multi_select_android.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_select_android.png b/content/test/data/forms/form_controls_browsertest_select_android.png
index 16c390a..0225ac4 100644
--- a/content/test/data/forms/form_controls_browsertest_select_android.png
+++ b/content/test/data/forms/form_controls_browsertest_select_android.png
Binary files differ
diff --git a/docs/testing/web_test_expectations.md b/docs/testing/web_test_expectations.md
index c8556dd..5858c98 100644
--- a/docs/testing/web_test_expectations.md
+++ b/docs/testing/web_test_expectations.md
@@ -150,13 +150,82 @@
   `--patchset=n` to specify the patchset. This is very useful when the CL has
   'trivial' patchsets that are created e.g. by editing the CL descrpition.
 
+### Rebaseline script in results.html
+
+Web test results.html linked from bot job result page provides an alternative
+way to rebaseline tests for a particular platform.
+
+* In the bot job result page, find the web test results.html link and click it.
+* Choose "Rebaseline script" from the dropdown list after "Test shown ... in format".
+* Click "Copy report" (or manually copy part of the script for the tests you want
+  to rebaseline).
+* In local console, change directory into `third_party/blink/web_tests/platform/<platform>`.
+* Paste.
+* Add files into git and commit.
+
+Unlike other rebaseline methods, the above process may create redundant baselines,
+so optionally you may want to run the following to optimize the baselines before
+the last step above:
+* In the result page, click "Copy test names"
+* In local console, run `third_party/blink/tools/blink_tools.py optimize-baselines <paste>`.
+
 ### Local manual rebaselining
 
-This is often useful for rebaselining flag-specific results, or rebaselining
-just for the local platform.
-See [Rebaselining Web Tests](./web_tests.md#Rebaselining-Web-Tests) for more
-details.
+```bash
+third_party/blink/tools/run_web_tests.py --reset-results foo/bar/test.html
+```
 
+If there are current expectation files for `web_tests/foo/bar/test.html`,
+the above command will overwrite the current baselines at their original
+locations with the actual results. The current baseline means the `-expected.*`
+file used to compare the actual result when the test is run locally, i.e. the
+first file found in the [baseline search path](https://cs.chromium.org/search/?q=port/base.py+baseline_search_path).
+
+If there are no current baselines, the above command will create new baselines
+in the platform-independent directory, e.g.
+`web_tests/foo/bar/test-expected.{txt,png}`.
+
+When you rebaseline a test, make sure your commit description explains why the
+test is being re-baselined.
+
+### Rebaselining flag-specific expectations
+
+See [Testing Runtime Flags](./web_tests.md#Testing-Runtime-Flags) for details
+about flag-specific expectations.
+
+Though we prefer the [Rebaseline Tool](#How-to-rebaseline) to local rebaselining,
+the Rebaseline Tool doesn't support rebaselining flag-specific expectations except
+highdpi.
+
+```bash
+third_party/blink/tools/run_web_tests.py --flag-specific=config --reset-results foo/bar/test.html
+```
+
+New baselines will be created in the flag-specific baselines directory, e.g.
+`web_tests/flag-specific/config/foo/bar/test-expected.{txt,png}`
+
+Then you can commit the new baselines and upload the patch for review.
+
+Sometimes it's difficult for reviewers to review the patch containing only new
+files. You can follow the steps below for easier review.
+
+1. Copy existing baselines to the flag-specific baselines directory for the
+   tests to be rebaselined:
+   ```bash
+   third_party/blink/tools/run_web_tests.py --flag-specific=config --copy-baselines foo/bar/test.html
+   ```
+   Then add the newly created baseline files, commit and upload the patch.
+   Note that the above command won't copy baselines for passing tests.
+
+2. Rebaseline the test locally:
+   ```bash
+   third_party/blink/tools/run_web_tests.py --flag-specific=config --reset-results foo/bar/test.html
+   ```
+   Commit the changes and upload the patch.
+
+3. Request review of the CL and tell the reviewer to compare the patch sets that
+   were uploaded in step 1 and step 2 to see the differences of the rebaselines.
+   
 ## Kinds of expectations files
 
 * [TestExpectations](../../third_party/blink/web_tests/TestExpectations): The
@@ -200,6 +269,11 @@
 
 ### Syntax
 
+*** promo
+Please see [The Chromium Test List Format](http://bit.ly/chromium-test-list-format)
+for a more complete and up-to-date description of the syntax.
+***
+
 The syntax of the file is roughly one expectation per line. An expectation can
 apply to either a directory of tests, or a specific tests. Lines prefixed with
 `# ` are treated as comments, and blank lines are allowed as well.
@@ -207,14 +281,17 @@
 The syntax of a line is roughly:
 
 ```
-[ bugs ] [ "[" modifiers "]" ] test_name [ "[" expectations "]" ]
+[ bugs ] [ "[" modifiers "]" ] test_name_or_directory [ "[" expectations "]" ]
 ```
 
 * Tokens are separated by whitespace.
 * **The brackets delimiting the modifiers and expectations from the bugs and the
-  test_name are not optional**; however the modifiers component is optional. In
+  test_name_or_directory are not optional**; however the modifiers component is optional. In
   other words, if you want to specify modifiers or expectations, you must
   enclose them in brackets.
+* If test_name_or_directory is a directory, it should be ended with '/*', and all
+  tests under the directory will have the expectations, unless overridden by
+  more specific expectation lines.
 * Lines are expected to have one or more bug identifiers, and the linter will
   complain about lines missing them. Bug identifiers are of the form
   `crbug.com/12345`, `code.google.com/p/v8/issues/detail?id=12345` or
@@ -297,6 +374,15 @@
 * `fast/html/section-element.html` to either crash or produce a text (or image
   and text) failure, but not time out or pass.
 
+Test expectation can also apply to all tests under a directory (specified with a
+name ending with `/*`). A more specific expectation can override a less
+specific expectation. For example:
+```
+crbug.com/12345 virtual/composite-after-paint/* [ Skip ]
+crbug.com/12345 virtual/composite-after-paint/compositing/backface-visibility/* [ Pass ]
+crbug.com/12345 virtual/composite-after-paint/compositing/backface-visibility/test.html [ Failure ]
+```
+
 *** promo
 Duplicate expectations are not allowed within the file and will generate
 warnings.
diff --git a/docs/testing/web_tests.md b/docs/testing/web_tests.md
index 03a6270..e2a01ab1 100644
--- a/docs/testing/web_tests.md
+++ b/docs/testing/web_tests.md
@@ -114,19 +114,19 @@
 content_shell executable to run specific tests by using (example on Windows):
 
 ```bash
-out\\Default\\content_shell.exe --run-web-tests <url>|<full_test_source_path>|<relative_test_path>
+out\Default\content_shell.exe --run-web-tests <url>|<full_test_source_path>|<relative_test_path>
 ```
 
 as in:
 
 ```bash
-out\\Default\\content_shell.exe --run-web-tests \
-    c:\\chrome\\src\\third_party\\blink\\web_tests\\fast\\forms\\001.html
+out\Default\content_shell.exe --run-web-tests \
+    c:\chrome\src\third_party\blink\web_tests\fast\forms\001.html
 ```
 or
 
 ```bash
-out\\Default\\content_shell.exe --run-web-tests fast\\forms\\001.html
+out\Default\content_shell.exe --run-web-tests fast\forms\001.html
 ```
 
 but this requires a manual diff against expected results, because the shell
@@ -209,90 +209,99 @@
 
 There are two ways to run web tests with additional command-line arguments:
 
-* Using `--additional-driver-flag` or `--flag-specific`:
+### `--flag-specific` or `--additional-driver-flag`:
 
-  ```bash
-  third_party/blink/tools/run_web_tests.py --additional-driver-flag=--blocking-repaint
-  ```
+```bash
+# Actually we prefer --flag-specific in some cases. See below for details.
+third_party/blink/tools/run_web_tests.py --additional-driver-flag=--blocking-repaint
+```
 
-  This tells the test harness to pass `--blocking-repaint` to the
-  content_shell binary.
+This tells the test harness to pass `--blocking-repaint` to the
+content_shell binary.
 
-  It will also look for flag-specific expectations in
-  `web_tests/FlagExpectations/blocking-repaint`, if this file exists. The
-  suppressions in this file override the main TestExpectations files.
-  However, `[ Slow ]` in either flag-specific expectations or base expectations
-  is always merged into the used expectations.
+It will also look for flag-specific expectations in
+`web_tests/FlagExpectations/blocking-repaint`, if this file exists. The
+suppressions in this file override the main TestExpectations files.
+However, `[ Slow ]` in either flag-specific expectations or base expectations
+is always merged into the used expectations.
 
-  It will also look for baselines in `web_tests/flag-specific/blocking-repaint`.
-  The baselines in this directory override the fallback baselines.
+It will also look for baselines in `web_tests/flag-specific/blocking-repaint`.
+The baselines in this directory override the fallback baselines.
 
-  By default, name of the expectation file name under
-  `web_tests/FlagExpectations` and name of the baseline directory under
-  `web_tests/flag-specific` uses the first flag of --additional-driver-flag
-  with leading '-'s stripped.
+By default, name of the expectation file name under
+`web_tests/FlagExpectations` and name of the baseline directory under
+`web_tests/flag-specific` uses the first flag of --additional-driver-flag
+with leading '-'s stripped.
 
-  You can also customize the name in `web_tests/FlagSpecificConfig` when
-  the name is too long or when we need to match multiple additional args:
+You can also customize the name in `web_tests/FlagSpecificConfig` when
+the name is too long or when we need to match multiple additional args:
 
-  ```json
-  {
-    "name": "short-name",
-    "args": ["--blocking-repaint", "--another-flag"]
-  }
-  ```
+```json
+{
+  "name": "short-name",
+  "args": ["--blocking-repaint", "--another-flag"]
+}
+```
+  
+`web_tests/FlagSpecificConfig` is preferred when you need multiple flags,
+or the flag is long.
 
-  When at least `--additional-driver-flag=--blocking-repaint` and
-  `--additional-driver-flag=--another-flag` are specified, `short-name` will
-  be used as name of the flag specific expectation file and the baseline directory.
+With the config, you can use `--flag-specific=short-name` as a shortcut
+of `--additional-driver-flag=--blocking-repaint --additional-driver-flag=--another-flag`.
+  
+`--additional-driver-flags` still works with `web_tests/FlagSpecificConfig`.
+For example, when at least `--additional-driver-flag=--blocking-repaint` and
+`--additional-driver-flag=--another-flag` are specified, `short-name` will
+be used as name of the flag specific expectation file and the baseline directory.
 
-  With the config, you can also use `--flag-specific=short-name` as a shortcut
-  of `--additional-driver-flag=--blocking-repaint --additional-driver-flag=--another-flag`.
+### Virtual test suites
 
-* Using a *virtual test suite* defined in
-  [web_tests/VirtualTestSuites](../../third_party/blink/web_tests/VirtualTestSuites).
-  A virtual test suite runs a subset of web tests with additional flags, with
-  `virtual/<prefix>/...` in their paths. The tests can be virtual tests that
-  map to real base tests (directories or files) whose paths match any of the
-  specified bases, or any real tests under `web_tests/virtual/<prefix>/`
-  directory. For example, you could test a (hypothetical) new mode for
-  repainting using the following virtual test suite:
+A *virtual test suite* can be defined in
+[web_tests/VirtualTestSuites](../../third_party/blink/web_tests/VirtualTestSuites),
+to run a subset of web tests with additional flags, with
+`virtual/<prefix>/...` in their paths. The tests can be virtual tests that
+map to real base tests (directories or files) whose paths match any of the
+specified bases, or any real tests under `web_tests/virtual/<prefix>/`
+directory. For example, you could test a (hypothetical) new mode for
+repainting using the following virtual test suite:
 
-  ```json
-  {
-    "prefix": "blocking_repaint",
-    "bases": ["compositing", "fast/repaint"],
-    "args": ["--blocking-repaint"]
-  }
-  ```
+```json
+{
+  "prefix": "blocking_repaint",
+  "bases": ["compositing", "fast/repaint"],
+  "args": ["--blocking-repaint"]
+}
+```
 
-  This will create new "virtual" tests of the form
-  `virtual/blocking_repaint/compositing/...` and
-  `virtual/blocking_repaint/fast/repaint/...` which correspond to the files
-  under `web_tests/compositing` and `web_tests/fast/repaint`, respectively,
-  and pass `--blocking-repaint` to `content_shell` when they are run.
+This will create new "virtual" tests of the form
+`virtual/blocking_repaint/compositing/...` and
+`virtual/blocking_repaint/fast/repaint/...` which correspond to the files
+under `web_tests/compositing` and `web_tests/fast/repaint`, respectively,
+and pass `--blocking-repaint` to `content_shell` when they are run.
 
-  These virtual tests exist in addition to the original `compositing/...` and
-  `fast/repaint/...` tests. They can have their own expectations in
-  `web_tests/TestExpectations`, and their own baselines. The test harness will
-  use the non-virtual expectations and baselines as a fallback. If a virtual
-  test has its own expectations, they will override all non-virtual
-  expectations. otherwise the non-virtual expectations will be used. However,
-  `[ Slow ]` in either virtual or non-virtual expectations is always merged
-  into the used expectations. If a virtual test is expected to pass while the
-  non-virtual test is expected to fail, you need to add an explicit `[ Pass ]`
-  entry for the virtual test.
+These virtual tests exist in addition to the original `compositing/...` and
+`fast/repaint/...` tests. They can have their own expectations in
+`web_tests/TestExpectations`, and their own baselines. The test harness will
+use the non-virtual expectations and baselines as a fallback. If a virtual
+test has its own expectations, they will override all non-virtual
+expectations. otherwise the non-virtual expectations will be used. However,
+`[ Slow ]` in either virtual or non-virtual expectations is always merged
+into the used expectations. If a virtual test is expected to pass while the
+non-virtual test is expected to fail, you need to add an explicit `[ Pass ]`
+entry for the virtual test.
 
-  This will also let any real tests under `web_tests/virtual/blocking_repaint`
-  directory run with the `--blocking-repaint` flag.
+This will also let any real tests under `web_tests/virtual/blocking_repaint`
+directory run with the `--blocking-repaint` flag.
 
-  The "prefix" value should be unique. Multiple directories with the same flags
-  should be listed in the same "bases" list. The "bases" list can be empty,
-  in case that we just want to run the real tests under `virtual/<prefix>`
-  with the flags without creating any virtual tests.
+The "prefix" value should be unique. Multiple directories with the same flags
+should be listed in the same "bases" list. The "bases" list can be empty,
+in case that we just want to run the real tests under `virtual/<prefix>`
+with the flags without creating any virtual tests.
 
-For flags whose implementation is still in progress, virtual test suites and
-flag-specific expectations represent two alternative strategies for testing both
+### Choosing between flag-specific and virtual test suite
+
+For flags whose implementation is still in progress, flag-specific expectations
+and virtual test suites represent two alternative strategies for testing both
 the enabled code path and not-enabled code path. They are preferred to only
 setting a [runtime enabled feature](../../third_party/blink/renderer/platform/RuntimeEnabledFeatures.md)
 to `status: "test"` if the feature has substantially different code path from
@@ -320,8 +329,9 @@
   architectural changes that potentially impact all of the tests.
 
 * Note that using wildcards in virtual test path names (e.g.
-  `virtual/blocking_repaint/fast/repaint/*`) is not supported, but you can
-  still use `virtual/blocking_repaint` to run all real and virtual tests
+  `virtual/blocking_repaint/fast/repaint/*`) is not supported in
+  `run_web_tests.py` command line , but you can still use
+  `virtual/blocking_repaint` to run all real and virtual tests
   in the suite or `virtual/blocking_repaint/fast/repaint/dir` to run real
   or virtual tests in the suite under a specific directory.
 
@@ -534,70 +544,7 @@
 
 ## Rebaselining Web Tests
 
-*** promo
-To automatically re-baseline tests across all Chromium platforms, using the
-buildbot results, see [How to rebaseline](./web_test_expectations.md#How-to-rebaseline).
-Alternatively, to manually run and test and rebaseline it on your workstation,
-read on.
-***
-
-```bash
-third_party/blink/tools/run_web_tests.py --reset-results foo/bar/test.html
-```
-
-If there are current expectation files for `web_tests/foo/bar/test.html`,
-the above command will overwrite the current baselines at their original
-locations with the actual results. The current baseline means the `-expected.*`
-file used to compare the actual result when the test is run locally, i.e. the
-first file found in the [baseline search path](https://cs.chromium.org/search/?q=port/base.py+baseline_search_path).
-
-If there are no current baselines, the above command will create new baselines
-in the platform-independent directory, e.g.
-`web_tests/foo/bar/test-expected.{txt,png}`.
-
-When you rebaseline a test, make sure your commit description explains why the
-test is being re-baselined.
-
-### Rebaselining flag-specific expectations
-
-Though we prefer the [Rebaseline Tool](./web_test_expectations.md#How-to-rebaseline) to local rebaselining, the Rebaseline Tool
-doesn't support rebaselining flag-specific expectations except highdpi.
-
-```bash
-third_party/blink/tools/run_web_tests.py --additional-driver-flag=--enable-flag --reset-results foo/bar/test.html
-```
-*** promo
-You can use `--flag-specific=config` as a shorthand of
-`--additional-driver-flag=--enable-flag` if `config` is defined in
-`web_tests/FlagSpecificConfig`.
-***
-
-New baselines will be created in the flag-specific baselines directory, e.g.
-`web_tests/flag-specific/enable-flag/foo/bar/test-expected.{txt,png}`
-or
-`web_tests/flag-specific/config/foo/bar/test-expected.{txt,png}`
-
-Then you can commit the new baselines and upload the patch for review.
-
-However, it's difficult for reviewers to review the patch containing only new
-files. You can follow the steps below for easier review.
-
-1. Copy existing baselines to the flag-specific baselines directory for the
-   tests to be rebaselined:
-   ```bash
-   third_party/blink/tools/run_web_tests.py --additional-driver-flag=--enable-flag --copy-baselines foo/bar/test.html
-   ```
-   Then add the newly created baseline files, commit and upload the patch.
-   Note that the above command won't copy baselines for passing tests.
-
-2. Rebaseline the test locally:
-   ```bash
-   third_party/blink/tools/run_web_tests.py --additional-driver-flag=--enable-flag --reset-results foo/bar/test.html
-   ```
-   Commit the changes and upload the patch.
-
-3. Request review of the CL and tell the reviewer to compare the patch sets that
-   were uploaded in step 1 and step 2 to see the differences of the rebaselines.
+See [How to rebaseline](./web_test_expectations.md#How-to-rebaseline).
 
 ## Known Issues
 
diff --git a/extensions/browser/api/file_system/file_system_api.cc b/extensions/browser/api/file_system/file_system_api.cc
index bd366d7..d1d2468 100644
--- a/extensions/browser/api/file_system/file_system_api.cc
+++ b/extensions/browser/api/file_system/file_system_api.cc
@@ -207,6 +207,9 @@
 content::WebContents* GetWebContentsForRenderFrameHost(
     content::BrowserContext* browser_context,
     content::RenderFrameHost* render_frame_host) {
+  if (!render_frame_host)
+    return nullptr;
+
   content::WebContents* web_contents =
       content::WebContents::FromRenderFrameHost(render_frame_host);
   // Check if there is an app window associated with the web contents; if not,
@@ -513,15 +516,6 @@
   }
 
   if (is_directory_) {
-    // Get the WebContents for the app window to be the parent window of the
-    // confirmation dialog if necessary.
-    content::WebContents* const web_contents = GetWebContentsForRenderFrameHost(
-        browser_context(), render_frame_host());
-    if (!web_contents) {
-      Respond(Error(kInvalidCallingPage));
-      return;
-    }
-
     DCHECK_EQ(paths.size(), 1u);
     bool non_native_path = false;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -535,7 +529,7 @@
         FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
         base::BindOnce(
             &FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync, this,
-            non_native_path, paths, web_contents));
+            non_native_path, paths));
     return;
   }
 
@@ -548,8 +542,7 @@
 
 void FileSystemChooseEntryFunction::ConfirmDirectoryAccessAsync(
     bool non_native_path,
-    const std::vector<base::FilePath>& paths,
-    content::WebContents* web_contents) {
+    const std::vector<base::FilePath>& paths) {
   const base::FilePath check_path =
       non_native_path ? paths[0] : base::MakeAbsoluteFilePath(paths[0]);
   if (check_path.empty()) {
@@ -581,7 +574,7 @@
         FROM_HERE,
         base::BindOnce(
             &FileSystemChooseEntryFunction::ConfirmSensitiveDirectoryAccess,
-            this, paths, web_contents));
+            this, paths));
     return;
   }
 
@@ -592,8 +585,7 @@
 }
 
 void FileSystemChooseEntryFunction::ConfirmSensitiveDirectoryAccess(
-    const std::vector<base::FilePath>& paths,
-    content::WebContents* web_contents) {
+    const std::vector<base::FilePath>& paths) {
   if (ExtensionsBrowserClient::Get()->IsShuttingDown()) {
     FileSelectionCanceled();
     return;
@@ -606,6 +598,13 @@
     return;
   }
 
+  content::WebContents* const web_contents =
+      GetWebContentsForRenderFrameHost(browser_context(), render_frame_host());
+  if (!web_contents) {
+    Respond(Error(kInvalidCallingPage));
+    return;
+  }
+
   delegate->ConfirmSensitiveDirectoryAccess(
       app_file_handler_util::HasFileSystemWritePermission(extension_.get()),
       base::UTF8ToUTF16(extension_->name()), web_contents,
diff --git a/extensions/browser/api/file_system/file_system_api.h b/extensions/browser/api/file_system/file_system_api.h
index 0986b70..6447cd3 100644
--- a/extensions/browser/api/file_system/file_system_api.h
+++ b/extensions/browser/api/file_system/file_system_api.h
@@ -19,10 +19,6 @@
 #include "extensions/common/api/file_system.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 
-namespace content {
-class WebContents;
-}  // namespace content
-
 namespace extensions {
 class ExtensionPrefs;
 
@@ -205,13 +201,12 @@
   // directory. If so, calls ConfirmSensitiveDirectoryAccess. Otherwise, calls
   // OnDirectoryAccessConfirmed.
   void ConfirmDirectoryAccessAsync(bool non_native_path,
-                                   const std::vector<base::FilePath>& paths,
-                                   content::WebContents* web_contents);
+                                   const std::vector<base::FilePath>& paths);
 
   // Shows a dialog to confirm whether the user wants to open the directory.
   // Calls OnDirectoryAccessConfirmed or FileSelectionCanceled.
-  void ConfirmSensitiveDirectoryAccess(const std::vector<base::FilePath>& paths,
-                                       content::WebContents* web_contents);
+  void ConfirmSensitiveDirectoryAccess(
+      const std::vector<base::FilePath>& paths);
 
   void OnDirectoryAccessConfirmed(const std::vector<base::FilePath>& paths);
 
diff --git a/ios/build/bots/scripts/test_apps.py b/ios/build/bots/scripts/test_apps.py
index f47859a..4c186e9 100644
--- a/ios/build/bots/scripts/test_apps.py
+++ b/ios/build/bots/scripts/test_apps.py
@@ -86,7 +86,11 @@
     for env_var in kwargs.get('env_vars') or []:
       env_var = env_var.split('=', 1)
       self.env_vars[env_var[0]] = None if len(env_var) == 1 else env_var[1]
+    # Keep the initial included tests since creating target. Do not modify.
+    self.initial_included_tests = kwargs.get('included_tests') or []
+    # This may be modified between test launches.
     self.included_tests = kwargs.get('included_tests') or []
+    # This may be modified between test launches.
     self.excluded_tests = kwargs.get('excluded_tests') or []
     self.disabled_tests = []
     self.module_name = os.path.splitext(os.path.basename(test_app))[0]
@@ -229,10 +233,11 @@
         enabled_tests_only=False):
       test_name = '%s/%s' % (test_class, test_method)
       if (test_name not in none_tests and
-          # inlcuded_tests contains the tests to execute, which may be a subset
-          # of all tests b/c of the iOS test sharding logic in run.py. Filter by
-          # self.included_tests if specified
-          (test_class in self.included_tests if self.included_tests else True)):
+          # |self.initial_included_tests| contains the tests to execute, which
+          # may be a subset of all tests b/c of the iOS test sharding logic in
+          # run.py. Filter by |self.initial_included_tests| if specified.
+          (test_class in self.initial_included_tests
+           if self.initial_included_tests else True)):
         if test_method.startswith('test'):
           all_tests.append(test_name)
         elif store_disabled_tests:
diff --git a/ios/build/bots/scripts/xcodebuild_runner.py b/ios/build/bots/scripts/xcodebuild_runner.py
index e98f5101..b0cde623 100644
--- a/ios/build/bots/scripts/xcodebuild_runner.py
+++ b/ios/build/bots/scripts/xcodebuild_runner.py
@@ -183,6 +183,7 @@
     cancelled_statuses = {'TESTS_DID_NOT_START', 'BUILD_INTERRUPTED'}
     shards = self.shards
     running_tests = set(self.egtests_app.get_all_tests())
+    passed_tests = set()
     # total number of attempts is self.retries+1
     for attempt in range(self.retries + 1):
       # Erase all simulators per each attempt
@@ -217,12 +218,14 @@
         break
 
       # Exclude passed tests in next test attempt.
-      self.egtests_app.excluded_tests += self.test_results['attempts'][-1][
-          'passed']
+      passed_tests = passed_tests.union(
+          set(self.test_results['attempts'][-1]['passed']))
+      self.egtests_app.included_tests = list(running_tests - passed_tests)
+
       # crbug.com/987664 - for the case when
       # all tests passed but build was interrupted,
-      # excluded(passed) tests are equal to tests to run.
-      if set(self.egtests_app.excluded_tests) == running_tests:
+      # passed tests are equal to tests to run.
+      if passed_tests == running_tests:
         for status in cancelled_statuses:
           failure = self.test_results['attempts'][-1]['failed'].pop(
               status, None)
@@ -244,8 +247,9 @@
 
       if (not cancelled_attempt
           # If need to re-run less than 20 tests, 1 shard should be enough.
-          or (len(running_tests) - len(self.egtests_app.excluded_tests)
-              <= MAXIMUM_TESTS_PER_SHARD_FOR_RERUN)):
+          or (len(self.egtests_app.included_tests) <=
+              MAXIMUM_TESTS_PER_SHARD_FOR_RERUN)):
+
         shards = 1
 
     self.summary_log()
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm
index f064d10..1f641ad9 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator.mm
+++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -105,10 +105,6 @@
         @"IOS.CredentialExtension.FetchPasswordFailure",
     app_group::kCredentialExtensionFetchPasswordNilArgumentCount :
         @"IOS.CredentialExtension.FetchPasswordNilArgument",
-    app_group::kCredentialExtensionKeychainSavePasswordFailureCount :
-        @"IOS.CredentialExtension.KeychainSavePasswordFailureCount",
-    app_group::kCredentialExtensionSaveCredentialFailureCount :
-        @"IOS.CredentialExtension.SaveCredentialFailureCount",
   };
 
   NSUserDefaults* shared_defaults = app_group::GetGroupUserDefaults();
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 6dc6685..8101d37 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -289,8 +289,10 @@
 <translation id="3779810277399252432">No Internet connection.</translation>
 <translation id="3783017676699494206">Save Image</translation>
 <translation id="3789841737615482174">Install</translation>
+<translation id="380329542618494757">Name</translation>
 <translation id="3803696231112616155">Offer to translate this site</translation>
 <translation id="385051799172605136">Back</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="3892144330757387737">You'll find your history here</translation>
 <translation id="3897092660631435901">Menu</translation>
 <translation id="3913386780052199712">Signed in to Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index ad7e1ff..fe6e70c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -289,8 +289,10 @@
 <translation id="3779810277399252432">අන්තර්ජාල සබැඳුම නැත.</translation>
 <translation id="3783017676699494206">රූපය සුරකින්න</translation>
 <translation id="3789841737615482174">ස්ථාපනය</translation>
+<translation id="380329542618494757">නම</translation>
 <translation id="3803696231112616155">මෙම වෙබ් අඩවිය පරිවර්තන කිරීමට පිරිනමන්න</translation>
 <translation id="385051799172605136">ආපසු</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3892144330757387737">ඔබට ඔබේ ඉතිහාසය මෙහි හමුවනු ඇත</translation>
 <translation id="3897092660631435901">මෙනුව</translation>
 <translation id="3913386780052199712">Chrome වෙත පුරන ලදි</translation>
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index a464c71..4cce1cd 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -2786,6 +2786,13 @@
   }
 
   SnapshotTabHelper::FromWebState(webState)->SetDelegate(nil);
+
+  // TODO(crbug.com/1173610): Have BrowserCoordinator manage the NTP.
+  auto iterator = _ntpCoordinatorsForWebStates.find(webState);
+  if (iterator != _ntpCoordinatorsForWebStates.end()) {
+    [iterator->second stop];
+    _ntpCoordinatorsForWebStates.erase(iterator);
+  }
   NewTabPageTabHelper::FromWebState(webState)->SetDelegate(nil);
 }
 
@@ -4743,12 +4750,6 @@
   webState->SetKeepRenderProcessAlive(false);
 
   [self uninstallDelegatesForWebState:webState];
-
-  auto iterator = _ntpCoordinatorsForWebStates.find(webState);
-  if (iterator != _ntpCoordinatorsForWebStates.end()) {
-    [iterator->second stop];
-    _ntpCoordinatorsForWebStates.erase(iterator);
-  }
 }
 
 - (void)webStateList:(WebStateList*)webStateList
@@ -5356,6 +5357,9 @@
                                 forWebState:(web::WebState*)webState {
   if (NTPHelper->IsActive()) {
     DCHECK(![self ntpCoordinatorForWebState:webState]);
+    // Checks for leaks in |_ntpCoordinatorsForWebStates|.
+    DCHECK_LE(static_cast<int>(_ntpCoordinatorsForWebStates.size()),
+              self.browser->GetWebStateList()->count() - 1);
     // TODO(crbug.com/1173610): Have BrowserCoordinator manage the NTP.
     NewTabPageCoordinator* newTabPageCoordinator =
         [[NewTabPageCoordinator alloc] initWithBrowser:self.browser];
diff --git a/ios/chrome/common/app_group/app_group_metrics.h b/ios/chrome/common/app_group/app_group_metrics.h
index 6509197..7ce9738 100644
--- a/ios/chrome/common/app_group/app_group_metrics.h
+++ b/ios/chrome/common/app_group/app_group_metrics.h
@@ -70,13 +70,6 @@
 // for a password with a nil argument.
 extern NSString* const kCredentialExtensionFetchPasswordNilArgumentCount;
 
-// An app_group key for the number of times saving a newly generated password
-// to the keychain failed.
-extern NSString* const kCredentialExtensionKeychainSavePasswordFailureCount;
-
-// An app_group key for the number of times saving a new credential failed.
-extern NSString* const kCredentialExtensionSaveCredentialFailureCount;
-
 // Offsets the sessionID to avoid collision. The sessionID is limited to 1<<23.
 int AppGroupSessionID(int sessionID, AppGroupApplications application);
 
diff --git a/ios/chrome/common/app_group/app_group_metrics.mm b/ios/chrome/common/app_group/app_group_metrics.mm
index dd37a60..f9c9ac1 100644
--- a/ios/chrome/common/app_group/app_group_metrics.mm
+++ b/ios/chrome/common/app_group/app_group_metrics.mm
@@ -53,12 +53,6 @@
 NSString* const kCredentialExtensionFetchPasswordNilArgumentCount =
     @"CredentialExtensionFetchPasswordNilArgumentCount";
 
-NSString* const kCredentialExtensionKeychainSavePasswordFailureCount =
-    @"CredentialExtensionKeychainSavePasswordFailureCount";
-
-NSString* const kCredentialExtensionSaveCredentialFailureCount =
-    @"CredentialExtensionSaveCredentialFailureCount";
-
 // To avoid collision between session_ids from chrome or external
 // components, the session ID is offset depending on the application.
 int AppGroupSessionID(int session_id, AppGroupApplications application) {
diff --git a/ios/chrome/credential_provider_extension/password_util.h b/ios/chrome/credential_provider_extension/password_util.h
index d47d7d5e..d35e63fb 100644
--- a/ios/chrome/credential_provider_extension/password_util.h
+++ b/ios/chrome/credential_provider_extension/password_util.h
@@ -10,8 +10,4 @@
 // Queries Keychain Services for the passed identifier password.
 NSString* PasswordWithKeychainIdentifier(NSString* identifier);
 
-// Stores |password| in Keychain Services using |identifier| as its identifier
-// for later query. Returns |YES| if saving was successful and |NO| otherwise.
-BOOL StorePasswordInKeychain(NSString* password, NSString* identifier);
-
 #endif  // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_PASSWORD_UTIL_H_
diff --git a/ios/chrome/credential_provider_extension/password_util.mm b/ios/chrome/credential_provider_extension/password_util.mm
index 1f76545..4faf39f 100644
--- a/ios/chrome/credential_provider_extension/password_util.mm
+++ b/ios/chrome/credential_provider_extension/password_util.mm
@@ -39,28 +39,3 @@
   DLOG(ERROR) << "Error retrieving password, OSStatus: " << status;
   return @"";
 }
-
-BOOL StorePasswordInKeychain(NSString* password, NSString* identifier) {
-  if (!identifier) {
-    return NO;
-  }
-
-  NSData* passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];
-
-  NSDictionary* query = @{
-    (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
-    (__bridge id)
-    kSecAttrAccessible : (__bridge id)kSecAttrAccessibleWhenUnlocked,
-    (__bridge id)kSecValueData : passwordData,
-    (__bridge id)kSecAttrAccount : identifier,
-  };
-
-  OSStatus status = SecItemAdd((__bridge CFDictionaryRef)query, NULL);
-
-  if (status != errSecSuccess) {
-    UpdateUMACountForKey(
-        app_group::kCredentialExtensionKeychainSavePasswordFailureCount);
-  }
-
-  return status == errSecSuccess;
-}
diff --git a/ios/chrome/credential_provider_extension/password_util_unittest.mm b/ios/chrome/credential_provider_extension/password_util_unittest.mm
index 3020e5d..6e8a500 100644
--- a/ios/chrome/credential_provider_extension/password_util_unittest.mm
+++ b/ios/chrome/credential_provider_extension/password_util_unittest.mm
@@ -112,24 +112,4 @@
   ASSERT_TRUE([PasswordWithKeychainIdentifier(nil) isEqualToString:@""]);
 }
 
-// Tests storing passwords with StorePassword.
-TEST_F(PasswordUtilKeychainTest, CheckSavingPasswords) {
-  EXPECT_TRUE(StorePasswordInKeychain(kCredentialPassword1, kCredentialKey1));
-  EXPECT_TRUE(StorePasswordInKeychain(kCredentialPassword2, kCredentialKey2));
-
-  ASSERT_TRUE([PasswordWithKeychainIdentifier(kCredentialKey2)
-      isEqualToString:kCredentialPassword2]);
-  ASSERT_TRUE([PasswordWithKeychainIdentifier(kCredentialKey1)
-      isEqualToString:kCredentialPassword1]);
-  RemovePasswordForKey(kCredentialKey1);
-  ASSERT_TRUE([PasswordWithKeychainIdentifier(kCredentialKey2)
-      isEqualToString:kCredentialPassword2]);
-  RemovePasswordForKey(kCredentialKey2);
-}
-
-// Tests storing a password with an empty identifier
-TEST_F(PasswordUtilKeychainTest, StoreEmptyIdentifier) {
-  EXPECT_FALSE(StorePasswordInKeychain(@"", kCredentialPassword1));
-}
-
 }  // credential_provider_extension
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
index 49b3b73b..5c7734a 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
@@ -173,8 +173,7 @@
 - (void)showCreateNewPasswordUI {
   self.createPasswordCoordinator = [[NewPasswordCoordinator alloc]
       initWithBaseViewController:self.viewController
-                         context:self.context
-              serviceIdentifiers:self.serviceIdentifiers];
+                         context:self.context];
   [self.createPasswordCoordinator start];
 }
 
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
index 02346d67..8453a21 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
+++ b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
@@ -8,7 +8,6 @@
 #import <UIKit/UIKit.h>
 
 @class ASCredentialProviderExtensionContext;
-@class ASCredentialServiceIdentifier;
 
 // The coordinator for the new password feature.
 @interface NewPasswordCoordinator : NSObject
@@ -18,8 +17,6 @@
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
                        context:(ASCredentialProviderExtensionContext*)context
-            serviceIdentifiers:
-                (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
index dadaf99..98fa0bb 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
@@ -4,11 +4,6 @@
 
 #import "ios/chrome/credential_provider_extension/ui/new_password_coordinator.h"
 
-#import <AuthenticationServices/AuthenticationServices.h>
-
-#import "ios/chrome/common/credential_provider/credential.h"
-#import "ios/chrome/credential_provider_extension/password_util.h"
-#import "ios/chrome/credential_provider_extension/ui/new_password_mediator.h"
 #import "ios/chrome/credential_provider_extension/ui/new_password_view_controller.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -26,39 +21,25 @@
 // The extension context for the credential provider.
 @property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
 
-// The mediator for this coordinator.
-@property(nonatomic, strong) NewPasswordMediator* mediator;
-
-// The service identifiers this password is being created for.
-@property(nonatomic, strong)
-    NSArray<ASCredentialServiceIdentifier*>* serviceIdentifiers;
-
 @end
 
 @implementation NewPasswordCoordinator
 
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
-                       context:(ASCredentialProviderExtensionContext*)context
-            serviceIdentifiers:
-                (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers {
+                       context:(ASCredentialProviderExtensionContext*)context {
   self = [super init];
   if (self) {
     _baseViewController = baseViewController;
     _context = context;
-    _serviceIdentifiers = serviceIdentifiers;
   }
   return self;
 }
 
 - (void)start {
-  self.mediator = [[NewPasswordMediator alloc]
-      initWithServiceIdentifier:self.serviceIdentifiers.firstObject];
-
   NewPasswordViewController* newPasswordViewController =
       [[NewPasswordViewController alloc] init];
   newPasswordViewController.delegate = self;
-  newPasswordViewController.credentialHandler = self.mediator;
   self.viewController = [[UINavigationController alloc]
       initWithRootViewController:newPasswordViewController];
   [self.baseViewController presentViewController:self.viewController
@@ -80,14 +61,4 @@
   [self.baseViewController dismissViewControllerAnimated:YES completion:nil];
 }
 
-- (void)userSelectedCredential:(id<Credential>)credential {
-  NSString* password =
-      PasswordWithKeychainIdentifier(credential.keychainIdentifier);
-  ASPasswordCredential* ASCredential =
-      [ASPasswordCredential credentialWithUser:credential.user
-                                      password:password];
-  [self.context completeRequestWithSelectedCredential:ASCredential
-                                    completionHandler:nil];
-}
-
 @end
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator.h b/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
index 2fefa747..be34ab4 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
@@ -7,18 +7,9 @@
 
 #import <Foundation/Foundation.h>
 
-#import "ios/chrome/credential_provider_extension/ui/new_password_view_controller.h"
-
-@class ASCredentialServiceIdentifier;
-
 // This mediator fetches requirements and saves new credentials for its
 // consumer.
-@interface NewPasswordMediator : NSObject <NewCredentialHandler>
-
-- (instancetype)initWithServiceIdentifier:
-    (ASCredentialServiceIdentifier*)serviceIdentifier NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)init NS_UNAVAILABLE;
+@interface NewPasswordMediator : NSObject
 @end
 
 #endif  // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_NEW_PASSWORD_MEDIATOR_H_
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
index 4bab35859..e25ed1e 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
@@ -4,72 +4,9 @@
 
 #import "ios/chrome/credential_provider_extension/ui/new_password_mediator.h"
 
-#import <AuthenticationServices/AuthenticationServices.h>
-
-#include "ios/chrome/common/app_group/app_group_constants.h"
-#import "ios/chrome/common/credential_provider/archivable_credential.h"
-#import "ios/chrome/common/credential_provider/constants.h"
-#import "ios/chrome/common/credential_provider/user_defaults_credential_store.h"
-#import "ios/chrome/credential_provider_extension/password_util.h"
-
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface NewPasswordMediator ()
-
-// The service identifier the password is being created for,
-@property(nonatomic, strong) ASCredentialServiceIdentifier* serviceIdentifier;
-
-@end
-
 @implementation NewPasswordMediator
-
-- (instancetype)initWithServiceIdentifier:
-    (ASCredentialServiceIdentifier*)serviceIdentifier {
-  self = [super init];
-  if (self) {
-    _serviceIdentifier = serviceIdentifier;
-  }
-  return self;
-}
-
-#pragma mark - NewCredentialHandler
-
-- (ArchivableCredential*)createNewCredentialWithUsername:(NSString*)username
-                                                password:(NSString*)password {
-  NSString* uuid = [[NSUUID UUID] UUIDString];
-  if (!StorePasswordInKeychain(password, uuid)) {
-    return nil;
-  }
-
-  NSURL* url = [NSURL URLWithString:self.serviceIdentifier.identifier];
-  NSString* recordIdentifier =
-      [NSString stringWithFormat:@"CPE|%@|%@|%@", url.host, username,
-                                 self.serviceIdentifier.identifier];
-  NSString* validationIdentifier =
-      AppGroupUserDefaultsCredentialProviderUserID();
-
-  return [[ArchivableCredential alloc]
-           initWithFavicon:nil
-        keychainIdentifier:uuid
-                      rank:1
-          recordIdentifier:recordIdentifier
-         serviceIdentifier:self.serviceIdentifier.identifier
-               serviceName:url.host
-                      user:username
-      validationIdentifier:validationIdentifier];
-}
-
-- (void)saveNewCredential:(ArchivableCredential*)credential
-               completion:(void (^)(NSError* error))completion {
-  NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
-  UserDefaultsCredentialStore* store = [[UserDefaultsCredentialStore alloc]
-      initWithUserDefaults:app_group::GetGroupUserDefaults()
-                       key:key];
-
-  [store addCredential:credential];
-  [store saveDataWithCompletion:completion];
-}
-
 @end
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.h b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.h
index e56f544..ccde1ce 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.h
+++ b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.h
@@ -7,8 +7,6 @@
 
 #import <UIKit/UIKit.h>
 
-@class ArchivableCredential;
-@protocol Credential;
 @class NewPasswordViewController;
 
 @protocol NewPasswordViewControllerDelegate <NSObject>
@@ -17,22 +15,6 @@
 - (void)navigationCancelButtonWasPressedInNewPasswordViewController:
     (NewPasswordViewController*)viewController;
 
-// Called when the user selects a given credential
-- (void)userSelectedCredential:(id<Credential>)credential;
-
-@end
-
-@protocol NewCredentialHandler
-
-// Called when the user wants to create a new credential.
-- (ArchivableCredential*)createNewCredentialWithUsername:(NSString*)username
-                                                password:(NSString*)password;
-
-// Saves the given credential to disk and calls |completion| once the operation
-// is finished.
-- (void)saveNewCredential:(ArchivableCredential*)credential
-               completion:(void (^)(NSError* error))completion;
-
 @end
 
 // View Controller where a user can create a new credential and use a suggested
@@ -41,8 +23,6 @@
 
 @property(nonatomic, weak) id<NewPasswordViewControllerDelegate> delegate;
 
-@property(nonatomic, weak) id<NewCredentialHandler> credentialHandler;
-
 @end
 
 #endif  // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_NEW_PASSWORD_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
index bd0acf2..fcccd4dc 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_view_controller.mm
@@ -5,10 +5,7 @@
 #import "ios/chrome/credential_provider_extension/ui/new_password_view_controller.h"
 
 #include "base/notreached.h"
-#include "ios/chrome/common/app_group/app_group_metrics.h"
-#import "ios/chrome/common/credential_provider/archivable_credential.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
-#import "ios/chrome/credential_provider_extension/metrics_util.h"
 #import "ios/chrome/credential_provider_extension/ui/new_password_table_cell.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -144,45 +141,6 @@
       navigationCancelButtonWasPressedInNewPasswordViewController:self];
 }
 
-// Action for save button.
-- (void)saveButtonWasPressed {
-  NSIndexPath* usernameIndexPath =
-      [NSIndexPath indexPathForRow:NewPasswordTableCellTypeUsername
-                         inSection:0];
-  NewPasswordTableCell* usernameCell =
-      [self.tableView cellForRowAtIndexPath:usernameIndexPath];
-  NSString* username = usernameCell.textField.text;
-
-  NSIndexPath* passwordIndexPath =
-      [NSIndexPath indexPathForRow:NewPasswordTableCellTypePassword
-                         inSection:0];
-  NewPasswordTableCell* passwordCell =
-      [self.tableView cellForRowAtIndexPath:passwordIndexPath];
-  NSString* password = passwordCell.textField.text;
-
-  ArchivableCredential* credential =
-      [self.credentialHandler createNewCredentialWithUsername:username
-                                                     password:password];
-
-  if (!credential) {
-    // TODO (crbug.com/1223966): Show UI to alert the user to the problem.
-    return;
-  }
-
-  [self.credentialHandler
-      saveNewCredential:credential
-             completion:^(NSError* error) {
-               if (error) {
-                 UpdateUMACountForKey(
-                     app_group::kCredentialExtensionSaveCredentialFailureCount);
-                 // TODO (crbug.com/1223966): Show UI to alert the user to the
-                 // problem.
-                 return;
-               }
-               [self.delegate userSelectedCredential:credential];
-             }];
-}
-
 // Returns a new cancel button for the navigation bar.
 - (UIBarButtonItem*)navigationCancelButton {
   UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc]
@@ -197,8 +155,8 @@
 - (UIBarButtonItem*)navigationSaveButton {
   UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc]
       initWithBarButtonSystemItem:UIBarButtonSystemItemSave
-                           target:self
-                           action:@selector(saveButtonWasPressed)];
+                           target:nil
+                           action:nil];
   cancelButton.tintColor = [UIColor colorNamed:kBlueColor];
   return cancelButton;
 }
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 8b0a27b..fdcdc35 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 @@
-c5b96c7874dd987c8fb84c2452bd6d9a7a00941a
\ No newline at end of file
+9af19f37b50d9fe0da1f599f9d694d837ba70abd
\ 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 27160dd3..7cc69b7 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 @@
-ff2ad1330ed87a2248dc8289043e9296367ff557
\ No newline at end of file
+3a51332c77377868d5c8fda98ac23fb87835740f
\ 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 b68f599..f48c9ce8 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 @@
-d20c0080662f40092598e7ef46f005c5c265ec32
\ No newline at end of file
+159a4d20d793875b74d6cb2c11574b1980cb6299
\ 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 7aec6fb4..76c10c75 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 @@
-90cb88f4336cd8a6f3f59b45e1e71cb3d26e315c
\ No newline at end of file
+3d0bfa21446f69d2714178344dc57c312e484f7d
\ 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 ae0d4b92..cb9af5a 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 @@
-73c7dab06b963ee3848661155adaf14dc38cf41a
\ No newline at end of file
+74dea7125d33d0692b245eeff38c7f947fe77c50
\ 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 9137f334..ccb44cb 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 @@
-d244b5312d4a2dc6bac75b67d5933071bf01bfde
\ No newline at end of file
+b813a61bddbb15dc5ccf7c3b26fc6f51a5a98922
\ 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 4692ded..16d4491 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 @@
-9b39caa3af45e35755dd0d939bd45931fd0e6520
\ No newline at end of file
+80a93e77647176c7f3ad68434e2482c99a8f4148
\ 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 51f199af..4c4c851 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 @@
-523d196725eccb17ef89ae5f531aa25c003e0738
\ No newline at end of file
+6935c50839f8311fe26192154674caf69d827fee
\ 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 90f8164..a377b3a 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 @@
-a70957c10df018e943b1bc12bea32c6d69eba3b6
\ No newline at end of file
+8f49c597cbddd8824c03357592603ff1d75dee3d
\ 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 6c2fcb6..456508b 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 @@
-ea6f95cafe15bf6eab58efbcee3fa773d94695dc
\ No newline at end of file
+9dbcb734a39aa695905fe48c841f6975351e7259
\ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.h b/ios/public/provider/chrome/browser/chrome_browser_provider.h
index 70a6c8a0..cd4cfb8 100644
--- a/ios/public/provider/chrome/browser/chrome_browser_provider.h
+++ b/ios/public/provider/chrome/browser/chrome_browser_provider.h
@@ -106,8 +106,6 @@
   virtual ChromeIdentityService* GetChromeIdentityService();
   // Returns an instance of a Chrome trusted vault service.
   virtual ChromeTrustedVaultService* GetChromeTrustedVaultService();
-  // Returns risk data used in Wallet requests.
-  virtual std::string GetRiskData();
   // Creates and returns a new styled text field.
   virtual UITextField* CreateStyledTextField() const NS_RETURNS_RETAINED;
 
diff --git a/ios/public/provider/chrome/browser/chrome_browser_provider.mm b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
index 84b7106..17923282 100644
--- a/ios/public/provider/chrome/browser/chrome_browser_provider.mm
+++ b/ios/public/provider/chrome/browser/chrome_browser_provider.mm
@@ -70,10 +70,6 @@
   return nullptr;
 }
 
-std::string ChromeBrowserProvider::GetRiskData() {
-  return std::string();
-}
-
 UITextField* ChromeBrowserProvider::CreateStyledTextField() const {
   return nil;
 }
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 7b36e9b..267da9e8d 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -322,11 +322,6 @@
 const base::Feature kMemoryPressureBasedSourceBufferGC{
     "MemoryPressureBasedSourceBufferGC", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enable binding multiple shared images to a single GpuMemoryBuffer for
-// software decoded video frames created by the GpuMemoryBufferVideoFramePool.
-const base::Feature kMultiPlaneSoftwareVideoSharedImages{
-    "MultiPlaneSoftwareVideoSharedImages", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enable binding multiple shared images to a single GpuMemoryBuffer for video
 // frames created by video capture.
 const base::Feature kMultiPlaneVideoCaptureSharedImages {
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 4f7289d..8b023e8 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -166,7 +166,6 @@
 MEDIA_EXPORT extern const base::Feature kMediaPowerExperiment;
 MEDIA_EXPORT extern const base::Feature kMediaSessionWebRTC;
 MEDIA_EXPORT extern const base::Feature kMemoryPressureBasedSourceBufferGC;
-MEDIA_EXPORT extern const base::Feature kMultiPlaneSoftwareVideoSharedImages;
 MEDIA_EXPORT extern const base::Feature kMultiPlaneVideoCaptureSharedImages;
 MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo;
 MEDIA_EXPORT extern const base::Feature kPictureInPicture;
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
index e77fc70..efc4ea22 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -48,14 +48,14 @@
 
 namespace media {
 
-namespace {
-
-bool MultiPlaneVideoSharedImagesEnabled() {
-  return base::FeatureList::IsEnabled(kMultiPlaneSoftwareVideoSharedImages);
+bool GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled() {
+#if defined(OS_MAC)
+  return base::mac::IsAtMostOS10_15();
+#else
+  return false;
+#endif
 }
 
-}  // namespace
-
 // Implementation of a pool of GpuMemoryBuffers used to back VideoFrames.
 class GpuMemoryBufferVideoFramePool::PoolImpl
     : public base::RefCountedThreadSafe<
@@ -366,7 +366,7 @@
 // The number of shared images for a given format. Note that a single
 // GpuMemoryBuffer can be mapped to several SharedImages (one for each plane).
 size_t NumSharedImages(GpuVideoAcceleratorFactories::OutputFormat format) {
-  if (MultiPlaneVideoSharedImagesEnabled()) {
+  if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) {
     if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
       return 2;
     }
@@ -380,7 +380,7 @@
 size_t GpuMemoryBufferPlaneResourceIndexForPlane(
     GpuVideoAcceleratorFactories::OutputFormat format,
     size_t plane) {
-  if (MultiPlaneVideoSharedImagesEnabled()) {
+  if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) {
     if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
       return 0;
     }
@@ -393,7 +393,7 @@
 gfx::BufferPlane GetSharedImageBufferPlane(
     GpuVideoAcceleratorFactories::OutputFormat format,
     size_t plane) {
-  if (MultiPlaneVideoSharedImagesEnabled()) {
+  if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) {
     if (format == GpuVideoAcceleratorFactories::OutputFormat::NV12_SINGLE_GMB) {
       switch (plane) {
         case 0:
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.h b/media/video/gpu_memory_buffer_video_frame_pool.h
index 1f0e178..584372f 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.h
+++ b/media/video/gpu_memory_buffer_video_frame_pool.h
@@ -61,6 +61,10 @@
   // Allows injection of a base::SimpleTestClock for testing.
   void SetTickClockForTesting(const base::TickClock* tick_clock);
 
+  // Returns true if SharedImages should be bound for each individual plane
+  // of a multiplanar GpuMemoryBuffer. Exposed externally for testing.
+  static bool MultiPlaneVideoSharedImagesEnabled();
+
  private:
   class PoolImpl;
   scoped_refptr<PoolImpl> pool_impl_;
diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
index c761175..134d7f06 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
@@ -308,7 +308,7 @@
 
   EXPECT_NE(software_frame.get(), frame.get());
   EXPECT_EQ(PIXEL_FORMAT_NV12, frame->format());
-  if (base::FeatureList::IsEnabled(kMultiPlaneSoftwareVideoSharedImages)) {
+  if (GpuMemoryBufferVideoFramePool::MultiPlaneVideoSharedImagesEnabled()) {
     EXPECT_EQ(2u, frame->NumTextures());
     EXPECT_EQ(2u, sii_->shared_image_count());
   } else {
diff --git a/remoting/resources/remoting_strings_en-GB.xtb b/remoting/resources/remoting_strings_en-GB.xtb
index b3fd592f..8347e81 100644
--- a/remoting/resources/remoting_strings_en-GB.xtb
+++ b/remoting/resources/remoting_strings_en-GB.xtb
@@ -11,6 +11,7 @@
 <translation id="1546934824884762070">An unexpected error occurred. Please report this problem to the developers.</translation>
 <translation id="1697532407822776718">You're all set!</translation>
 <translation id="1742469581923031760">Connecting…</translation>
+<translation id="177040763384871009">To allow links clicked on the remote device to be opened on the client browser, you need to change the system's web browser to "<ph name="URL_FORWARDER_NAME" />".</translation>
 <translation id="177096447311351977">Channel IP for client: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation>
 <translation id="1897488610212723051">Delete</translation>
 <translation id="2009755455353575666">Connection failed</translation>
@@ -56,6 +57,7 @@
 <translation id="369442766917958684">Offline.</translation>
 <translation id="3695446226812920698">Find out how</translation>
 <translation id="3776024066357219166">Your Chrome Remote Desktop session has ended.</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="3897092660631435901">Menu</translation>
 <translation id="3905196214175737742">Invalid host owner domain.</translation>
 <translation id="3931191050278863510">Host stopped.</translation>
@@ -141,6 +143,7 @@
 <translation id="7434397035092923453">Access denied for client: <ph name="CLIENT_USERNAME" />.</translation>
 <translation id="7444276978508498879">Client connected: <ph name="CLIENT_USERNAME" />.</translation>
 <translation id="7526139040829362392">Change account</translation>
+<translation id="7535110896613603182">Open default apps settings</translation>
 <translation id="7628469622942688817">Remember my PIN on this device.</translation>
 <translation id="7649070708921625228">Help</translation>
 <translation id="7658239707568436148">Cancel</translation>
diff --git a/remoting/resources/remoting_strings_si.xtb b/remoting/resources/remoting_strings_si.xtb
index 314ec5b..5cd2047312 100644
--- a/remoting/resources/remoting_strings_si.xtb
+++ b/remoting/resources/remoting_strings_si.xtb
@@ -11,6 +11,7 @@
 <translation id="1546934824884762070">අනපේක්ෂිත දෝෂයක් හට ගැනිණි. කරුණාකර මෙම ගැටලුව සංවර්ධකයන් වෙත වාර්තා කරන්න.</translation>
 <translation id="1697532407822776718">ඔබ මුළුමනින් සුදානම්ය!</translation>
 <translation id="1742469581923031760">සම්බන්ධ වෙමින්…</translation>
+<translation id="177040763384871009">සේවාලාභී බ්‍රව්සරයේ දුරස්ථ උපාංගයේ ක්ලික් කළ සබැඳි විවෘත කිරීමට ඉඩ දීම සඳහා, ඔබ පද්ධතියේ වෙබ් බ්‍රව්සරය "<ph name="URL_FORWARDER_NAME" />" ලෙස වෙනස් කිරීම අවශ්‍යය.</translation>
 <translation id="177096447311351977">සේවාදායකයා සඳහා නාලිකාl IP: <ph name="CLIENT_GAIA_IDENTIFIER" /> ip='<ph name="CLIENT_IP_ADDRESS_AND_PORT" />' host_ip='<ph name="HOST_IP_ADDRESS_AND_PORT" />' channel='<ph name="CHANNEL_TYPE" />' connection='<ph name="CONNECTION_TYPE" />'.</translation>
 <translation id="1897488610212723051">මකන්න</translation>
 <translation id="2009755455353575666">සම්බන්ධතාව අසාර්ථක</translation>
@@ -56,6 +57,7 @@
 <translation id="369442766917958684">නොබැඳි</translation>
 <translation id="3695446226812920698">කෙසේදැයි දැන ගන්න</translation>
 <translation id="3776024066357219166">ඔබේ  Chrome දුරස්ථ වැඩබිම් වාරය අවසන් විය.</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="3897092660631435901">මෙනුව</translation>
 <translation id="3905196214175737742">අවලංගු සත්කාරක හිමිකරු වසම.</translation>
 <translation id="3931191050278863510">ධාරකය නතර කළා.</translation>
@@ -141,6 +143,7 @@
 <translation id="7434397035092923453">සෙවාලාභියා සඳහා ප්‍රවේශය ප්‍රතික්ෂේප විය: <ph name="CLIENT_USERNAME" />.</translation>
 <translation id="7444276978508498879">සේවාලාභියා සබඳවී ඇත: <ph name="CLIENT_USERNAME" />.</translation>
 <translation id="7526139040829362392">ගිණුම වෙනස් කරන්න</translation>
+<translation id="7535110896613603182">පෙරනිමි යෙදුම් සැකසීම් විවෘත කරන්න</translation>
 <translation id="7628469622942688817">මෙම උපාංගයෙහි මගේ PIN අංකය මතක තබා ගන්න.</translation>
 <translation id="7649070708921625228">උදවු</translation>
 <translation id="7658239707568436148">අවලංගු කරන්න</translation>
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index ec33324..39478f04 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -207,8 +207,6 @@
 
 #define SK_SUPPORT_LEGACY_AAA_CHOICE
 
-#define SK_DISABLE_ATLAS_PATH_RENDERER_WITH_COVERAGE_AA
-
 #define SK_SUPPORT_LEGACY_DRAWLOOPER
 
 #define SK_SUPPORT_LEGACY_RUNTIME_EFFECTS
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 867d0b5..58052747 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -10825,7 +10825,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -10911,7 +10911,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -11083,7 +11083,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -11169,7 +11169,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 9c33a0a..7f31004 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -49525,7 +49525,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49612,7 +49612,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49786,7 +49786,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49873,7 +49873,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50119,7 +50119,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50205,7 +50205,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50377,7 +50377,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50463,7 +50463,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50709,7 +50709,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50795,7 +50795,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50967,7 +50967,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.132"
+              "revision": "version:92.0.4515.134"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -51053,7 +51053,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.20"
+              "revision": "version:93.0.4577.22"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 64a8abcb..00ea425 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -421,7 +421,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.20',
+          'revision': 'version:93.0.4577.22',
         }
       ],
     },
@@ -445,7 +445,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.132',
+          'revision': 'version:92.0.4515.134',
         }
       ],
     },
@@ -493,7 +493,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.20',
+          'revision': 'version:93.0.4577.22',
         }
       ],
     },
@@ -517,7 +517,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.132',
+          'revision': 'version:92.0.4515.134',
         }
       ],
     },
@@ -565,7 +565,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.20',
+          'revision': 'version:93.0.4577.22',
         }
       ],
     },
@@ -589,7 +589,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.132',
+          'revision': 'version:92.0.4515.134',
         }
       ],
     },
diff --git a/third_party/blink/renderer/core/css/css_segmented_font_face.h b/third_party/blink/renderer/core/css/css_segmented_font_face.h
index 3e4b735..f343ceb 100644
--- a/third_party/blink/renderer/core/css/css_segmented_font_face.h
+++ b/third_party/blink/renderer/core/css/css_segmented_font_face.h
@@ -50,7 +50,7 @@
 // Iterating over the combined set, behaves as if all non-CSS-connected
 // FontFaces were stored after the CSS-connected ones.
 class FontFaceList : public GarbageCollected<FontFaceList> {
-  using FontFaceListPart = HeapListHashSet<Member<FontFace>>;
+  using FontFaceListPart = HeapLinkedHashSet<Member<FontFace>>;
 
  public:
   bool IsEmpty() const;
diff --git a/third_party/blink/renderer/core/dom/container_node.cc b/third_party/blink/renderer/core/dom/container_node.cc
index f82aadf..fc93700 100644
--- a/third_party/blink/renderer/core/dom/container_node.cc
+++ b/third_party/blink/renderer/core/dom/container_node.cc
@@ -674,6 +674,36 @@
   Node::Trace(visitor);
 }
 
+static bool ShouldMergeCombinedTextAfterRemoval(const Node& old_child) {
+  DCHECK(!old_child.parentNode()->GetForceReattachLayoutTree());
+
+  auto* const layout_object = old_child.GetLayoutObject();
+  if (!layout_object)
+    return false;
+
+  // Request to merge previous and next |LayoutNGTextCombine| of |child|.
+  // See http:://crbug.com/1227066
+  auto* const previous_sibling = layout_object->PreviousSibling();
+  if (!previous_sibling)
+    return false;
+  auto* const next_sibling = layout_object->NextSibling();
+  if (!next_sibling)
+    return false;
+  if (UNLIKELY(IsA<LayoutNGTextCombine>(previous_sibling)) &&
+      UNLIKELY(IsA<LayoutNGTextCombine>(next_sibling)))
+    return true;
+
+  // Request to merge combined texts in anonymous block.
+  // See http://crbug.com/1233432
+  if (!previous_sibling->IsAnonymousBlock() ||
+      !next_sibling->IsAnonymousBlock())
+    return false;
+
+  return UNLIKELY(
+             IsA<LayoutNGTextCombine>(previous_sibling->SlowLastChild())) &&
+         UNLIKELY(IsA<LayoutNGTextCombine>(next_sibling->SlowFirstChild()));
+}
+
 Node* ContainerNode::RemoveChild(Node* old_child,
                                  ExceptionState& exception_state) {
   // NotFoundError: Raised if oldChild is not a child of this node.
@@ -719,13 +749,9 @@
     return nullptr;
   }
 
-  if (auto* layout_object = child->GetLayoutObject()) {
-    // Request to merge previous and next |LayoutNGTextCombine| of |child|.
-    // See http:://crbug.com/1227066
-    if (UNLIKELY(IsA<LayoutNGTextCombine>(layout_object->PreviousSibling())) &&
-        UNLIKELY(IsA<LayoutNGTextCombine>(layout_object->NextSibling())))
-      SetForceReattachLayoutTree();
-  }
+  if (!GetForceReattachLayoutTree() &&
+      UNLIKELY(ShouldMergeCombinedTextAfterRemoval(*child)))
+    SetForceReattachLayoutTree();
 
   {
     HTMLFrameOwnerElement::PluginDisposeSuspendScope suspend_plugin_dispose;
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
index c39329c..2460c32f 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
@@ -551,6 +551,129 @@
                                    should_assume_content_is_always_editable);
 }
 
+void DeleteSelectionCommand::RemoveCompletelySelectedNodes(
+    Node* start_node,
+    EditingState* editing_state) {
+  HeapVector<Member<Node>> nodes_to_be_removed;
+  Node* node = start_node;
+
+  GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kEditing);
+
+  // Collecting nodes that can be removed from |start_node|.
+  while (node && node != downstream_end_.AnchorNode()) {
+    if (ComparePositions(FirstPositionInOrBeforeNode(*node), downstream_end_) >=
+        0)
+      break;
+
+    if (!downstream_end_.AnchorNode()->IsDescendantOf(node)) {
+      nodes_to_be_removed.push_back(node);
+      node = NodeTraversal::NextSkippingChildren(*node);
+      continue;
+    }
+
+    Node& last_within_or_self_node = NodeTraversal::LastWithinOrSelf(*node);
+    if (downstream_end_.AnchorNode() == last_within_or_self_node &&
+        downstream_end_.ComputeEditingOffset() >=
+            CaretMaxOffset(&last_within_or_self_node)) {
+      nodes_to_be_removed.push_back(node);
+      break;
+    }
+
+    node = NodeTraversal::Next(*node);
+  }
+
+  // Update leading, trailing whitespace position.
+  if (!nodes_to_be_removed.IsEmpty()) {
+    leading_whitespace_ = ComputePositionForNodeRemoval(
+        leading_whitespace_, *(nodes_to_be_removed[0].Get()));
+    trailing_whitespace_ = ComputePositionForNodeRemoval(
+        trailing_whitespace_,
+        *(nodes_to_be_removed[nodes_to_be_removed.size() - 1].Get()));
+  }
+
+  // Check if place holder is needed before actually removing nodes because
+  // this requires document.NeedsLayoutTreeUpdate() returning false.
+  if (!need_placeholder_) {
+    need_placeholder_ = std::any_of(
+        nodes_to_be_removed.begin(), nodes_to_be_removed.end(),
+        [&](Node* node) {
+          if (node == start_block_) {
+            VisiblePosition previous = PreviousPositionOf(
+                VisiblePosition::FirstPositionInNode(*start_block_.Get()));
+            if (previous.IsNotNull() && !IsEndOfBlock(previous))
+              return true;
+          }
+          if (node == end_block_) {
+            VisiblePosition next = NextPositionOf(
+                VisiblePosition::LastPositionInNode(*end_block_.Get()));
+            if (next.IsNotNull() && !IsStartOfBlock(next))
+              return true;
+          }
+          return false;
+        });
+  }
+
+  // Actually remove the nodes in |nodes_to_be_removed|.
+  for (Node* node_to_be_removed : nodes_to_be_removed) {
+    if (!downstream_end_.AnchorNode()->IsDescendantOf(node_to_be_removed)) {
+      downstream_end_ =
+          ComputePositionForNodeRemoval(downstream_end_, *(node_to_be_removed));
+    }
+
+    if (start_root_ != end_root_ &&
+        !(node_to_be_removed->IsDescendantOf(start_root_.Get()) &&
+          node_to_be_removed->IsDescendantOf(end_root_.Get()))) {
+      // If a node is not in both the start and end editable roots, remove it
+      // only if its inside an editable region.
+      if (!HasEditableStyle(*node_to_be_removed->parentNode())) {
+        // Don't remove non-editable atomic nodes.
+        if (!node_to_be_removed->hasChildren())
+          continue;
+        // Search this non-editable region for editable regions to empty.
+        // Don't remove editable regions that are inside non-editable ones, just
+        // clear them.
+        RemoveAllChildrenIfPossible(To<ContainerNode>(node_to_be_removed),
+                                    editing_state,
+                                    kDoNotAssumeContentIsAlwaysEditable);
+        if (editing_state->IsAborted())
+          return;
+
+        continue;
+      }
+    }
+
+    if (IsTableStructureNode(node_to_be_removed) ||
+        IsRootEditableElement(*node_to_be_removed)) {
+      // Do not remove an element of table structure; remove its contents.
+      // Likewise for the root editable element.
+      RemoveAllChildrenIfPossible(To<ContainerNode>(node_to_be_removed),
+                                  editing_state,
+                                  kDoNotAssumeContentIsAlwaysEditable);
+      if (editing_state->IsAborted())
+        return;
+
+      // Make sure empty cell has some height, if a placeholder can be inserted.
+      GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kEditing);
+      LayoutObject* layout_obj = node_to_be_removed->GetLayoutObject();
+      if (layout_obj && layout_obj->IsTableCell() &&
+          To<LayoutBox>(layout_obj)->ContentHeight() <= 0) {
+        Position first_editable_position =
+            FirstEditablePositionInNode(node_to_be_removed);
+        if (first_editable_position.IsNotNull())
+          InsertBlockPlaceholder(first_editable_position, editing_state);
+      }
+      continue;
+    }
+
+    ending_position_ =
+        ComputePositionForNodeRemoval(ending_position_, *node_to_be_removed);
+    CompositeEditCommand::RemoveNode(node_to_be_removed, editing_state,
+                                     kDoNotAssumeContentIsAlwaysEditable);
+    if (editing_state->IsAborted())
+      return;
+  }
+}
+
 static void UpdatePositionForTextRemoval(Text* node,
                                          int offset,
                                          int count,
@@ -690,36 +813,10 @@
                          upstream_end_.ComputeOffsetInContainerNode());
     }
 
-    // handle deleting all nodes that are completely selected
-    while (node && node != downstream_end_.AnchorNode()) {
-      if (ComparePositions(FirstPositionInOrBeforeNode(*node),
-                           downstream_end_) >= 0) {
-        // NodeTraversal::nextSkippingChildren just blew past the end position,
-        // so stop deleting
-        node = nullptr;
-      } else if (!downstream_end_.AnchorNode()->IsDescendantOf(node)) {
-        Node* next_node = NodeTraversal::NextSkippingChildren(*node);
-        // if we just removed a node from the end container, update end position
-        // so the check above will work
-        downstream_end_ = ComputePositionForNodeRemoval(downstream_end_, *node);
-        RemoveNode(node, editing_state);
-        if (editing_state->IsAborted())
-          return;
-        node = next_node;
-      } else {
-        GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kEditing);
-        Node& n = NodeTraversal::LastWithinOrSelf(*node);
-        if (downstream_end_.AnchorNode() == n &&
-            downstream_end_.ComputeEditingOffset() >= CaretMaxOffset(&n)) {
-          RemoveNode(node, editing_state);
-          if (editing_state->IsAborted())
-            return;
-          node = nullptr;
-        } else {
-          node = NodeTraversal::Next(*node);
-        }
-      }
-    }
+    // Delete all nodes that are completely selected
+    RemoveCompletelySelectedNodes(node, editing_state);
+    if (editing_state->IsAborted())
+      return;
 
     // TODO(editing-dev): Hoist UpdateStyleAndLayout
     // to caller. See http://crbug.com/590369 for more details.
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.h b/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
index c7787fe..2dccf49 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.h
@@ -72,6 +72,8 @@
                   EditingState*,
                   ShouldAssumeContentIsAlwaysEditable =
                       kDoNotAssumeContentIsAlwaysEditable) override;
+  void RemoveCompletelySelectedNodes(Node* start_node,
+                                     EditingState* editing_state);
   void DeleteTextFromNode(Text*, unsigned, unsigned) override;
   void RemoveRedundantBlocks(EditingState*);
 
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index fdad106..fc6737aa 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -521,7 +521,8 @@
   if (!before_child && IsAfterContent(LastChild()))
     before_child = LastChild();
 
-  if (!new_child->IsInline() && !new_child->IsFloatingOrOutOfFlowPositioned()) {
+  if (!new_child->IsInline() && !new_child->IsFloatingOrOutOfFlowPositioned() &&
+      !new_child->IsTablePart()) {
     if (UNLIKELY(RuntimeEnabledFeatures::LayoutNGBlockInInlineEnabled())) {
       // TODO(crbug.com/716930): This logic is still at the prototype level and
       // to be re-written, but landed under the runtime flag to allow us working
@@ -537,15 +538,13 @@
       anonymous_box->AddChild(new_child);
       return;
     }
-    if (!new_child->IsTablePart()) {
-      LayoutBlockFlow* new_box =
-          CreateAnonymousContainerForBlockChildren(/* split_flow */ true);
-      LayoutBoxModelObject* old_continuation = Continuation();
-      SetContinuation(new_box);
+    LayoutBlockFlow* new_box =
+        CreateAnonymousContainerForBlockChildren(/* split_flow */ true);
+    LayoutBoxModelObject* old_continuation = Continuation();
+    SetContinuation(new_box);
 
-      SplitFlow(before_child, new_box, new_child, old_continuation);
-      return;
-    }
+    SplitFlow(before_child, new_box, new_child, old_continuation);
+    return;
   }
 
   LayoutBoxModelObject::AddChild(new_child, before_child);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
index ac1a570a..ecd99b8 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
@@ -783,6 +783,39 @@
             ToSimpleLayoutTree(root_layout_object));
 }
 
+// http;//crbug.com/1233432
+TEST_F(LayoutNGTextCombineTest, RemoveBlockChild) {
+  InsertStyleElement(
+      "div { text-combine-upright: all; }"
+      "div { writing-mode: vertical-rl; }");
+  SetBodyInnerHTML("<div id=root>ab<p id=block>XY</p>de</div>");
+  auto& root = *GetElementById("root");
+
+  EXPECT_EQ(R"DUMP(
+LayoutNGBlockFlow DIV id="root"
+  +--LayoutNGBlockFlow (anonymous)
+  |  +--LayoutNGTextCombine (anonymous)
+  |  |  +--LayoutText #text "ab"
+  +--LayoutNGBlockFlow P id="block"
+  |  +--LayoutNGTextCombine (anonymous)
+  |  |  +--LayoutText #text "XY"
+  +--LayoutNGBlockFlow (anonymous)
+  |  +--LayoutNGTextCombine (anonymous)
+  |  |  +--LayoutText #text "de"
+)DUMP",
+            ToSimpleLayoutTree(*root.GetLayoutObject()));
+
+  GetElementById("block")->remove();
+  RunDocumentLifecycle();
+  EXPECT_EQ(R"DUMP(
+LayoutNGBlockFlow DIV id="root"
+  +--LayoutNGTextCombine (anonymous)
+  |  +--LayoutText #text "ab"
+  |  +--LayoutText #text "de"
+)DUMP",
+            ToSimpleLayoutTree(*root.GetLayoutObject()));
+}
+
 TEST_F(LayoutNGTextCombineTest, RemoveChildCombine) {
   InsertStyleElement(
       "c { text-combine-upright: all; }"
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
index 3d1e84d..cd1b4dd 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
@@ -93,10 +93,12 @@
   bool IsBidiEnabled() const { return Data().is_bidi_enabled_; }
   TextDirection BaseDirection() const { return Data().BaseDirection(); }
 
-  bool HasLineEvenIfEmpty() { return EnsureData().has_line_even_if_empty_; }
+  bool HasLineEvenIfEmpty() const {
+    return EnsureData().has_line_even_if_empty_;
+  }
   bool HasRuby() const { return Data().has_ruby_; }
 
-  bool IsEmptyInline() {
+  bool IsEmptyInline() const {
     return !HasLineEvenIfEmpty() && EnsureData().is_empty_inline_;
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
index 3bb4dd5..83998f7d 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
@@ -23,7 +23,8 @@
     const NGLayoutInputNode& child,
     NGCacheSlot cache_slot,
     const absl::optional<NGConstraintSpace::MathTargetStretchBlockSizes>
-        target_stretch_block_sizes) {
+        target_stretch_block_sizes,
+    const absl::optional<LayoutUnit> target_stretch_inline_size) {
   const ComputedStyle& parent_style = parent_node.Style();
   const ComputedStyle& child_style = child.Style();
   DCHECK(child.CreatesNewFormattingContext());
@@ -35,8 +36,9 @@
   builder.SetCacheSlot(cache_slot);
   if (target_stretch_block_sizes)
     builder.SetTargetStretchBlockSizes(*target_stretch_block_sizes);
+  if (target_stretch_inline_size)
+    builder.SetTargetStretchInlineSize(*target_stretch_inline_size);
 
-  // TODO(crbug.com/1124301): add target inline stretch size.
   // TODO(crbug.com/1125137): add ink metrics.
   return builder.ToConstraintSpace();
 }
@@ -246,9 +248,7 @@
             base_code_point))
       return false;
 
-    // TODO(crbug.com/1124301) Implement horizontal stretchy operators.
-    if (element->HasBooleanProperty(MathMLOperatorElement::kStretchy) &&
-        element->GetOperatorContent().is_vertical)
+    if (element->HasBooleanProperty(MathMLOperatorElement::kStretchy))
       return true;
 
     if (element->HasBooleanProperty(MathMLOperatorElement::kLargeOp) &&
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.h b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.h
index 1ecf3b5..7196176 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.h
@@ -28,7 +28,9 @@
     const NGLayoutInputNode&,
     const NGCacheSlot = NGCacheSlot::kLayout,
     const absl::optional<NGConstraintSpace::MathTargetStretchBlockSizes>
-        target_stretch_block_sizes = absl::nullopt);
+        target_stretch_block_sizes = absl::nullopt,
+    const absl::optional<LayoutUnit> target_stretch_inline_size =
+        absl::nullopt);
 
 MinMaxSizesResult ComputeMinAndMaxContentContributionForMathChild(
     const ComputedStyle& parent_style,
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_operator_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_operator_layout_algorithm.cc
index dd145cc4..1e0fe07 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_operator_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_operator_layout_algorithm.cc
@@ -59,61 +59,66 @@
   auto* element = DynamicTo<MathMLOperatorElement>(Node().GetDOMNode());
   if (element->HasBooleanProperty(MathMLOperatorElement::kStretchy)) {
     // "If the operator has the stretchy property:"
-    // TODO(http://crbug.com/1124301) Implement horizontal stretchy operators.
-    DCHECK(element->GetOperatorContent().is_vertical);
-    // "Otherwise, the stretch axis of the operator is block."
-    if (auto target_stretch_block_sizes =
-            ConstraintSpace().TargetStretchBlockSizes()) {
-      target_stretch_ascent = target_stretch_block_sizes->ascent;
-      target_stretch_descent = target_stretch_block_sizes->descent;
-      if (element->HasBooleanProperty(MathMLOperatorElement::kSymmetric)) {
-        // "If the operator has the symmetric property then set the target
-        // sizes Tascent and Tdescent to Sascent and Sdescent respectively:
-        // Sascent = max( Uascent − AxisHeight, Udescent + AxisHeight ) +
-        // AxisHeight
-        // Sdescent = max( Uascent − AxisHeight, Udescent + AxisHeight ) −
-        // AxisHeight"
-        LayoutUnit axis = MathAxisHeight(Style());
-        LayoutUnit half_target_stretch_size = std::max(
-            target_stretch_ascent - axis, target_stretch_descent + axis);
-        target_stretch_ascent = half_target_stretch_size + axis;
-        target_stretch_descent = half_target_stretch_size - axis;
+    if (!element->GetOperatorContent().is_vertical) {
+      // "If the stretch axis of the operator is inline."
+      if (ConstraintSpace().HasTargetStretchInlineSize())
+        operator_target_size = ConstraintSpace().TargetStretchInlineSize();
+    } else {
+      // "Otherwise, the stretch axis of the operator is block."
+      if (auto target_stretch_block_sizes =
+              ConstraintSpace().TargetStretchBlockSizes()) {
+        target_stretch_ascent = target_stretch_block_sizes->ascent;
+        target_stretch_descent = target_stretch_block_sizes->descent;
+        if (element->HasBooleanProperty(MathMLOperatorElement::kSymmetric)) {
+          // "If the operator has the symmetric property then set the target
+          // sizes Tascent and Tdescent to Sascent and Sdescent respectively:
+          // Sascent = max( Uascent − AxisHeight, Udescent + AxisHeight ) +
+          // AxisHeight
+          // Sdescent = max( Uascent − AxisHeight, Udescent + AxisHeight ) −
+          // AxisHeight"
+          LayoutUnit axis = MathAxisHeight(Style());
+          LayoutUnit half_target_stretch_size = std::max(
+              target_stretch_ascent - axis, target_stretch_descent + axis);
+          target_stretch_ascent = half_target_stretch_size + axis;
+          target_stretch_descent = half_target_stretch_size - axis;
+        }
+        operator_target_size = target_stretch_ascent + target_stretch_descent;
+        // "If minsize < 0 then set minsize to 0."
+        LayoutUnit min_size =
+            (Style().GetMathMinSize().GetType() == Length::kAuto
+                 ? LayoutUnit(Style().FontSize())
+                 : ValueForLength(Style().GetMathMinSize(),
+                                  operator_target_size))
+                .ClampNegativeToZero();
+        // "If maxsize < minsize then set maxsize to minsize."
+        LayoutUnit max_size = std::max<LayoutUnit>(
+            (Style().GetMathMaxSize().GetType() == Length::kAuto
+                 ? LayoutUnit(kIntMaxForLayoutUnit)
+                 : ValueForLength(Style().GetMathMaxSize(),
+                                  operator_target_size)),
+            min_size);
+        // "Then 0 ≤ minsize ≤ maxsize:"
+        DCHECK(LayoutUnit() <= min_size && min_size <= max_size);
+        if (operator_target_size <= LayoutUnit()) {
+          // "If T ≤ 0 then set Tascent to minsize/2 and then set Tdescent to
+          // minsize - Tascent."
+          target_stretch_ascent = min_size / 2;
+          target_stretch_descent = min_size - target_stretch_ascent;
+        } else if (operator_target_size < min_size) {
+          // "Otherwise, if 0 < T < minsize then first multiply Tascent by
+          // minsize / T and then set Tdescent to minsize - Tascent."
+          target_stretch_ascent =
+              target_stretch_ascent.MulDiv(min_size, operator_target_size);
+          target_stretch_descent = min_size - target_stretch_ascent;
+        } else if (max_size < operator_target_size) {
+          // "Otherwise, if maxsize < T then first multiply Tascent by maxsize
+          // / T and then set Tdescent to maxsize − Tascent."
+          target_stretch_ascent =
+              target_stretch_descent.MulDiv(max_size, operator_target_size);
+          target_stretch_descent = max_size - target_stretch_ascent;
+        }
+        operator_target_size = target_stretch_ascent + target_stretch_descent;
       }
-      operator_target_size = target_stretch_ascent + target_stretch_descent;
-      // "If minsize < 0 then set minsize to 0."
-      LayoutUnit min_size =
-          (Style().GetMathMinSize().GetType() == Length::kAuto
-               ? LayoutUnit(Style().FontSize())
-               : ValueForLength(Style().GetMathMinSize(), operator_target_size))
-              .ClampNegativeToZero();
-      // "If maxsize < minsize then set maxsize to minsize."
-      LayoutUnit max_size = std::max<LayoutUnit>(
-          (Style().GetMathMaxSize().GetType() == Length::kAuto
-               ? LayoutUnit(kIntMaxForLayoutUnit)
-               : ValueForLength(Style().GetMathMaxSize(),
-                                operator_target_size)),
-          min_size);
-      // "Then 0 ≤ minsize ≤ maxsize:"
-      DCHECK(LayoutUnit() <= min_size && min_size <= max_size);
-      if (operator_target_size <= LayoutUnit()) {
-        // "If T ≤ 0 then set Tascent to minsize/2 and then set Tdescent to
-        // minsize - Tascent."
-        target_stretch_ascent = min_size / 2;
-        target_stretch_descent = min_size - target_stretch_ascent;
-      } else if (operator_target_size < min_size) {
-        // "Otherwise, if 0 < T < minsize then first multiply Tascent by
-        // minsize / T and then set Tdescent to minsize - Tascent."
-        target_stretch_ascent =
-            target_stretch_ascent.MulDiv(min_size, operator_target_size);
-        target_stretch_descent = min_size - target_stretch_ascent;
-      } else if (max_size < operator_target_size) {
-        // "Otherwise, if maxsize < T then first multiply Tascent by maxsize /
-        // T and then set Tdescent to maxsize − Tascent."
-        target_stretch_ascent =
-            target_stretch_descent.MulDiv(max_size, operator_target_size);
-        target_stretch_descent = max_size - target_stretch_ascent;
-      }
-      operator_target_size = target_stretch_ascent + target_stretch_descent;
     }
   } else {
     // "If the operator has the largeop property and if math-style on the <mo>
@@ -142,7 +147,8 @@
   // TODO(http://crbug.com/1124301): The spec says the inline size should be
   // the one of the stretched glyph, but LayoutNG currently relies on the
   // min-max sizes. This means there can be excessive gap around vertical
-  // stretchy operators.
+  // stretchy operators and that unstretched size will be used for horizontal
+  // stretchy operators. See also NGMathMLPainter::PaintOperator.
   LayoutUnit operator_ascent = LayoutUnit::FromFloatFloor(metrics.ascent);
   LayoutUnit operator_descent = LayoutUnit::FromFloatFloor(metrics.descent);
 
@@ -182,11 +188,21 @@
   auto* element = DynamicTo<MathMLOperatorElement>(Node().GetDOMNode());
   if (element->HasBooleanProperty(MathMLOperatorElement::kStretchy)) {
     // "If the operator has the stretchy property:"
-    // TODO(http://crbug.com/1124301) Implement horizontal stretchy operators.
-    DCHECK(element->GetOperatorContent().is_vertical);
-    // "Otherwise, the stretch axis of the operator is block."
-    sizes =
-        GetMinMaxSizesForVerticalStretchyOperator(Style(), GetBaseCodePoint());
+    if (!element->GetOperatorContent().is_vertical) {
+      // "If the stretch axis of the operator is inline."
+      // The spec current says we should rely on the layout algorithm of
+      // § 3.2.1.1 Layout of <mtext>. Instead, we perform horizontal stretching
+      // with target size of 0 so that the size of the base glyph is used.
+      StretchyOperatorShaper shaper(GetBaseCodePoint(),
+                                    OpenTypeMathStretchData::Horizontal);
+      StretchyOperatorShaper::Metrics metrics;
+      shaper.Shape(&Style().GetFont(), 0, &metrics);
+      sizes.Encompass(LayoutUnit(metrics.advance));
+    } else {
+      // "Otherwise, the stretch axis of the operator is block."
+      sizes = GetMinMaxSizesForVerticalStretchyOperator(Style(),
+                                                        GetBaseCodePoint());
+    }
   } else {
     // "If the operator has the largeop property and if math-style on the <mo>
     // element is normal."
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_under_over_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_under_over_layout_algorithm.cc
index 930daa88..7e49a51 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_under_over_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_under_over_layout_algorithm.cc
@@ -135,6 +135,17 @@
   return attribute_value && *attribute_value;
 }
 
+static bool IsStretchyOperatorWithInlineStretchAxis(const NGBlockNode& node) {
+  if (auto* core_operator =
+          DynamicTo<MathMLOperatorElement>(node.GetDOMNode())) {
+    // TODO(crbug.com/1124298): Implement embellished operators.
+    return core_operator->HasBooleanProperty(
+               MathMLOperatorElement::kStretchy) &&
+           !core_operator->GetOperatorContent().is_vertical;
+  }
+  return false;
+}
+
 }  // namespace
 
 NGMathUnderOverLayoutAlgorithm::NGMathUnderOverLayoutAlgorithm(
@@ -211,11 +222,67 @@
   }
   UnderOverVerticalParameters parameters = GetUnderOverVerticalParameters(
       Style(), is_base_large_operator, is_base_stretchy_in_inline_axis);
-  // TODO(crbug.com/1124301): handle stretchy operators.
+
+  // https://w3c.github.io/mathml-core/#dfn-algorithm-for-stretching-operators-along-the-inline-axis
+  LayoutUnit inline_stretch_size;
+  auto UpdateInlineStretchSize =
+      [&](const scoped_refptr<const NGLayoutResult>& result) {
+        NGFragment fragment(
+            ConstraintSpace().GetWritingDirection(),
+            To<NGPhysicalBoxFragment>(result->PhysicalFragment()));
+        inline_stretch_size =
+            std::max(inline_stretch_size, fragment.InlineSize());
+      };
+
+  // "Perform layout without any stretch size constraint on all the items of
+  // LNotToStretch"
+  bool layout_remaining_items_with_zero_inline_stretch_size = true;
+  for (NGLayoutInputNode child = Node().FirstChild(); child;
+       child = child.NextSibling()) {
+    if (child.IsOutOfFlowPositioned() ||
+        IsStretchyOperatorWithInlineStretchAxis(To<NGBlockNode>(child)))
+      continue;
+    const auto child_constraint_space = CreateConstraintSpaceForMathChild(
+        Node(), ChildAvailableSize(), ConstraintSpace(), child,
+        NGCacheSlot::kMeasure);
+    const auto child_layout_result = To<NGBlockNode>(child).Layout(
+        child_constraint_space, nullptr /* break_token */);
+    UpdateInlineStretchSize(child_layout_result);
+    layout_remaining_items_with_zero_inline_stretch_size = false;
+  }
+
+  if (UNLIKELY(layout_remaining_items_with_zero_inline_stretch_size)) {
+    // "If LNotToStretch is empty, perform layout with stretch size constraint 0
+    // on all the items of LToStretch.
+    for (NGLayoutInputNode child = Node().FirstChild(); child;
+         child = child.NextSibling()) {
+      if (child.IsOutOfFlowPositioned())
+        continue;
+      DCHECK(IsStretchyOperatorWithInlineStretchAxis(To<NGBlockNode>(child)));
+      LayoutUnit zero_stretch_size;
+      const auto child_constraint_space = CreateConstraintSpaceForMathChild(
+          Node(), ChildAvailableSize(), ConstraintSpace(), child,
+          NGCacheSlot::kMeasure, absl::nullopt, zero_stretch_size);
+      const auto child_layout_result = To<NGBlockNode>(child).Layout(
+          child_constraint_space, nullptr /* break_token */);
+      UpdateInlineStretchSize(child_layout_result);
+    }
+  }
+
+  auto CreateConstraintSpaceForUnderOverChild = [&](const NGBlockNode child) {
+    // TODO(crbug.com/1124298): If there is a stretch constraint, use it.
+    return IsStretchyOperatorWithInlineStretchAxis(child)
+               ? CreateConstraintSpaceForMathChild(
+                     Node(), ChildAvailableSize(), ConstraintSpace(), child,
+                     NGCacheSlot::kLayout, absl::nullopt, inline_stretch_size)
+               : CreateConstraintSpaceForMathChild(Node(), ChildAvailableSize(),
+                                                   ConstraintSpace(), child,
+                                                   NGCacheSlot::kLayout);
+  };
+
   // TODO(crbug.com/1125136): take into account italic correction.
 
-  auto base_space = CreateConstraintSpaceForMathChild(
-      Node(), ChildAvailableSize(), ConstraintSpace(), base);
+  const auto base_space = CreateConstraintSpaceForUnderOverChild(base);
   auto base_layout_result = base.Layout(base_space);
   auto base_margins =
       ComputeMarginsFor(base_space, base.Style(), ConstraintSpace());
@@ -228,8 +295,7 @@
   // All children are positioned centered relative to the container (and
   // therefore centered relative to themselves).
   if (over) {
-    auto over_space = CreateConstraintSpaceForMathChild(
-        Node(), ChildAvailableSize(), ConstraintSpace(), over);
+    const auto over_space = CreateConstraintSpaceForUnderOverChild(over);
     scoped_refptr<const NGLayoutResult> over_layout_result =
         over.Layout(over_space);
     NGBoxStrut over_margins =
@@ -277,8 +343,7 @@
   block_offset += base_fragment.BlockSize() + base_margins.block_end;
 
   if (under) {
-    auto under_space = CreateConstraintSpaceForMathChild(
-        Node(), ChildAvailableSize(), ConstraintSpace(), under);
+    const auto under_space = CreateConstraintSpaceForUnderOverChild(under);
     scoped_refptr<const NGLayoutResult> under_layout_result =
         under.Layout(under_space);
     NGBoxStrut under_margins =
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
index 2211079..9e78847 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
@@ -114,7 +114,7 @@
             *container_builder_.BfcBlockOffset()};
   }
 
-  NGInputNodeType Node() const { return node_; }
+  const NGInputNodeType& Node() const { return node_; }
 
   const NGBreakTokenType* BreakToken() const { return break_token_.get(); }
 
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
index 421815d..2c27821 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
 #include "third_party/blink/renderer/core/frame/page_scale_constraints_set.h"
+#include "third_party/blink/renderer/core/frame/root_frame_viewport.h"
 #include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_control_element.h"
 #include "third_party/blink/renderer/core/html/html_anchor_element.h"
@@ -333,12 +334,8 @@
   if (font_size_check_enabled_)
     mobile_friendliness_.small_text_ratio = text_area_sizes_.SmallTextRatio();
 
-  // As long as evaluated as MF, TextOutsideViewportPercentage UKM must not be
-  // -1 (means unknown). Even if there is no call of
-  // ComputeTextContentOutsideViewport(), as far as there are FCP notification
-  // and unload event, that value is not -1 anymore and to be 0.
-  mobile_friendliness_.text_content_outside_viewport_percentage = std::max(
-      0, mobile_friendliness_.text_content_outside_viewport_percentage);
+  mobile_friendliness_.text_content_outside_viewport_percentage =
+      ComputeContentOutsideViewport();
 
   frame_view_->DidChangeMobileFriendliness(mobile_friendliness_);
 }
@@ -387,8 +384,6 @@
 
 void MobileFriendlinessChecker::NotifyInvalidatePaint(
     const LayoutObject& object) {
-  ComputeTextContentOutsideViewport(object);
-
   if (font_size_check_enabled_)
     ComputeSmallTextRatio(object);
 }
@@ -418,63 +413,29 @@
   }
 }
 
-constexpr int kMaxAncestorCount = 5;
-bool CheckParentHasOverflowXHidden(const LayoutObject* obj) {
-  int ancestor_count = kMaxAncestorCount;
-  while (obj && ancestor_count > 0) {
-    const ComputedStyle* style = obj->Style();
-    if (style->OverflowX() == EOverflow::kHidden)
-      return true;
-    obj = obj->Parent();
-    --ancestor_count;
-  }
-  return false;
-}
-
-void MobileFriendlinessChecker::ComputeTextContentOutsideViewport(
-    const LayoutObject& object) {
+int MobileFriendlinessChecker::ComputeContentOutsideViewport() {
   int frame_width = frame_view_->GetPage()->GetVisualViewport().Size().Width();
   if (frame_width == 0) {
-    return;
+    return 0;
   }
 
-  int total_text_width;
-  if (const auto* text = DynamicTo<LayoutText>(object)) {
-    const ComputedStyle* style = text->Style();
-    if (style->Visibility() != EVisibility::kVisible ||
-        style->ContentVisibility() != EContentVisibility::kVisible ||
-        style->Opacity() == 0.0 || CheckParentHasOverflowXHidden(&object))
-      return;
-    total_text_width = text->PhysicalRightOffset().ToInt();
-  } else if (const auto* image = DynamicTo<LayoutImage>(object)) {
-    const ComputedStyle* style = image->Style();
-    if (style->Visibility() != EVisibility::kVisible ||
-        style->ContentVisibility() != EContentVisibility::kVisible ||
-        style->Opacity() == 0.0 || CheckParentHasOverflowXHidden(&object))
-      return;
-    total_text_width = image->FrameRect().MaxX().ToInt();
-  } else {
-    return;
+  const auto* root_frame_viewport = frame_view_->GetRootFrameViewport();
+  if (root_frame_viewport == nullptr) {
+    return 0;
   }
 
   double initial_scale = frame_view_->GetPage()
                              ->GetPageScaleConstraintsSet()
                              .FinalConstraints()
                              .initial_scale;
-  if (initial_scale > 0)
-    total_text_width *= initial_scale;
+  int content_width =
+      root_frame_viewport->LayoutViewport().ContentsSize().Width() *
+      initial_scale;
+  int max_scroll_offset = content_width - frame_width;
 
-  int text_content_outside_viewport_percentage = 0;
-  if (total_text_width > frame_width) {
-    // We use ceil function here because we want to treat 100.1% as 101 which
-    // requires a scroll bar.
-    text_content_outside_viewport_percentage =
-        std::ceil((total_text_width - frame_width) * 100.0 / frame_width);
-  }
-
-  mobile_friendliness_.text_content_outside_viewport_percentage =
-      std::max(mobile_friendliness_.text_content_outside_viewport_percentage,
-               text_content_outside_viewport_percentage);
+  // We use ceil function here because we want to treat 100.1% as 101 which
+  // requires a scroll bar.
+  return std::ceil(max_scroll_offset * 100.0 / frame_width);
 }
 
 void MobileFriendlinessChecker::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
index 45322373..5b4e6ae4 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
@@ -44,7 +44,7 @@
 
  private:
   void ComputeSmallTextRatio(const LayoutObject& object);
-  void ComputeTextContentOutsideViewport(const LayoutObject& object);
+  int ComputeContentOutsideViewport();
   void ComputeBadTapTargetsRatio();
 
  private:
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
index c3f538e..c143841 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -339,26 +339,24 @@
   EXPECT_NE(actual_mf.text_content_outside_viewport_percentage, 0);
 }
 
-TEST_F(MobileFriendlinessCheckerTest, TextTooWideOpacityZero) {
+TEST_F(MobileFriendlinessCheckerTest, TextTooWideAbsolutePositioning) {
   MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(
       R"(
 <html>
   <body>
-    <pre style="opacity:0">)" +
-      std::string(10000, 'a') +
-      R"(</pre>
+    <pre style="position:absolute; left:2000px">a</pre>
   </body>
 </html>
 )");
-  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 0);
+  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 317);
 }
 
-TEST_F(MobileFriendlinessCheckerTest, TextTooWideVisibilityHidden) {
+TEST_F(MobileFriendlinessCheckerTest, TextTooWideOverflowXHidden) {
   MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(
       R"(
 <html>
   <body>
-    <pre style="visibility:hidden">)" +
+    <pre style="overflow-x:hidden">)" +
       std::string(10000, 'a') + R"(</pre>
   </body>
 </html>
@@ -435,10 +433,22 @@
   </body>
 </html>
 )");
-  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 317);
+  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 319);
 }
 
-TEST_F(MobileFriendlinessCheckerTest, ImageAbsolutePosition) {
+TEST_F(MobileFriendlinessCheckerTest, ImageTooWideTwoImages) {
+  MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
+<html>
+  <body style="width:4000px">
+    <img style="width:2000px; height:50px">
+    <img style="width:2000px; height:50px">
+  </body>
+</html>
+)");
+  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 735);
+}
+
+TEST_F(MobileFriendlinessCheckerTest, ImageTooWideAbsolutePosition) {
   MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
 <html>
   <body>
@@ -484,6 +494,44 @@
   EXPECT_GE(actual_mf.text_content_outside_viewport_percentage, 100.0);
 }
 
+TEST_F(MobileFriendlinessCheckerTest, ScrollerOutsideViewport) {
+  MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
+<html>
+  <head>
+    <style>
+      div.scrollmenu {
+        background-color: #333;
+        overflow: auto;
+        white-space: nowrap;
+      }
+      div.scrollmenu a {
+        display: inline-block;
+        color: white;
+        padding: 14px;
+      }
+    </style>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0 minimum-scale=1.0">
+  </head>
+  <body style="font-size: 18px">
+  <div class="scrollmenu">
+    <a href="#1">First text</a>
+    <a href="#2">Second text</a>
+    <a href="#3">Third text</a>
+    <a href="#4">Fourth text</a>
+    <a href="#5">Fifth text</a>
+    <a href="#6">Sixth text</a>
+    <a href="#7">Seventh text</a>
+    <a href="#8">Eighth text</a>
+    <a href="#9">Ninth text</a>
+    <a href="#10">Tenth text</a>
+  </div>
+  </body>
+</html>
+)");
+  // the viewport
+  EXPECT_EQ(actual_mf.text_content_outside_viewport_percentage, 0.0);
+}
+
 TEST_F(MobileFriendlinessCheckerTest, SingleTapTarget) {
   MobileFriendliness actual_mf = CalculateMainFrameMetricsForHTMLString(R"(
   <head>
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
index 96626205..ef972487 100644
--- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
+++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -144,7 +144,7 @@
   // only 2/3 of the width is outside of the offset.
   const int outline_drawn_inside =
       style.OutlineStyleIsAuto()
-          ? std::ceil(style.GetOutlineStrokeWidthForFocusRing() / 3.f) + 1
+          ? std::ceil(style.FocusRingInnerStrokeWidth()) + 1
           : 0;
 
   return could_obscure_decorations && style.HasOutline() &&
diff --git a/third_party/blink/renderer/core/paint/image_painter.cc b/third_party/blink/renderer/core/paint/image_painter.cc
index 9513652..674a680 100644
--- a/third_party/blink/renderer/core/paint/image_painter.cc
+++ b/third_party/blink/renderer/core/paint/image_painter.cc
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/paint/box_painter.h"
 #include "third_party/blink/renderer/core/paint/image_element_timing.h"
+#include "third_party/blink/renderer/core/paint/outline_painter.h"
 #include "third_party/blink/renderer/core/paint/paint_info.h"
 #include "third_party/blink/renderer/core/paint/paint_timing_detector.h"
 #include "third_party/blink/renderer/core/paint/scoped_paint_state.h"
@@ -128,11 +129,8 @@
   PhysicalRect focus_rect = layout_image_.PhysicalContentBoxRect();
   focus_rect.Move(paint_offset);
   paint_info.context.Clip(PixelSnappedIntRect(focus_rect));
-  paint_info.context.DrawFocusRing(
-      path, area_element_style->GetOutlineStrokeWidthForFocusRing(),
-      area_element_style->OutlineOffsetInt(),
-      layout_image_.ResolveColor(*area_element_style,
-                                 GetCSSPropertyOutlineColor()));
+  OutlinePainter::PaintFocusRingPath(paint_info.context, path,
+                                     *area_element_style);
   paint_info.context.Restore();
 }
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index a631be3..f70fa06 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -1454,7 +1454,9 @@
       paint_info.phase != PaintPhase::kTextClip &&
       paint_info.phase != PaintPhase::kMask &&
       paint_info.phase != PaintPhase::kDescendantOutlinesOnly &&
-      paint_info.phase != PaintPhase::kOutline)
+      paint_info.phase != PaintPhase::kOutline &&
+      // When block-in-inline, block backgrounds need to be painted.
+      !ShouldPaintDescendantBlockBackgrounds(paint_info.phase))
     return;
 
   // The only way an inline could paint like this is if it has a layer.
diff --git a/third_party/blink/renderer/core/paint/ng/ng_mathml_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_mathml_painter.cc
index d764b2f..fbffad0 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_mathml_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_mathml_painter.cc
@@ -79,6 +79,17 @@
   auto padding = box_fragment_.Padding();
   physical_offset.left += borders.left + padding.left;
   physical_offset.top += borders.top + padding.top;
+
+  // TODO(http://crbug.com/1124301): NGMathOperatorLayoutAlgorithm::Layout
+  // passes the operator's inline size but this does not match the width of the
+  // box fragment, which relies on the min-max sizes instead. Shift the paint
+  // offset to work around that issue, splitting the size error symmetrically.
+  DCHECK(box_fragment_.Style().IsHorizontalWritingMode());
+  physical_offset.left +=
+      (box_fragment_.Size().width - borders.HorizontalSum() -
+       padding.HorizontalSum() - parameters.operator_inline_size) /
+      2;
+
   PaintStretchyOrLargeOperator(info, paint_offset + physical_offset);
 }
 
diff --git a/third_party/blink/renderer/core/paint/outline_painter.cc b/third_party/blink/renderer/core/paint/outline_painter.cc
index 55e7659..272dc04 100644
--- a/third_party/blink/renderer/core/paint/outline_painter.cc
+++ b/third_party/blink/renderer/core/paint/outline_painter.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/paint/outline_painter.h"
 
+#include "build/build_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
 #include "third_party/blink/renderer/core/paint/box_border_painter.h"
@@ -14,6 +15,7 @@
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h"
+#include "third_party/blink/renderer/platform/graphics/path.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
 #include "ui/native_theme/native_theme.h"
 
@@ -110,8 +112,7 @@
 
 void PaintComplexOutline(GraphicsContext& graphics_context,
                          const Vector<IntRect> rects,
-                         const ComputedStyle& style,
-                         const Color& color) {
+                         const ComputedStyle& style) {
   DCHECK(!style.OutlineStyleIsAuto());
 
   // Construct a clockwise path along the outer edge of the outline.
@@ -182,12 +183,11 @@
   if (!count)
     return;
 
-  Color outline_color = color;
+  Color color = style.VisitedDependentColor(GetCSSPropertyOutlineColor());
   bool use_transparency_layer = color.HasAlpha();
   if (use_transparency_layer) {
     graphics_context.BeginLayer(static_cast<float>(color.Alpha()) / 255);
-    outline_color =
-        Color(outline_color.Red(), outline_color.Green(), outline_color.Blue());
+    color.SetRGB(color.Red(), color.Green(), color.Blue());
   }
 
   DCHECK(count >= 4 && edges.size() == count);
@@ -207,8 +207,8 @@
     if (edge.side == BoxSide::kLeft || edge.side == BoxSide::kBottom)
       std::swap(adjacent_width1, adjacent_width2);
     BoxBorderPainter::DrawLineForBoxSide(
-        graphics_context, edge.x1, edge.y1, edge.x2, edge.y2, edge.side,
-        outline_color, style.OutlineStyle(), adjacent_width1, adjacent_width2,
+        graphics_context, edge.x1, edge.y1, edge.x2, edge.y2, edge.side, color,
+        style.OutlineStyle(), adjacent_width1, adjacent_width2,
         /*antialias*/ false);
     adjacent_width_start = adjacent_width_end;
   }
@@ -217,11 +217,14 @@
     graphics_context.EndLayer();
 }
 
-float GetFocusRingBorderRadius(const ComputedStyle& style,
-                               const PhysicalRect& reference_border_rect) {
-  // Default style is border-radius equal to outline width.
-  float border_radius = style.GetOutlineStrokeWidthForFocusRing();
+float DefaultFocusRingCornerRadius(const ComputedStyle& style) {
+  // Default style is corner radius equal to outline width.
+  return style.FocusRingStrokeWidth();
+}
 
+FloatRoundedRect::Radii GetFocusRingCornerRadii(
+    const ComputedStyle& style,
+    const PhysicalRect& reference_border_rect) {
   if (style.HasBorderRadius() &&
       (!style.HasEffectiveAppearance() || style.HasAuthorBorderRadius())) {
     int outset = style.OutlineOffsetInt();
@@ -229,17 +232,9 @@
         RoundedBorderGeometry::PixelSnappedRoundedBorderWithOutsets(
             style, reference_border_rect,
             LayoutRectOutsets(outset, outset, outset, outset));
-    // For now we only support uniform border radius for all corners of the
-    // focus ring. Use the minimum radius of all corners to prevent the focus
-    // ring from overlapping with the element, but not smaller than the default
-    // border radius.
-    const auto& radii = rect.GetRadii();
-    return std::max(
-        border_radius,
-        std::min({radii.TopLeft().Width(), radii.TopLeft().Height(),
-                  radii.TopRight().Width(), radii.TopRight().Height(),
-                  radii.BottomRight().Width(), radii.BottomRight().Height(),
-                  radii.BottomLeft().Width(), radii.BottomLeft().Height()}));
+    auto radii = rect.GetRadii();
+    radii.SetMinimumRadius(DefaultFocusRingCornerRadius(style));
+    return radii;
   }
 
   if (!style.HasAuthorBorder() && style.HasEffectiveAppearance()) {
@@ -268,18 +263,93 @@
         break;
     }
     if (part) {
-      border_radius =
+      float corner_radius =
           ui::NativeTheme::GetInstanceForWeb()->GetBorderRadiusForPart(
               part.value(), style.Width().GetFloatValue(),
               style.Height().GetFloatValue());
-
-      border_radius =
+      corner_radius =
           ui::NativeTheme::GetInstanceForWeb()->AdjustBorderRadiusByZoom(
-              part.value(), border_radius, style.EffectiveZoom());
+              part.value(), corner_radius, style.EffectiveZoom());
+      return FloatRoundedRect::Radii(corner_radius);
     }
   }
 
-  return border_radius;
+  return FloatRoundedRect::Radii(DefaultFocusRingCornerRadius(style));
+}
+
+void PaintSingleFocusRing(GraphicsContext& context,
+                          const Vector<IntRect>& rects,
+                          float width,
+                          int offset,
+                          const FloatRoundedRect::Radii& corner_radii,
+                          const Color& color) {
+  unsigned rect_count = rects.size();
+  if (!rect_count)
+    return;
+
+  SkRegion focus_ring_region;
+  for (unsigned i = 0; i < rect_count; i++) {
+    SkIRect r = rects[i];
+    if (r.isEmpty())
+      continue;
+    r.outset(offset, offset);
+    focus_ring_region.op(r, SkRegion::kUnion_Op);
+  }
+
+  if (focus_ring_region.isEmpty())
+    return;
+
+  if (focus_ring_region.isRect()) {
+    context.DrawFocusRingRect(
+        FloatRoundedRect(IntRect(focus_ring_region.getBounds()), corner_radii),
+        color, width);
+    return;
+  }
+
+  SkPath path;
+  if (!focus_ring_region.getBoundaryPath(&path))
+    return;
+  absl::optional<float> corner_radius = corner_radii.UniformRadius();
+  if (corner_radius.has_value()) {
+    context.DrawFocusRingPath(path, color, width, *corner_radius);
+    return;
+  }
+
+  // TODO(wangxianzhu): Bake non-uniform radii into the path. For now use the
+  // minimum radius.
+  float radius = std::min(
+      {corner_radii.TopLeft().Width(), corner_radii.TopLeft().Height(),
+       corner_radii.TopRight().Width(), corner_radii.TopRight().Height(),
+       corner_radii.BottomLeft().Width(), corner_radii.BottomLeft().Height(),
+       corner_radii.BottomRight().Width(),
+       corner_radii.BottomRight().Height()});
+  context.DrawFocusRingPath(path, color, width, radius);
+}
+
+void PaintFocusRing(GraphicsContext& context,
+                    const Vector<IntRect>& rects,
+                    const ComputedStyle& style,
+                    const FloatRoundedRect::Radii& corner_radii) {
+  Color inner_color = style.VisitedDependentColor(GetCSSPropertyOutlineColor());
+#if !defined(OS_MAC)
+  if (style.DarkColorScheme())
+    inner_color = Color::kWhite;
+#endif
+
+  const float outer_ring_width = style.FocusRingOuterStrokeWidth();
+  const float inner_ring_width = style.FocusRingInnerStrokeWidth();
+  const int offset = style.FocusRingOffset();
+  Color outer_color =
+      style.DarkColorScheme() ? Color(0x10, 0x10, 0x10) : Color::kWhite;
+  PaintSingleFocusRing(context, rects, outer_ring_width,
+                       offset + std::ceil(inner_ring_width), corner_radii,
+                       outer_color);
+  // Draw the inner ring using |outer_ring_width| (which should be wider than
+  // the additional offset of the outer ring) over the outer ring to ensure no
+  // gaps or AA artifacts.
+  DCHECK_GE(outer_ring_width, std::ceil(inner_ring_width));
+  PaintSingleFocusRing(context, rects, outer_ring_width, offset, corner_radii,
+                       inner_color);
 }
 
 }  // anonymous namespace
@@ -292,19 +362,9 @@
   for (auto& r : outline_rects)
     pixel_snapped_outline_rects.push_back(PixelSnappedIntRect(r));
 
-  Color color = style.VisitedDependentColor(GetCSSPropertyOutlineColor());
   if (style.OutlineStyleIsAuto()) {
-    // Logic in draw focus ring is dependent on whether the border is large
-    // enough to have an inset outline. Use the smallest border edge for that
-    // test.
-    float min_border_width =
-        std::min(std::min(style.BorderTopWidth(), style.BorderBottomWidth()),
-                 std::min(style.BorderLeftWidth(), style.BorderRightWidth()));
-    float border_radius = GetFocusRingBorderRadius(style, outline_rects[0]);
-    context.DrawFocusRing(pixel_snapped_outline_rects,
-                          style.GetOutlineStrokeWidthForFocusRing(),
-                          style.OutlineOffsetInt(), border_radius,
-                          min_border_width, color, style.UsedColorScheme());
+    auto corner_radii = GetFocusRingCornerRadii(style, outline_rects[0]);
+    PaintFocusRing(context, pixel_snapped_outline_rects, style, corner_radii);
     return;
   }
 
@@ -316,7 +376,19 @@
         AdjustedOutlineOffsetY(united_outline_rect, style.OutlineOffsetInt()));
     return;
   }
-  PaintComplexOutline(context, pixel_snapped_outline_rects, style, color);
+  PaintComplexOutline(context, pixel_snapped_outline_rects, style);
+}
+
+void OutlinePainter::PaintFocusRingPath(GraphicsContext& context,
+                                        const Path& focus_ring_path,
+                                        const ComputedStyle& style) {
+  // TODO(wangxianzhu):
+  // 1. Implement support for offset.
+  // 2. Implement double focus rings like rectangular focus rings.
+  context.DrawFocusRingPath(
+      focus_ring_path.GetSkPath(),
+      style.VisitedDependentColor(GetCSSPropertyOutlineColor()),
+      style.FocusRingStrokeWidth(), DefaultFocusRingCornerRadius(style));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/outline_painter.h b/third_party/blink/renderer/core/paint/outline_painter.h
index 4b87cee..68e76bb 100644
--- a/third_party/blink/renderer/core/paint/outline_painter.h
+++ b/third_party/blink/renderer/core/paint/outline_painter.h
@@ -12,6 +12,7 @@
 
 class ComputedStyle;
 class GraphicsContext;
+class Path;
 struct PhysicalRect;
 
 class OutlinePainter {
@@ -21,6 +22,10 @@
   static void PaintOutlineRects(GraphicsContext&,
                                 const Vector<PhysicalRect>&,
                                 const ComputedStyle&);
+
+  static void PaintFocusRingPath(GraphicsContext&,
+                                 const Path&,
+                                 const ComputedStyle&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc
index e563700..8a53d141 100644
--- a/third_party/blink/renderer/core/style/computed_style.cc
+++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -2329,24 +2329,41 @@
   if (!HasOutline())
     return 0;
   if (OutlineStyleIsAuto()) {
-    return GraphicsContext::FocusRingOutsetExtent(
-        OutlineOffsetInt(), std::ceil(GetOutlineStrokeWidthForFocusRing()));
+    // Unlike normal outlines (whole width is outside of the offset), focus
+    // rings are drawn with only part of it outside of the offset.
+    return FocusRingOffset() + std::ceil(FocusRingStrokeWidth() / 3.f) * 2;
   }
   return base::ClampAdd(OutlineWidthInt(), OutlineOffsetInt()).Max(0);
 }
 
-float ComputedStyle::GetOutlineStrokeWidthForFocusRing() const {
-  if (OutlineStyleIsAuto()) {
-    return std::max(EffectiveZoom(), 3.f);
-  }
+float ComputedStyle::FocusRingOuterStrokeWidth() const {
+  // The focus ring is made of two rings which have a 2:1 ratio.
+  return FocusRingStrokeWidth() / 3.f * 2;
+}
 
-#if defined(OS_MAC)
-  return OutlineWidthInt();
-#else
-  // Draw an outline with thickness in proportion to the zoom level, but never
+float ComputedStyle::FocusRingInnerStrokeWidth() const {
+  return FocusRingStrokeWidth() / 3.f;
+}
+
+float ComputedStyle::FocusRingStrokeWidth() const {
+  DCHECK(OutlineStyleIsAuto());
+  // Draw focus ring with thickness in proportion to the zoom level, but never
   // so narrow that it becomes invisible.
-  return std::max(EffectiveZoom(), 1.f);
-#endif
+  return std::max(EffectiveZoom(), 3.f);
+}
+
+int ComputedStyle::FocusRingOffset() const {
+  DCHECK(OutlineStyleIsAuto());
+  // How much space the focus ring would like to take from the actual border.
+  constexpr float kMaxInsideBorderWidth = 1;
+  int offset = OutlineOffsetInt();
+  // Focus ring is dependent on whether the border is large enough to have an
+  // inset outline. Use the smallest border edge for that test.
+  float min_border_width = std::min({BorderTopWidth(), BorderBottomWidth(),
+                                     BorderLeftWidth(), BorderRightWidth()});
+  if (min_border_width >= kMaxInsideBorderWidth)
+    offset -= kMaxInsideBorderWidth;
+  return offset;
 }
 
 bool ComputedStyle::StrokeDashArrayDataEquivalent(
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index c0c96d53..68e0f9c 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -1933,7 +1933,10 @@
     return OutlineWidth() > 0 && OutlineStyle() > EBorderStyle::kHidden;
   }
   CORE_EXPORT int OutlineOutsetExtent() const;
-  CORE_EXPORT float GetOutlineStrokeWidthForFocusRing() const;
+  CORE_EXPORT float FocusRingOuterStrokeWidth() const;
+  CORE_EXPORT float FocusRingInnerStrokeWidth() const;
+  CORE_EXPORT float FocusRingStrokeWidth() const;
+  CORE_EXPORT int FocusRingOffset() const;
   bool HasOutlineWithCurrentColor() const {
     return HasOutline() && OutlineColor().IsCurrentColor();
   }
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc
index 8fe95bba..03ebee2c 100644
--- a/third_party/blink/renderer/core/style/computed_style_test.cc
+++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -95,10 +95,12 @@
 TEST_F(ComputedStyleTest, FocusRingWidth) {
   scoped_refptr<ComputedStyle> style = CreateComputedStyle();
   style->SetOutlineStyleIsAuto(static_cast<bool>(OutlineIsAuto::kOn));
-  EXPECT_EQ(3, style->GetOutlineStrokeWidthForFocusRing());
+  EXPECT_EQ(3, style->FocusRingStrokeWidth());
+  EXPECT_EQ(2, style->FocusRingOuterStrokeWidth());
+  EXPECT_EQ(1, style->FocusRingInnerStrokeWidth());
   style->SetEffectiveZoom(3.5);
   style->SetOutlineWidth(4);
-  EXPECT_EQ(3.5, style->GetOutlineStrokeWidthForFocusRing());
+  EXPECT_EQ(3.5, style->FocusRingStrokeWidth());
 }
 
 TEST_F(ComputedStyleTest, FocusRingOutset) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index d0cd457..33de06c 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -2079,7 +2079,7 @@
     SetNeedsToUpdateChildren();
     cached_is_inert_or_aria_hidden_ = is_inert_or_aria_hidden;
   }
-  cached_is_descendant_of_disabled_node_ = !!DisabledAncestor();
+  cached_is_descendant_of_disabled_node_ = ComputeIsDescendantOfDisabledNode();
 
   bool is_ignored = ComputeAccessibilityIsIgnored();
   bool is_ignored_but_included_in_tree =
@@ -2392,18 +2392,18 @@
   return cached_is_descendant_of_disabled_node_;
 }
 
-const AXObject* AXObject::DisabledAncestor() const {
+bool AXObject::ComputeIsDescendantOfDisabledNode() const {
+  if (IsA<Document>(GetNode()))
+    return false;
+
   bool disabled = false;
-  if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled)) {
-    if (disabled)
-      return this;
-    return nullptr;
-  }
+  if (HasAOMPropertyOrARIAAttribute(AOMBooleanProperty::kDisabled, disabled))
+    return disabled;
 
   if (AXObject* parent = ParentObject())
-    return parent->DisabledAncestor();
+    return parent->IsDescendantOfDisabledNode();
 
-  return nullptr;
+  return false;
 }
 
 bool AXObject::ComputeAccessibilityIsIgnoredButIncludedInTree() const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 623847d4..c5b6bf3 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -475,7 +475,7 @@
   bool ComputeAccessibilityIsIgnoredButIncludedInTree() const;
   const AXObject* GetAtomicTextFieldAncestor(int max_levels_to_check = 3) const;
   const AXObject* DatetimeAncestor(int max_levels_to_check = 3) const;
-  const AXObject* DisabledAncestor() const;
+  bool ComputeIsDescendantOfDisabledNode() const;
   bool LastKnownIsIgnoredValue() const;
   bool LastKnownIsIgnoredButIncludedInTreeValue() const;
   bool LastKnownIsIncludedInTreeValue() const;
diff --git a/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc b/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
index 5a86be04..534b74a9 100644
--- a/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
+++ b/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
@@ -191,4 +191,52 @@
       kDoNotRetain);
 }
 
+// static
+AtomicString FontCache::GetGenericFamilyNameForScript(
+    const AtomicString& family_name,
+    const FontDescription& font_description) {
+  // If this is a locale-specifc family name, |FontCache| can handle different
+  // typefaces per locale. Let it handle.
+  if (GetLocaleSpecificFamilyName(family_name))
+    return family_name;
+
+  // If monospace, do not apply CJK hack to find i18n fonts, because
+  // i18n fonts are likely not monospace. Monospace is mostly used
+  // for code, but when i18n characters appear in monospace, system
+  // fallback can still render the characters.
+  if (family_name == font_family_names::kWebkitMonospace)
+    return family_name;
+
+  // The CJK hack below should be removed, at latest when we have
+  // serif and sans-serif versions of CJK fonts. Until then, limit it
+  // to only when the content locale is available. crbug.com/652146
+  const LayoutLocale* content_locale = font_description.Locale();
+  if (!content_locale)
+    return family_name;
+
+  // This is a hack to use the preferred font for CJK scripts.
+  // TODO(kojii): This logic disregards either generic family name
+  // or locale. We need an API that honors both to find appropriate
+  // fonts. crbug.com/642340
+  UChar32 exampler_char;
+  switch (content_locale->GetScript()) {
+    case USCRIPT_SIMPLIFIED_HAN:
+    case USCRIPT_TRADITIONAL_HAN:
+    case USCRIPT_KATAKANA_OR_HIRAGANA:
+      exampler_char = 0x4E00;  // A common character in Japanese and Chinese.
+      break;
+    case USCRIPT_HANGUL:
+      exampler_char = 0xAC00;
+      break;
+    default:
+      // For other scripts, use the default generic family mapping logic.
+      return family_name;
+  }
+
+  sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault());
+  return GetFamilyNameForCharacter(font_manager.get(), exampler_char,
+                                   font_description, nullptr,
+                                   FontFallbackPriority::kText);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc b/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
index 11c3186..f76170d 100644
--- a/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
+++ b/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
@@ -82,4 +82,30 @@
   EXPECT_NE(serif_ja_typeface.get(), standard_ja_typeface.get());
 }
 
+TEST(FontCacheAndroid, GenericFamilyNameForScript) {
+  FontDescription english;
+  english.SetLocale(LayoutLocale::Get("en"));
+  FontDescription chinese;
+  chinese.SetLocale(LayoutLocale::Get("zh"));
+
+  font_family_names::Init();
+  // For non-CJK, getGenericFamilyNameForScript should return the given
+  // familyName.
+  EXPECT_EQ(font_family_names::kWebkitStandard,
+            FontCache::GetGenericFamilyNameForScript(
+                font_family_names::kWebkitStandard, english));
+  EXPECT_EQ(font_family_names::kWebkitMonospace,
+            FontCache::GetGenericFamilyNameForScript(
+                font_family_names::kWebkitMonospace, english));
+
+  // For CJK, getGenericFamilyNameForScript should return CJK fonts except
+  // monospace.
+  EXPECT_NE(font_family_names::kWebkitStandard,
+            FontCache::GetGenericFamilyNameForScript(
+                font_family_names::kWebkitStandard, chinese));
+  EXPECT_EQ(font_family_names::kWebkitMonospace,
+            FontCache::GetGenericFamilyNameForScript(
+                font_family_names::kWebkitMonospace, chinese));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.h b/third_party/blink/renderer/platform/fonts/font_cache.h
index 07ddf78..9432f493 100644
--- a/third_party/blink/renderer/platform/fonts/font_cache.h
+++ b/third_party/blink/renderer/platform/fonts/font_cache.h
@@ -247,6 +247,9 @@
   static void AcceptLanguagesChanged(const String&);
 
 #if defined(OS_ANDROID)
+  static AtomicString GetGenericFamilyNameForScript(
+      const AtomicString& family_name,
+      const FontDescription&);
   // Locale-specific families can use different |SkTypeface| for a family name
   // if locale is different.
   static const char* GetLocaleSpecificFamilyName(
diff --git a/third_party/blink/renderer/platform/fonts/font_selector.cc b/third_party/blink/renderer/platform/fonts/font_selector.cc
index 6515c04b..561397b 100644
--- a/third_party/blink/renderer/platform/fonts/font_selector.cc
+++ b/third_party/blink/renderer/platform/fonts/font_selector.cc
@@ -18,11 +18,16 @@
     const FontDescription& font_description,
     const AtomicString& generic_family_name) {
 #if defined(OS_ANDROID)
-  // Android does not have the locale-specific font-family setting. Instead, the
-  // system may use different typefaces depending on the locale. Looking up such
-  // locale-specific family name is rather expensive that we rely on |FontCache|
-  // to handle them.
-#else
+  if (font_description.GenericFamily() == FontDescription::kStandardFamily) {
+    return FontCache::GetGenericFamilyNameForScript(
+        font_family_names::kWebkitStandard, font_description);
+  }
+
+  if (generic_family_name.StartsWith("-webkit-")) {
+    return FontCache::GetGenericFamilyNameForScript(generic_family_name,
+                                                    font_description);
+  }
+#else   // !defined(OS_ANDROID)
   UScriptCode script = font_description.GetScript();
   if (font_description.GenericFamily() == FontDescription::kStandardFamily)
     return settings.Standard(script);
diff --git a/third_party/blink/renderer/platform/geometry/float_rounded_rect.cc b/third_party/blink/renderer/platform/geometry/float_rounded_rect.cc
index e9d4e2d..0f7e4089ec 100644
--- a/third_party/blink/renderer/platform/geometry/float_rounded_rect.cc
+++ b/third_party/blink/renderer/platform/geometry/float_rounded_rect.cc
@@ -52,6 +52,25 @@
                                    const FloatSize& bottom_right)
     : rect_(rect), radii_(top_left, top_right, bottom_left, bottom_right) {}
 
+void FloatRoundedRect::Radii::SetMinimumRadius(float minimum_radius) {
+  top_left_.SetWidth(std::max(minimum_radius, top_left_.Width()));
+  top_left_.SetHeight(std::max(minimum_radius, top_left_.Height()));
+  top_right_.SetWidth(std::max(minimum_radius, top_right_.Width()));
+  top_right_.SetHeight(std::max(minimum_radius, top_right_.Height()));
+  bottom_left_.SetWidth(std::max(minimum_radius, bottom_left_.Width()));
+  bottom_left_.SetHeight(std::max(minimum_radius, bottom_left_.Height()));
+  bottom_right_.SetWidth(std::max(minimum_radius, bottom_right_.Width()));
+  bottom_right_.SetHeight(std::max(minimum_radius, bottom_right_.Height()));
+}
+
+absl::optional<float> FloatRoundedRect::Radii::UniformRadius() const {
+  if (top_left_.Width() == top_left_.Height() && top_left_ == top_right_ &&
+      top_left_ == bottom_left_ && top_left_ == bottom_right_) {
+    return top_left_.Width();
+  }
+  return absl::nullopt;
+}
+
 void FloatRoundedRect::Radii::Scale(float factor) {
   if (factor == 1)
     return;
diff --git a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
index ad7281c..6dec0f3 100644
--- a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
+++ b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
@@ -31,6 +31,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GEOMETRY_FLOAT_ROUNDED_RECT_H_
 
 #include <iosfwd>
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
 #include "third_party/blink/renderer/platform/geometry/float_size.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -57,6 +58,11 @@
           top_right_(top_right),
           bottom_left_(bottom_left),
           bottom_right_(bottom_right) {}
+    explicit constexpr Radii(float radius)
+        : Radii(FloatSize(radius, radius),
+                FloatSize(radius, radius),
+                FloatSize(radius, radius),
+                FloatSize(radius, radius)) {}
 
     constexpr Radii(const Radii&) = default;
     constexpr Radii& operator=(const Radii&) = default;
@@ -70,6 +76,9 @@
     constexpr const FloatSize& BottomLeft() const { return bottom_left_; }
     constexpr const FloatSize& BottomRight() const { return bottom_right_; }
 
+    void SetMinimumRadius(float);
+    absl::optional<float> UniformRadius() const;
+
     constexpr bool IsZero() const {
       return top_left_.IsZero() && top_right_.IsZero() &&
              bottom_left_.IsZero() && bottom_right_.IsZero();
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc
index f11e678..a25d4aa 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -332,107 +332,25 @@
   canvas_->restore();
 }
 
-int GraphicsContext::FocusRingOutsetExtent(int offset, int width) {
-  // Unlike normal outlines (whole width is outside of the offset), focus
-  // rings can be drawn with the center of the path aligned with the offset, so
-  // only 2/3 of the width is outside of the offset.
-  return offset + std::ceil(width / 3.f) * 2;
-}
-
 void GraphicsContext::DrawFocusRingPath(const SkPath& path,
                                         const Color& color,
                                         float width,
-                                        float border_radius) {
+                                        float corner_radius) {
   DrawPlatformFocusRing(
       path, canvas_,
       DarkModeFilterHelper::ApplyToColorIfNeeded(
           this, color.Rgb(), DarkModeFilter::ElementRole::kBackground),
-      width, border_radius);
+      width, corner_radius);
 }
 
-void GraphicsContext::DrawFocusRingRect(const SkRect& rect,
+void GraphicsContext::DrawFocusRingRect(const SkRRect& rrect,
                                         const Color& color,
-                                        float width,
-                                        float border_radius) {
+                                        float width) {
   DrawPlatformFocusRing(
-      rect, canvas_,
+      rrect, canvas_,
       DarkModeFilterHelper::ApplyToColorIfNeeded(
           this, color.Rgb(), DarkModeFilter::ElementRole::kBackground),
-      width, border_radius);
-}
-
-void GraphicsContext::DrawFocusRing(const Path& focus_ring_path,
-                                    float width,
-                                    int offset,
-                                    const Color& color) {
-  // FIXME: Implement support for offset.
-  DrawFocusRingPath(focus_ring_path.GetSkPath(), color, /*width=*/width,
-                    /*radius=*/width);
-}
-
-void GraphicsContext::DrawFocusRingInternal(const Vector<IntRect>& rects,
-                                            float width,
-                                            int offset,
-                                            float border_radius,
-                                            const Color& color) {
-  unsigned rect_count = rects.size();
-  if (!rect_count)
-    return;
-
-  SkRegion focus_ring_region;
-  for (unsigned i = 0; i < rect_count; i++) {
-    SkIRect r = rects[i];
-    if (r.isEmpty())
-      continue;
-    r.outset(offset, offset);
-    focus_ring_region.op(r, SkRegion::kUnion_Op);
-  }
-
-  if (focus_ring_region.isEmpty())
-    return;
-
-  if (focus_ring_region.isRect()) {
-    DrawFocusRingRect(SkRect::Make(focus_ring_region.getBounds()), color, width,
-                      border_radius);
-  } else {
-    SkPath path;
-    if (focus_ring_region.getBoundaryPath(&path))
-      DrawFocusRingPath(path, color, width, border_radius);
-  }
-}
-
-void GraphicsContext::DrawFocusRing(const Vector<IntRect>& rects,
-                                    float width,
-                                    int offset,
-                                    float border_radius,
-                                    float min_border_width,
-                                    const Color& color,
-                                    mojom::blink::ColorScheme color_scheme) {
-#if defined(OS_MAC)
-  const Color& inner_color = color;
-#else
-  const Color& inner_color =
-      color_scheme == mojom::blink::ColorScheme::kDark ? SK_ColorWHITE : color;
-#endif
-  // The focus ring is made of two borders which have a 2:1 ratio.
-  const float first_border_width = (width / 3) * 2;
-  const float second_border_width = width - first_border_width;
-
-  // How much space the focus ring would like to take from the actual border.
-  const float inside_border_width = 1;
-  if (min_border_width >= inside_border_width) {
-    offset -= inside_border_width;
-  }
-  const Color& outer_color = color_scheme == mojom::blink::ColorScheme::kDark
-                                 ? SkColorSetRGB(0x10, 0x10, 0x10)
-                                 : SK_ColorWHITE;
-  // The outer ring is drawn first, and we overdraw to ensure no gaps or AA
-  // artifacts.
-  DrawFocusRingInternal(rects, first_border_width,
-                        offset + std::ceil(second_border_width), border_radius,
-                        outer_color);
-  DrawFocusRingInternal(rects, first_border_width, offset, border_radius,
-                        inner_color);
+      width);
 }
 
 static void EnforceDotsAtEndpoints(GraphicsContext& context,
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.h b/third_party/blink/renderer/platform/graphics/graphics_context.h
index bb8da0d..c577637 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.h
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.h
@@ -388,14 +388,11 @@
 
   void SetDrawLooper(sk_sp<SkDrawLooper>);
 
-  void DrawFocusRing(const Vector<IntRect>&,
-                     float width,
-                     int offset,
-                     float border_radius,
-                     float min_border_width,
-                     const Color&,
-                     mojom::blink::ColorScheme color_scheme);
-  void DrawFocusRing(const Path&, float width, int offset, const Color&);
+  void DrawFocusRingPath(const SkPath&,
+                         const Color&,
+                         float width,
+                         float corner_radius);
+  void DrawFocusRingRect(const SkRRect&, const Color&, float width);
 
   const PaintFlags& FillFlags() const { return ImmutableState()->FillFlags(); }
   // If the length of the path to be stroked is known, pass it in for correct
@@ -448,8 +445,6 @@
                                  StrokeStyle);
   static bool ShouldUseStrokeForTextLine(StrokeStyle);
 
-  static int FocusRingOutsetExtent(int offset, int width);
-
   void SetInDrawingRecorder(bool);
   bool InDrawingRecorder() const { return in_drawing_recorder_; }
 
@@ -490,22 +485,6 @@
   void SaveLayer(const SkRect* bounds, const PaintFlags*);
   void RestoreLayer();
 
-  // Helpers for drawing a focus ring (drawFocusRing)
-  void DrawFocusRingPath(const SkPath&,
-                         const Color&,
-                         float width,
-                         float border_radius);
-  void DrawFocusRingRect(const SkRect&,
-                         const Color&,
-                         float width,
-                         float border_radius);
-
-  void DrawFocusRingInternal(const Vector<IntRect>&,
-                             float width,
-                             int offset,
-                             float border_radius,
-                             const Color&);
-
   // SkCanvas wrappers.
   void ClipRRect(const SkRRect&,
                  AntiAliasingMode = kNotAntiAliased,
diff --git a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
index c557391..76eb913 100644
--- a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
@@ -235,50 +235,49 @@
         !new_chunk.properties.GetPropertyTreeState().Unalias().Changed(
             PaintPropertyChangeType::kChangedOnlySimpleValues, layer_state)) {
       new_chunks_info.emplace_back(old_chunk_info, it);
-      continue;
-    }
-
-    mapper.SwitchToChunk(new_chunk);
-    auto& new_chunk_info = new_chunks_info.emplace_back(*this, mapper, it);
-
-    if (reason == PaintInvalidationReason::kNone) {
-      reason = ChunkPropertiesChanged(new_chunk, old_chunk, new_chunk_info,
-                                      old_chunk_info, layer_state);
-    }
-
-    if (IsFullPaintInvalidationReason(reason)) {
-      // Invalidate both old and new bounds of the chunk if the chunk's paint
-      // properties changed, or is moved backward and may expose area that was
-      // previously covered by it.
-      AddRasterInvalidation(function, old_chunk_info.bounds_in_layer,
-                            new_chunk.id.client, reason, kClientIsNew);
-      if (old_chunk_info.bounds_in_layer != new_chunk_info.bounds_in_layer) {
-        AddRasterInvalidation(function, new_chunk_info.bounds_in_layer,
-                              new_chunk.id.client, reason, kClientIsNew);
-      }
-      // Ignore the display item raster invalidations because we have fully
-      // invalidated the chunk.
     } else {
-      // We may have ignored tiny changes of transform, in which case we should
-      // use the old chunk_to_layer_transform for later comparison to correctly
-      // invalidate animating transform in tiny increments when the accumulated
-      // change exceeds the tolerance.
-      new_chunk_info.chunk_to_layer_transform =
-          old_chunk_info.chunk_to_layer_transform;
+      mapper.SwitchToChunk(new_chunk);
+      auto& new_chunk_info = new_chunks_info.emplace_back(*this, mapper, it);
 
-      if (reason == PaintInvalidationReason::kIncremental) {
-        IncrementallyInvalidateChunk(function, old_chunk_info, new_chunk_info,
-                                     new_chunk.id.client);
+      if (reason == PaintInvalidationReason::kNone) {
+        reason = ChunkPropertiesChanged(new_chunk, old_chunk, new_chunk_info,
+                                        old_chunk_info, layer_state);
       }
 
-      if (&new_chunks.GetPaintArtifact() != old_paint_artifact_ &&
-          !new_chunk.is_moved_from_cached_subsequence) {
-        DisplayItemRasterInvalidator(
-            *this, function,
-            old_paint_artifact_->DisplayItemsInChunk(
-                old_chunk_info.index_in_paint_artifact),
-            it.DisplayItems(), mapper)
-            .Generate();
+      if (IsFullPaintInvalidationReason(reason)) {
+        // Invalidate both old and new bounds of the chunk if the chunk's paint
+        // properties changed, or is moved backward and may expose area that was
+        // previously covered by it.
+        AddRasterInvalidation(function, old_chunk_info.bounds_in_layer,
+                              new_chunk.id.client, reason, kClientIsNew);
+        if (old_chunk_info.bounds_in_layer != new_chunk_info.bounds_in_layer) {
+          AddRasterInvalidation(function, new_chunk_info.bounds_in_layer,
+                                new_chunk.id.client, reason, kClientIsNew);
+        }
+        // Ignore the display item raster invalidations because we have fully
+        // invalidated the chunk.
+      } else {
+        // We may have ignored tiny changes of transform, in which case we
+        // should use the old chunk_to_layer_transform for later comparison to
+        // correctly invalidate animating transform in tiny increments when the
+        // accumulated change exceeds the tolerance.
+        new_chunk_info.chunk_to_layer_transform =
+            old_chunk_info.chunk_to_layer_transform;
+
+        if (reason == PaintInvalidationReason::kIncremental) {
+          IncrementallyInvalidateChunk(function, old_chunk_info, new_chunk_info,
+                                       new_chunk.id.client);
+        }
+
+        if (&new_chunks.GetPaintArtifact() != old_paint_artifact_ &&
+            !new_chunk.is_moved_from_cached_subsequence) {
+          DisplayItemRasterInvalidator(
+              *this, function,
+              old_paint_artifact_->DisplayItemsInChunk(
+                  old_chunk_info.index_in_paint_artifact),
+              it.DisplayItems(), mapper)
+              .Generate();
+        }
       }
     }
 
diff --git a/third_party/blink/renderer/platform/graphics/skia/skia_utils.cc b/third_party/blink/renderer/platform/graphics/skia/skia_utils.cc
index d7bbf8ff..7463092 100644
--- a/third_party/blink/renderer/platform/graphics/skia/skia_utils.cc
+++ b/third_party/blink/renderer/platform/graphics/skia/skia_utils.cc
@@ -378,63 +378,34 @@
                           SkFloatToScalar(rect.Height()));
 }
 
-template <typename PrimitiveType>
-void DrawFocusRingPrimitive(const PrimitiveType&,
-                            cc::PaintCanvas*,
-                            const PaintFlags&,
-                            float corner_radius) {
-  NOTREACHED();  // Missing an explicit specialization?
-}
-
-template <>
-void DrawFocusRingPrimitive<SkRect>(const SkRect& rect,
-                                    cc::PaintCanvas* canvas,
-                                    const PaintFlags& flags,
-                                    float corner_radius) {
-  SkRRect rrect;
-  rrect.setRectXY(rect, SkFloatToScalar(corner_radius),
-                  SkFloatToScalar(corner_radius));
-  canvas->drawRRect(rrect, flags);
-}
-
-template <>
-void DrawFocusRingPrimitive<SkPath>(const SkPath& path,
-                                    cc::PaintCanvas* canvas,
-                                    const PaintFlags& flags,
-                                    float corner_radius) {
-  PaintFlags path_flags = flags;
-  path_flags.setPathEffect(
-      SkCornerPathEffect::Make(SkFloatToScalar(corner_radius)));
-  canvas->drawPath(path, path_flags);
-}
-
-template <typename PrimitiveType>
-void DrawPlatformFocusRing(const PrimitiveType& primitive,
-                           cc::PaintCanvas* canvas,
-                           SkColor color,
-                           float width,
-                           float border_radius) {
+static PaintFlags PaintFlagsForFocusRing(SkColor color, float width) {
   PaintFlags flags;
   flags.setAntiAlias(true);
   flags.setStyle(PaintFlags::kStroke_Style);
   flags.setColor(color);
   flags.setStrokeWidth(width);
-
-  DrawFocusRingPrimitive(primitive, canvas, flags, border_radius);
+  return flags;
 }
 
-template void PLATFORM_EXPORT
-DrawPlatformFocusRing<SkRect>(const SkRect&,
-                              cc::PaintCanvas*,
-                              SkColor,
-                              float width,
-                              float border_radius);
-template void PLATFORM_EXPORT
-DrawPlatformFocusRing<SkPath>(const SkPath&,
-                              cc::PaintCanvas*,
-                              SkColor,
-                              float width,
-                              float border_radius);
+void DrawPlatformFocusRing(const SkRRect& rrect,
+                           cc::PaintCanvas* canvas,
+                           SkColor color,
+                           float width) {
+  canvas->drawRRect(rrect, PaintFlagsForFocusRing(color, width));
+}
+
+void DrawPlatformFocusRing(const SkPath& path,
+                           cc::PaintCanvas* canvas,
+                           SkColor color,
+                           float width,
+                           float corner_radius) {
+  PaintFlags path_flags = PaintFlagsForFocusRing(color, width);
+  if (corner_radius) {
+    path_flags.setPathEffect(
+        SkCornerPathEffect::Make(SkFloatToScalar(corner_radius)));
+  }
+  canvas->drawPath(path, path_flags);
+}
 
 sk_sp<SkData> TryAllocateSkData(size_t size) {
   void* buffer = WTF::Partitions::BufferPartition()->AllocFlags(
diff --git a/third_party/blink/renderer/platform/graphics/skia/skia_utils.h b/third_party/blink/renderer/platform/graphics/skia/skia_utils.h
index 997893fe..0b3efb14 100644
--- a/third_party/blink/renderer/platform/graphics/skia/skia_utils.h
+++ b/third_party/blink/renderer/platform/graphics/skia/skia_utils.h
@@ -142,12 +142,15 @@
   return radius * 0.5f;
 }
 
-template <typename PrimitiveType>
-void DrawPlatformFocusRing(const PrimitiveType&,
-                           cc::PaintCanvas*,
-                           SkColor,
-                           float width,
-                           float border_radius);
+void PLATFORM_EXPORT DrawPlatformFocusRing(const SkRRect&,
+                                           cc::PaintCanvas*,
+                                           SkColor,
+                                           float width);
+void PLATFORM_EXPORT DrawPlatformFocusRing(const SkPath&,
+                                           cc::PaintCanvas*,
+                                           SkColor,
+                                           float width,
+                                           float corner_radius);
 
 inline SkCanvas::SrcRectConstraint WebCoreClampingModeToSkiaRectConstraint(
     Image::ImageClampingMode clamp_mode) {
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
index d86911ee..26c08f94 100644
--- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
+++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -943,11 +943,11 @@
   // supported.
   if (IsColorSpaceSupportedByPCVR(image)) {
     // Create temporary frame wrapping the YUVA planes.
-    scoped_refptr<media::VideoFrame> frame;
     auto pixel_format = AvifToVideoPixelFormat(image->yuvFormat, image->depth);
     if (pixel_format == media::PIXEL_FORMAT_UNKNOWN)
       return false;
     auto size = gfx::Size(image->width, image->height);
+    scoped_refptr<media::VideoFrame> frame;
     if (image->alphaPlane) {
       DCHECK_EQ(pixel_format, media::PIXEL_FORMAT_I420);
       pixel_format = media::PIXEL_FORMAT_I420A;
@@ -962,6 +962,8 @@
           image->yuvRowBytes[1], image->yuvRowBytes[2], image->yuvPlanes[0],
           image->yuvPlanes[1], image->yuvPlanes[2], base::TimeDelta());
     }
+    if (!frame)
+      return false;
     frame->set_color_space(frame_cs);
 
     // Really only handles 709, 601, 2020, JPEG 8-bit conversions and uses
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
index 392bf50d..23d4055 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -270,15 +270,17 @@
       // SpatialLayer is not filled.
       if (codec_settings.VP9().numberOfTemporalLayers > 1 ||
           codec_settings.VP9().numberOfSpatialLayers > 1) {
-        spatial_layers->resize(codec_settings.VP9().numberOfSpatialLayers);
-        for (size_t i = 0; i < spatial_layers->size(); ++i) {
+        spatial_layers->clear();
+        for (size_t i = 0; i < codec_settings.VP9().numberOfSpatialLayers;
+             ++i) {
           const webrtc::SpatialLayer& rtc_sl = codec_settings.spatialLayers[i];
           // We ignore non active spatial layer and don't proceed further. There
           // must NOT be an active higher spatial layer than non active spatial
           // layer.
           if (!rtc_sl.active)
             break;
-          auto& sl = (*spatial_layers)[i];
+          spatial_layers->emplace_back();
+          auto& sl = spatial_layers->back();
           sl.width = base::checked_cast<int32_t>(rtc_sl.width);
           sl.height = base::checked_cast<int32_t>(rtc_sl.height);
           if (!ConvertKbpsToBps(rtc_sl.targetBitrate, &sl.bitrate_bps))
@@ -288,8 +290,16 @@
           sl.num_of_temporal_layers =
               base::saturated_cast<uint8_t>(rtc_sl.numberOfTemporalLayers);
         }
-        *inter_layer_pred = CopyFromWebRtcInterLayerPredMode(
-            codec_settings.VP9().interLayerPred);
+
+        if (spatial_layers->size() == 1 &&
+            spatial_layers->at(0).num_of_temporal_layers == 1) {
+          // Don't report spatial layers if only the base layer is active and we
+          // have no temporar layers configured.
+          spatial_layers->clear();
+        } else {
+          *inter_layer_pred = CopyFromWebRtcInterLayerPredMode(
+              codec_settings.VP9().interLayerPred);
+        }
       }
       break;
     default:
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
index a267cba..6fc44c91 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
@@ -25,13 +25,19 @@
 #include "third_party/webrtc/rtc_base/time_utils.h"
 
 using ::testing::_;
+using ::testing::AllOf;
 using ::testing::AtLeast;
+using ::testing::ElementsAre;
+using ::testing::Field;
 using ::testing::Invoke;
+using ::testing::IsEmpty;
 using ::testing::Return;
 using ::testing::SaveArg;
 using ::testing::Values;
 using ::testing::WithArgs;
 
+using SpatialLayer = media::VideoEncodeAccelerator::Config::SpatialLayer;
+
 namespace blink {
 
 namespace {
@@ -92,9 +98,9 @@
 
     EXPECT_CALL(*mock_gpu_factories_.get(), DoCreateVideoEncodeAccelerator())
         .WillRepeatedly(Return(mock_vea));
-    EXPECT_CALL(*mock_vea, Initialize(_, _))
+    EXPECT_CALL(*mock_vea, Initialize)
         .WillOnce(Invoke(this, &RTCVideoEncoderTest::Initialize));
-    EXPECT_CALL(*mock_vea, UseOutputBitstreamBuffer(_)).Times(AtLeast(3));
+    EXPECT_CALL(*mock_vea, UseOutputBitstreamBuffer).Times(AtLeast(3));
     EXPECT_CALL(*mock_vea, Destroy()).Times(1);
     return mock_vea;
   }
@@ -150,6 +156,7 @@
   bool Initialize(const media::VideoEncodeAccelerator::Config& config,
                   media::VideoEncodeAccelerator::Client* client) {
     DVLOG(3) << __func__;
+    config_ = config;
     client_ = client;
     client_->RequireBitstreamBuffers(0, config.input_visible_size,
                                      config.input_visible_size.GetArea());
@@ -308,6 +315,7 @@
  protected:
   media::MockVideoEncodeAccelerator* mock_vea_;
   std::unique_ptr<RTCVideoEncoder> rtc_encoder_;
+  absl::optional<media::VideoEncodeAccelerator::Config> config_;
   media::VideoEncodeAccelerator::Client* client_;
   base::Thread encoder_thread_;
 
@@ -498,12 +506,12 @@
   }
 }
 
-#if defined(OS_CHROMEOS)
+#if defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH)
 // Currently we only test spatial SVC encoding on CrOS since only CrOS platform
 // support spatial SVC encoding.
 
 // http://crbug.com/1226875
-TEST_F(RTCVideoEncoderTest, DISABLED_EncodeSpatialLayer) {
+TEST_F(RTCVideoEncoderTest, EncodeSpatialLayer) {
   webrtc::VideoCodec sl_codec = GetSVCLayerCodec(/*num_spatial_layers=*/3);
   CreateEncoder(sl_codec.codecType);
   EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
@@ -531,6 +539,52 @@
                                    &frame_types));
   }
 }
+
+TEST_F(RTCVideoEncoderTest, CreateAndInitThreeLayerSvc) {
+  webrtc::VideoCodec tl_codec = GetSVCLayerCodec(/*num_spatial_layers=*/3);
+  CreateEncoder(tl_codec.codecType);
+
+  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
+            rtc_encoder_->InitEncode(&tl_codec, kVideoEncoderSettings));
+  EXPECT_THAT(
+      *config_,
+      Field(&media::VideoEncodeAccelerator::Config::spatial_layers,
+            ElementsAre(
+                AllOf(Field(&SpatialLayer::width, kInputFrameWidth / 4),
+                      Field(&SpatialLayer::height, kInputFrameHeight / 4)),
+                AllOf(Field(&SpatialLayer::width, kInputFrameWidth / 2),
+                      Field(&SpatialLayer::height, kInputFrameHeight / 2)),
+                AllOf(Field(&SpatialLayer::width, kInputFrameWidth),
+                      Field(&SpatialLayer::height, kInputFrameHeight)))));
+}
+
+TEST_F(RTCVideoEncoderTest, CreateAndInitSvcSinglecast) {
+  webrtc::VideoCodec tl_codec = GetSVCLayerCodec(/*num_spatial_layers=*/3);
+  tl_codec.spatialLayers[1].active = false;
+  tl_codec.spatialLayers[2].active = false;
+  CreateEncoder(tl_codec.codecType);
+
+  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
+            rtc_encoder_->InitEncode(&tl_codec, kVideoEncoderSettings));
+  EXPECT_THAT(*config_,
+              Field(&media::VideoEncodeAccelerator::Config::spatial_layers,
+                    ElementsAre(AllOf(
+                        Field(&SpatialLayer::width, kInputFrameWidth / 4),
+                        Field(&SpatialLayer::height, kInputFrameHeight / 4)))));
+}
+
+TEST_F(RTCVideoEncoderTest, CreateAndInitSvcSinglecastWithoutTemporalLayers) {
+  webrtc::VideoCodec tl_codec = GetSVCLayerCodec(/*num_spatial_layers=*/3);
+  tl_codec.spatialLayers[1].active = false;
+  tl_codec.spatialLayers[2].active = false;
+  tl_codec.spatialLayers[0].numberOfTemporalLayers = 1;
+  tl_codec.VP9()->numberOfTemporalLayers = 1;
+  CreateEncoder(tl_codec.codecType);
+
+  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
+            rtc_encoder_->InitEncode(&tl_codec, kVideoEncoderSettings));
+  EXPECT_THAT(config_->spatial_layers, IsEmpty());
+}
 #endif
 
 TEST_F(RTCVideoEncoderTest, EncodeFrameWithAdapter) {
diff --git a/third_party/blink/tools/blinkpy/common/system/platform_info.py b/third_party/blink/tools/blinkpy/common/system/platform_info.py
index 1388cf5..afd887e 100644
--- a/third_party/blink/tools/blinkpy/common/system/platform_info.py
+++ b/third_party/blink/tools/blinkpy/common/system/platform_info.py
@@ -58,7 +58,7 @@
                 platform_module.mac_ver()[0])
         if self.os_name.startswith('win'):
             self.os_version = self._determine_win_version(
-                self._win_version_tuple(sys_module))
+                self._win_version_tuple())
         assert sys.platform != 'cygwin', 'Cygwin is not supported.'
 
     def is_mac(self):
@@ -210,9 +210,11 @@
                     (win_version_tuple, ))
         return 'future'
 
-    def _win_version_tuple(self, sys_module):
-        if hasattr(sys_module, 'getwindowsversion'):
-            return sys_module.getwindowsversion()
+    def _win_version_tuple(self):
+        version_str = self._platform_module.win32_ver()[1]
+        if version_str:
+            return tuple(map(int, version_str.split('.')))
+
         return self._win_version_tuple_from_cmd()
 
     def _win_version_tuple_from_cmd(self):
diff --git a/third_party/blink/tools/blinkpy/common/system/platform_info_unittest.py b/third_party/blink/tools/blinkpy/common/system/platform_info_unittest.py
index 82d32d240..ea6a933 100644
--- a/third_party/blink/tools/blinkpy/common/system/platform_info_unittest.py
+++ b/third_party/blink/tools/blinkpy/common/system/platform_info_unittest.py
@@ -48,7 +48,8 @@
 
 def fake_platform(mac_version_string='10.12.3',
                   release_string='bar',
-                  linux_version='trusty'):
+                  linux_version='trusty',
+                  win_version_string=None):
     class FakePlatformModule(object):
         def mac_ver(self):
             return tuple([mac_version_string, tuple(['', '', '']), 'i386'])
@@ -62,6 +63,9 @@
         def release(self):
             return release_string
 
+        def win32_ver(self):
+            return tuple([None, win_version_string])
+
     return FakePlatformModule()
 
 
@@ -119,7 +123,8 @@
         self.assertFalse(info.is_win())
         self.assertFalse(info.is_freebsd())
 
-        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])))
+        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])),
+                              fake_platform(win_version_string="6.1.7600"))
         self.assertEqual(info.os_name, 'win')
         self.assertFalse(info.is_linux())
         self.assertFalse(info.is_mac())
@@ -182,33 +187,49 @@
                 fake_platform('', '9.0-RELEASE')).os_version, '9.0-RELEASE')
 
         with self.assertRaises(AssertionError):
-            self.make_info(fake_sys('win32', tuple([5, 0, 1234])))
+            self.make_info(fake_sys('win32', tuple([5, 0, 1234])),
+                           fake_platform(win_version_string="5.0.1234"))
         with self.assertRaises(AssertionError):
-            self.make_info(fake_sys('win32', tuple([6, 1, 1234])))
+            self.make_info(fake_sys('win32', tuple([6, 1, 1234])),
+                           fake_platform(win_version_string="6.1.1234"))
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([10, 1, 1234]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([10, 1, 1234])),
+                fake_platform(win_version_string="10.1.1234")).os_version,
             'future')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([10, 0, 1234]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([10, 0, 1234])),
+                fake_platform(win_version_string="10.0.1234")).os_version,
             '10')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([6, 3, 1234]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([6, 3, 1234])),
+                fake_platform(win_version_string="6.3.1234")).os_version,
             '8.1')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([6, 2, 1234]))).os_version,
-            '8')
+            self.make_info(
+                fake_sys('win32', tuple([6, 2, 1234])),
+                fake_platform(win_version_string="6.2.1234")).os_version, '8')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([6, 1, 7601]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([6, 1, 7601])),
+                fake_platform(win_version_string="6.1.7601")).os_version,
             '7sp1')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([6, 1, 7600]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([6, 1, 7600])),
+                fake_platform(win_version_string="6.1.7600")).os_version,
             '7sp0')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([6, 0, 1234]))).os_version,
+            self.make_info(
+                fake_sys('win32', tuple([6, 0, 1234])),
+                fake_platform(win_version_string="6.0.1234")).os_version,
             'vista')
         self.assertEqual(
-            self.make_info(fake_sys('win32', tuple([5, 1, 1234]))).os_version,
-            'xp')
+            self.make_info(
+                fake_sys('win32', tuple([5, 1, 1234])),
+                fake_platform(win_version_string="5.1.1234")).os_version, 'xp')
 
         with self.assertRaises(AssertionError):
             self.make_info(
@@ -241,7 +262,8 @@
         info = self.make_info(fake_sys('darwin'))
         self.assertNotEquals(info.display_name(), '')
 
-        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])))
+        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])),
+                              fake_platform(win_version_string="6.1.7600"))
         self.assertNotEquals(info.display_name(), '')
 
         info = self.make_info(fake_sys('linux2'))
@@ -257,7 +279,8 @@
             executive=fake_executive('1234'))
         self.assertEqual(info.total_bytes_memory(), 1234)
 
-        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])))
+        info = self.make_info(fake_sys('win32', tuple([6, 1, 7600])),
+                              fake_platform(win_version_string="6.1.7600"))
         self.assertIsNone(info.total_bytes_memory())
 
         info = self.make_info(fake_sys('linux2'))
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index b8c52e6..414e7d6 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1172,6 +1172,9 @@
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/tall-line-in-short-block.html [ Failure ]
 crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure ]
+crbug.com/1230554 [ Linux ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
+crbug.com/1230554 [ Mac10.15 ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
+crbug.com/1230554 [ Win10 ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
 
 ### With LayoutNGFragmentTraversal (and LayoutNGFragmentItem) enabled:
 
@@ -2617,6 +2620,11 @@
 crbug.com/626703 external/wpt/service-workers/service-worker/worker-interception.https.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-ruby/ruby-base-container-abs.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-ruby/empty-ruby-base-container.html [ Failure ]
+crbug.com/626703 [ Mac11.0 ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-local-time-null-2.https.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-ruby/ruby-base-container-float.html [ Failure ]
+crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/simulcast/getStats.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-paint-error.https.html [ Failure ]
@@ -2635,9 +2643,7 @@
 crbug.com/626703 [ Mac10.12 ] external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html [ Failure ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/css/css-position/position-absolute-iframe-print-002.sub.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/css/css-highlight-api/painting/custom-highlight-painting-staticrange-005.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-multicol/multicol-span-float-002.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/css/css-highlight-api/painting/custom-highlight-painting-staticrange-004.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-multicol/multicol-span-float-003.html [ Failure ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin-opener-policy/coop-navigate-same-origin-csp-sandbox.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/cross-origin-opener-policy/coop-navigate-same-origin-csp-sandbox.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/selection/textcontrols/selectionchange-bubble.html [ Timeout ]
@@ -2646,9 +2652,6 @@
 crbug.com/626703 [ Mac10.15 ] external/wpt/selection/textcontrols/selectionchange-bubble.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/selection/textcontrols/selectionchange-bubble.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/selection/textcontrols/selectionchange-bubble.html [ Timeout ]
-crbug.com/626703 [ Linux ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
-crbug.com/626703 [ Win10 ] virtual/layout_ng_block_frag/external/wpt/css/css-multicol/crashtests/multicol-cached-consumed-bsize-crash.html [ Crash ]
 crbug.com/626703 [ Win10 ] external/wpt/wasm/jsapi/exception/basic.tentative.any.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/density-size-correction/density-corrected-image-svg-aspect-ratio-cross-origin.sub.html [ Failure ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-click.html [ Timeout ]
@@ -3909,6 +3912,8 @@
 crbug.com/829028 external/wpt/css/css-multicol/spanner-fragmentation-011.html [ Failure ]
 crbug.com/1191124 external/wpt/css/css-multicol/spanner-fragmentation-012.html [ Failure ]
 crbug.com/1224888 external/wpt/css/css-multicol/spanner-in-opacity.html [ Failure ]
+crbug.com/1232773 external/wpt/css/css-multicol/multicol-span-float-002.html [ Failure ]
+crbug.com/1232773 external/wpt/css/css-multicol/multicol-span-float-003.html [ Failure ]
 
 crbug.com/1031667 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Failure ]
 crbug.com/1031667 external/wpt/css/css-pseudo/marker-content-008.tentative.html [ Failure ]
@@ -4371,12 +4376,6 @@
 
 # known bug: import() inside set{Timeout,Interval}
 
-# WIP bug: dynamic import() base URL
-crbug.com/796034 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html [ Failure ]
-crbug.com/796034 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module.html [ Failure ]
-crbug.com/796034 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic.html [ Failure ]
-crbug.com/796034 external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module.html [ Failure ]
-
 # Service worker updates need to handle redirect appropriately.
 crbug.com/889798 external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ]
 
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 5941e23e..d289d7e 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
@@ -132512,7 +132512,7 @@
       ]
      ],
      "block-ruby-003.html": [
-      "861ba8352ca5fb002935a24896a130c0d320eb9e",
+      "26b33a1f6affeff15c1ea836f24de93ef6d5b0fd",
       [
        null,
        [
@@ -132525,7 +132525,7 @@
       ]
      ],
      "block-ruby-004.html": [
-      "fcddc1dbda215eda2c3251174ecf439c92c02efa",
+      "33ab4207b15a90aae31c2400d53975128141ac52",
       [
        null,
        [
@@ -132550,32 +132550,6 @@
        {}
       ]
      ],
-     "empty-ruby-base-container-abs.html": [
-      "7968af0b256684c4b03dd06fa3748c1380150a6f",
-      [
-       null,
-       [
-        [
-         "/css/css-ruby/empty-ruby-base-container-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
-     "empty-ruby-base-container-float.html": [
-      "b7c5d12963a4dd089efebdd4772a5bb5aa0c1862",
-      [
-       null,
-       [
-        [
-         "/css/css-ruby/empty-ruby-base-container-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
      "empty-ruby-base-container.html": [
       "4d86e07985d0e99e586848f7ca3195e63371c4d4",
       [
@@ -132706,6 +132680,32 @@
        {}
       ]
      ],
+     "ruby-base-container-abs.html": [
+      "35baeda23e05a5f8b2a7adc0c96fe4753e055ad9",
+      [
+       null,
+       [
+        [
+         "/css/css-ruby/empty-ruby-base-container-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "ruby-base-container-float.html": [
+      "18ef9bb4ba50ae5b2c48c3b2ce7257ce10d0d874",
+      [
+       null,
+       [
+        [
+         "/css/css-ruby/empty-ruby-base-container-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "ruby-base-different-size.html": [
       "f71b5644c626b9835f5c9015c04badb626b336a1",
       [
@@ -242349,11 +242349,11 @@
       []
      ],
      "block-ruby-003-ref.html": [
-      "b89f33cfdaef9b2038bb65234500b53fcdb6abd0",
+      "05eb7dbb9957a80eb6eb5eae6bc736538d8d6bad",
       []
      ],
      "block-ruby-004-ref.html": [
-      "879609f4daf8654ae0f7821d48308dbb035b3dbe",
+      "be7e89658dd87c79848c8787667a048b1df794f8",
       []
      ],
      "block-ruby-005-ref.html": [
@@ -242361,7 +242361,7 @@
       []
      ],
      "empty-ruby-base-container-ref.html": [
-      "e849da271d4b6f9fd7694c771ace79e1de7757fe",
+      "e6119468c59af5581d9deeb6e20f60bb18f6aab6",
       []
      ],
      "empty-ruby-text-container-ref.html": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003-ref.html
index b89f33c..05eb7db 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003-ref.html
@@ -5,11 +5,11 @@
   -->
 <html lang="ja">
 <meta charset="utf-8">
-<title>Reference: Text node insertion in 'display:ruby/block ruby'.</title>
+<title>CSS Reference File</title>
 <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
 <style>
 html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+  font:10px/1 monospace;
 }
 
 ruby { display: ruby; background: lightblue; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003.html
index 861ba835..26b33a1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-003.html
@@ -13,7 +13,7 @@
 <link rel="match" href="block-ruby-003-ref.html">
 <style>
 html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+  font:10px/1 monospace;
 }
 
 ruby { display: ruby; background: lightblue; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004-ref.html
index 879609f..be7e896 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004-ref.html
@@ -5,11 +5,11 @@
   -->
 <html lang="ja">
 <meta charset="utf-8">
-<title>Reference: RT append in 'display:ruby/block ruby'.</title>
+<title>CSS Reference File</title>
 <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
 <style>
 html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+  font:10px/1 monospace;
 }
 
 ruby { display: ruby; background: lightblue; }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004.html
index fcddc1db..33ab420 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-004.html
@@ -13,12 +13,12 @@
 <link rel="match" href="block-ruby-004-ref.html">
 <style>
 html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
+  font:10px/1 monospace;
 }
 
 ruby { display: ruby; background: lightblue; }
 rbb { display: block ruby; background: lightblue; }
-rbbr { display: block ruby; background: lightblue; }
+
 grid { display: grid; }
 .mbp {
   margin: 1px 3px 5px 7px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-ref.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-ref.html
index e849da2..e611946 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-ref.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
 <meta charset="UTF-8">
-<title>Empty ruby base container</title>
+<title>CSS Reference File</title>
 <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
-<div style="font-size: 64px; line-height: 3">a<ruby><rb></rb><rt>b</rt></ruby>c</div>
+<div style="font-size: 64px; line-height: 3">a<ruby><rb>&nbsp;</rb><rt>b</rt></ruby>c</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-abs.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-abs.html
similarity index 86%
rename from third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-abs.html
rename to third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-abs.html
index 7968af0..35baeda 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-abs.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-abs.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <meta charset="UTF-8">
-<title>Empty ruby base container</title>
+<title>CSS Ruby Test: ruby base container with abs. pos. child</title>
 <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
 <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
 <link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-layout">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-float.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-float.html
similarity index 86%
rename from third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-float.html
rename to third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-float.html
index b7c5d12..18ef9bb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/empty-ruby-base-container-float.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/ruby-base-container-float.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <meta charset="UTF-8">
-<title>Empty ruby base container</title>
+<title>CSS Ruby Test: ruby base container with floating child</title>
 <link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
 <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
 <link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-layout">
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/stretchy.woff b/third_party/blink/web_tests/external/wpt/fonts/math/stretchy.woff
index f5a2c4a0..fc1b75c 100644
--- a/third_party/blink/web_tests/external/wpt/fonts/math/stretchy.woff
+++ b/third_party/blink/web_tests/external/wpt/fonts/math/stretchy.woff
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/116-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/116-expected.txt
deleted file mode 100644
index eb072ed..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/116-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL scheduler: adding script to head of frameset document assert_array_equals: expected property 0 to be "document.body: <FRAMESET>" but got "document.body: <BODY>" (expected array ["document.body: <FRAMESET>"] got ["document.body: <BODY>"])
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-expected.txt
deleted file mode 100644
index 8a61a7e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL scheduler: SVG script adding src attribute  assert_array_equals: lengths differ, expected array ["external script #1"] length 1, got [] length 0
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-href.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-href.html
new file mode 100644
index 0000000..6c0869d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146-href.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html><head>
+  <title>scheduler: SVG script adding src attribute </title>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>var t = async_test();</script>
+<svg>
+<script></script>
+</svg>
+<script>
+t.step(function() {
+  var s = document.querySelector("svg > script");
+  s.setAttribute("href", "scripts/include-1.js");
+});
+onload = t.step_func(function() {
+  assert_array_equals(eventOrder, ["external script #1"]);
+  t.done();
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146.html
index 9cf6bb7..333ac3f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/146.html
@@ -16,7 +16,8 @@
   s.src = "scripts/include-1.js";
 });
 onload = t.step_func(function() {
-  assert_array_equals(eventOrder, ["external script #1"]);
+  // SVG <script> element uses href attribute, so src attribute is ignored.
+  assert_array_equals(eventOrder, []);
   t.done();
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js
index 22e1050..1ce198f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js
@@ -1,2 +1,4 @@
-log('document.body: '+(document.body?'<BODY>':null));
-var findBodyLoaded=true;
\ No newline at end of file
+log(
+  'document.body: ' +
+  (document.body ? '<' + document.body.localName.toUpperCase() + '>' : null));
+var findBodyLoaded=true;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt
new file mode 100644
index 0000000..abfc12f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=setTimeout"
+PASS eval should successfully import
+PASS Function should successfully import
+PASS reflected-inline-event-handlers should successfully import
+PASS inline-event-handlers-UA-code should successfully import
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt
new file mode 100644
index 0000000..abfc12f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-module-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/imports-a.js?label=setTimeout"
+PASS eval should successfully import
+PASS Function should successfully import
+PASS reflected-inline-event-handlers should successfully import
+PASS inline-event-handlers-UA-code should successfully import
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt
new file mode 100644
index 0000000..adf45dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-classic-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS setTimeout should successfully import
+PASS eval should successfully import
+PASS the Function constructor should successfully import
+FAIL reflected inline event handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=reflected%20inline%20event%20handlers"
+FAIL inline event handlers triggered via UA code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt
new file mode 100644
index 0000000..adf45dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-inline-module-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS setTimeout should successfully import
+PASS eval should successfully import
+PASS the Function constructor should successfully import
+FAIL reflected inline event handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=reflected%20inline%20event%20handlers"
+FAIL inline event handlers triggered via UA code should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001-ref.html
new file mode 100644
index 0000000..89ac9c6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001-ref.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Horizontal stretchy operator (reference)</title>
+<style>
+  @font-face {
+    font-family: TestFont;
+    src: url("/fonts/math/stretchy.woff");
+  }
+  math, mo {
+    font-family: TestFont;
+    font-size: 50px;
+  }
+</style>
+<body>
+  <p>This test passes if you see green rectangles and no red.</p>
+
+  <div style="position: absolute; left: 3em; top; 3em;
+              width: 1000px; height: 500px; background: lightgreen;">
+
+    <div style="position: absolute; top: 1px; left: 1px;">
+      <!-- stretchy base in munder -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </munder>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 251px;">
+      <!-- stretchy script in munder -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munder>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 101px; left: 1px;">
+      <!-- stretchy base in mover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </mover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 101px; left: 251px;">
+      <!-- stretchy script in mover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </mover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 201px; left: 1px;">
+      <!-- stretchy base in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 201px; left: 251px;">
+      <!-- stretchy underscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 301px; left: 1px;">
+      <!-- stretchy overscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 501px;">
+      <!-- stretchy base and underscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 151px; left: 501px;">
+      <!-- stretchy base and overscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 301px; left: 501px;">
+      <!-- stretchy scripts in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 751px;">
+      <!-- Only stretchy operators in munderover. The widest unstretched size
+           is used as the target size. -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="font-size: 1em; color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="font-size: 4em; color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="font-size: 2em; color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+  </div>
+  <script>
+    MathMLFeatureDetection.ensure_for_match_reftest("has_mspace");
+    MathMLFeatureDetection.ensure_for_match_reftest("has_munderover");
+  </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001.html
new file mode 100644
index 0000000..833eb9f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/underover-stretchy-001.html
@@ -0,0 +1,270 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Horizontal stretchy operator</title>
+<link rel="help" href="https://w3c.github.io/mathml-core/#layout-algorithms">
+<link rel="help" href="https://w3c.github.io/mathml-core/#dfn-algorithm-for-stretching-operators-along-the-inline-axis">
+<link rel="help" href="https://w3c.github.io/mathml-core/#layout-of-operators">
+<link rel="match" href="underover-stretchy-001-ref.html"/>
+<meta name="assert" content="Verify visual rendering of padding/border/margin on an operator, stretchy along the inline axis.">
+<script src="/mathml/support/feature-detection.js"></script>
+<style>
+  @font-face {
+    font-family: TestFont;
+    src: url("/fonts/math/stretchy.woff");
+  }
+  math, mo {
+    font-family: TestFont;
+    font-size: 50px;
+  }
+</style>
+<body>
+  <p>This test passes if you see green rectangles and no red.</p>
+  <!-- The red mspace elements below are expected to be covered by the green
+       stretchy mo elements. -->
+
+  <div style="position: absolute; left: 3em; top; 3em;
+              width: 1000px; height: 500px; background: lightgreen;">
+
+    <div style="position: absolute; top: 1px; left: 1px;">
+      <!-- stretchy base in munder -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+          </munder>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </munder>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 251px;">
+      <!-- stretchy script in munder -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </munder>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munder>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munder>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 101px; left: 1px;">
+      <!-- stretchy base in mover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+          </mover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </mover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 101px; left: 251px;">
+      <!-- stretchy script in mover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </mover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <mover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </mover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 201px; left: 1px;">
+      <!-- stretchy base in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+s            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 201px; left: 251px;">
+      <!-- stretchy underscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 301px; left: 1px;">
+      <!-- stretchy overscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 501px;">
+      <!-- stretchy base and underscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 151px; left: 501px;">
+      <!-- stretchy base and overscript in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 301px; left: 501px;">
+      <!-- stretchy scripts in munderover -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="200px" height="0px"/>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+
+    <div style="position: absolute; top: 1px; left: 751px;">
+      <!-- Only stretchy operators in munderover. The widest unstretched size
+           is used as the target size. -->
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mspace width="198px" height="48px" style="background: red; margin: 1px;"/>
+            <mspace width="198px" height="198px" style="background: red; margin: 1px;"/>
+            <mspace width="198px" height="98px" style="background: red; margin: 1px;"/>
+          </munderover>
+        </math>
+      </div>
+      <div style="position: absolute; left: 0; top: 0;">
+        <math>
+          <munderover>
+            <mo lspace="0" rspace="0" style="font-size: 1em; color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="font-size: 4em; color: green;">⥚</mo>
+            <mo lspace="0" rspace="0" style="font-size: 2em; color: green;">⥚</mo>
+          </munderover>
+        </math>
+      </div>
+    </div>
+  </div>
+  <script>
+    MathMLFeatureDetection.ensure_for_match_reftest("has_mspace");
+    MathMLFeatureDetection.ensure_for_match_reftest("has_munderover");
+  </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/stretchy.py b/third_party/blink/web_tests/external/wpt/mathml/tools/stretchy.py
index f6a42b01..95ec4bb 100755
--- a/third_party/blink/web_tests/external/wpt/mathml/tools/stretchy.py
+++ b/third_party/blink/web_tests/external/wpt/mathml/tools/stretchy.py
@@ -9,6 +9,21 @@
 # Set parameters for stretchy tests.
 font.math.MinConnectorOverlap = mathfont.em / 2
 
+# Make sure that underover parameters don't add extra spacing.
+font.math.LowerLimitBaselineDropMin = 0
+font.math.LowerLimitGapMin = 0
+font.math.StretchStackBottomShiftDown = 0
+font.math.StretchStackGapAboveMin = 0
+font.math.UnderbarVerticalGap = 0
+font.math.UnderbarExtraDescender = 0
+font.math.UpperLimitBaselineRiseMin = 0
+font.math.UpperLimitGapMin = 0
+font.math.StretchStackTopShiftUp = 0
+font.math.StretchStackGapBelowMin = 0
+font.math.OverbarVerticalGap = 0
+font.math.AccentBaseHeight = 0
+font.math.OverbarExtraAscender = 0
+
 # These two characters will be stretchable in both directions.
 horizontalArrow = 0x295A # LEFTWARDS HARPOON WITH BARB UP FROM BAR
 verticalArrow = 0x295C # UPWARDS HARPOON WITH BARB RIGHT FROM BAR
diff --git a/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius-expected.png b/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius-expected.png
index bec39ef..c39d3ea9 100644
--- a/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius-expected.png
+++ b/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius.html b/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius.html
index f7adcb6e..dcc3e29 100644
--- a/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius.html
+++ b/third_party/blink/web_tests/fast/css/block-focus-ring-with-border-radius.html
@@ -17,6 +17,6 @@
 <div style="border-radius: 40px"></div>
 <div style="border-radius: 40px; outline-offset: 5px"></div>
 <br>
-<div style="border-radius: 40px / 5px 30px; outline-offset: -5px"></div>
-<div style="border-radius: 40px / 5px 30px"></div>
-<div style="border-radius: 40px / 5px 30px; outline-offset: 5px"></div>
+<div style="border-radius: 40px / 20px 30px; outline-offset: -5px"></div>
+<div style="border-radius: 40px / 20px 30px"></div>
+<div style="border-radius: 40px / 20px 30px; outline-offset: 5px"></div>
diff --git a/third_party/blink/web_tests/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
deleted file mode 100644
index cf36731f..0000000
--- a/third_party/blink/web_tests/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
index 762972a..54fa935 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
index 3c0c670..fd7cfcf2 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [8, 58, 110, 63]
+        [8, 58, 109, 62]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
index 635a6aa..552bba8 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 54, 26]
+        [7, 7, 52, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
index 299401f..bdd9279 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 61, 26]
+        [7, 7, 59, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/textarea-caret-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/textarea-caret-expected.txt
index d1546eb..72eef48 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/textarea-caret-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/forms/textarea-caret-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 185, 42]
+        [7, 7, 183, 40]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
index dfdc3682..8b24c05 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
@@ -24,7 +24,7 @@
       "bounds": [205, 1022],
       "contentsOpaqueForText": true,
       "invalidations": [
-        [0, 998, 205, 24]
+        [0, 999, 205, 23]
       ],
       "transform": 2
     }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
index 72458c20..edbd319 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [69, 26],
+      "position": [-1, -1],
+      "bounds": [67, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 69, 26]
+        [0, 0, 67, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
index 72458c20..edbd319 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [69, 26],
+      "position": [-1, -1],
+      "bounds": [67, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 69, 26]
+        [0, 0, 67, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
index ae10294..099340a 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 69, 26]
+        [7, 7, 67, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
index ae10294..099340a 100644
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 69, 26]
+        [7, 7, 67, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
index a9c7a2ce..2d80648 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
@@ -27,7 +27,7 @@
       "name": "Scrolling Contents Layer",
       "bounds": [205, 1022],
       "invalidations": [
-        [0, 998, 205, 24]
+        [0, 999, 205, 23]
       ],
       "transform": 2
     }
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/editing/input/reveal-caret-of-multiline-contenteditable-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
index 1df7ace..cf1b5714 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
index 819380a..95372fde 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
index 3fb8f714..aaa0e3d 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
index dbdb6b6d..e42031620 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [12, 87, 164, 94]
+        [12, 87, 163, 93]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
index c003423..c926c03 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 80, 36]
+        [11, 11, 78, 34]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
index be8bad5..5b06f9b 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 90, 36]
+        [11, 11, 88, 34]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/textarea-caret-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/textarea-caret-expected.txt
index 37238bee..1b675a2c 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/textarea-caret-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/forms/textarea-caret-expected.txt
@@ -11,11 +11,11 @@
     },
     {
       "name": "LayoutNGTextControlMultiLine TEXTAREA id='editor'",
-      "position": [-2, -2],
-      "bounds": [275, 57],
+      "position": [-1, -1],
+      "bounds": [273, 55],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 275, 57]
+        [0, 0, 273, 55]
       ],
       "transform": 1
     },
@@ -46,10 +46,10 @@
     },
     {
       "name": "Decoration Layer",
-      "position": [-2, -2],
-      "bounds": [275, 57],
+      "position": [-1, -1],
+      "bounds": [273, 55],
       "invalidations": [
-        [0, 0, 275, 57]
+        [0, 0, 273, 55]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
index a4e21c89..c13b472e 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
@@ -27,7 +27,7 @@
       "name": "Scrolling Contents Layer",
       "bounds": [308, 1532],
       "invalidations": [
-        [0, 1498, 308, 34]
+        [0, 1499, 308, 33]
       ],
       "transform": 2
     }
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
index bc9d98b..a3e2d16 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [99, 36],
+      "position": [-1, -1],
+      "bounds": [97, 34],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 99, 36]
+        [0, 0, 97, 34]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
index bc9d98b..a3e2d16 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [99, 36],
+      "position": [-1, -1],
+      "bounds": [97, 34],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 99, 36]
+        [0, 0, 97, 34]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
index c0fbcaa..a2cdcf1d 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 99, 36]
+        [11, 11, 97, 34]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
index c0fbcaa..a2cdcf1d 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 99, 36]
+        [11, 11, 97, 34]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
deleted file mode 100644
index bc9d98b..0000000
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [1200, 900],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [99, 36],
-      "backgroundColor": "#FFFFFF",
-      "invalidations": [
-        [0, 0, 99, 36]
-      ],
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [12, 12, 0, 1]
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
deleted file mode 100644
index bc9d98b..0000000
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [1200, 900],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [99, 36],
-      "backgroundColor": "#FFFFFF",
-      "invalidations": [
-        [0, 0, 99, 36]
-      ],
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [12, 12, 0, 1]
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
deleted file mode 100644
index c0fbcaa..0000000
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [1200, 900],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "invalidations": [
-        [10, 10, 99, 36]
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt b/third_party/blink/web_tests/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
index c7c6208..34b5da9 100644
--- a/third_party/blink/web_tests/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/clip/caret-ancestor-clip-change-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [8, 58, 110, 63]
+        [8, 58, 109, 62]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css/focus-ring-multiline-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css/focus-ring-multiline-expected.png
index b7f621b..fc2315dc 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css/focus-ring-multiline-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css/focus-ring-multiline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png
index 67b553b..e103866b 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png
index 3ec0aa9..6a99d77 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png
index a431968..72174737 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png
index 57a16d8a..438f25d 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png
index fc70a3b..7d109259 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/replaced/selection-rect-transform-expected.png b/third_party/blink/web_tests/platform/fuchsia/fast/replaced/selection-rect-transform-expected.png
index 8b5c715..16a6ab87 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/replaced/selection-rect-transform-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/replaced/selection-rect-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png b/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
index d809984..ca92d13 100644
--- a/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/paint/invalidation/outline/focus-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-3-expected.png b/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-3-expected.png
index bf4d50c..53c1a2ed 100644
--- a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-3-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
index 5873786..ea089e4 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
index 291d166d..c6092d63 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [69, 26],
+      "position": [-1, -1],
+      "bounds": [67, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 69, 26]
+        [0, 0, 67, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
index 291d166d..c6092d63 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [69, 26],
+      "position": [-1, -1],
+      "bounds": [67, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 69, 26]
+        [0, 0, 67, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
index 98ef525..e3a122f 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 69, 26]
+        [7, 7, 67, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
index 98ef525..e3a122f 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 69, 26]
+        [7, 7, 67, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
index 335aa2f1..2159bd6 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
index 9bac769..70dfb9d8 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
new file mode 100644
index 0000000..c3662187
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
new file mode 100644
index 0000000..be3771d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/layers-inside-overflow-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/layers-inside-overflow-scroll-expected.png
new file mode 100644
index 0000000..74918d8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/layers-inside-overflow-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/self-painting-layers-expected.png
new file mode 100644
index 0000000..5629ccb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/self-painting-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/video/video-controls-squashing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/video/video-controls-squashing-expected.png
new file mode 100644
index 0000000..0b38a72
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/video/video-controls-squashing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..c1c4f39e5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
new file mode 100644
index 0000000..27d9a69
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-after-reload-expected.png
new file mode 100644
index 0000000..a85412f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-strict-expected.png
new file mode 100644
index 0000000..0282f7c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-expected.png
new file mode 100644
index 0000000..4d576a99
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-strict-expected.png
new file mode 100644
index 0000000..321055a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-without-preload-expected.png
new file mode 100644
index 0000000..353492c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-horizontal-expected.png
new file mode 100644
index 0000000..1a96aa87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..2d321a90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..dc7208f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-display-toggle-expected.png
new file mode 100644
index 0000000..a42e45b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/forms/textarea-caret-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/forms/textarea-caret-expected.txt
index 90a10e9..3307d75 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/forms/textarea-caret-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/forms/textarea-caret-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 185, 40]
+        [7, 7, 183, 38]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/paint/invalidation/forms/textarea-caret-expected.txt
similarity index 75%
rename from third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
rename to third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/paint/invalidation/forms/textarea-caret-expected.txt
index c0fbcaa..3307d75 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/backface-visibility-interop/paint/invalidation/forms/textarea-caret-expected.txt
@@ -2,11 +2,11 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [1200, 900],
+      "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 99, 36]
+        [7, 7, 183, 38]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..a91dd17
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
index cc053f1..6b9a591 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..d179d3c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
new file mode 100644
index 0000000..5c806c3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..82a8ad6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
index b03258f..452d917 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..b9f9948
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..d64f7d18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..800294b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt
new file mode 100644
index 0000000..e669345d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt
@@ -0,0 +1,18 @@
+CONSOLE MESSAGE: Blink Test Plugin: initializing
+CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true)
+CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(false)
+i1focus
+i1blur
+pfocus-change-2
+pblur-change-4
+i4focus
+i4blur
+i3focus
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+
+Test changing focus inside plugin onfocus and onblur events
+
+    
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
new file mode 100644
index 0000000..a85412f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-strict-expected.png
new file mode 100644
index 0000000..0282f7c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-expected.png
new file mode 100644
index 0000000..4d576a99
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
new file mode 100644
index 0000000..321055a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
new file mode 100644
index 0000000..353492c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
new file mode 100644
index 0000000..1a96aa87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..2d321a90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..dc7208f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
new file mode 100644
index 0000000..a42e45b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/synchronous_html_parser/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/paint/invalidation/forms/textarea-caret-expected.txt
similarity index 75%
copy from third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
copy to third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/paint/invalidation/forms/textarea-caret-expected.txt
index c0fbcaa..3307d75 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/backface-visibility-interop/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/transform-interop-disabled/paint/invalidation/forms/textarea-caret-expected.txt
@@ -2,11 +2,11 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [1200, 900],
+      "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [10, 10, 99, 36]
+        [7, 7, 183, 38]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/layers-inside-overflow-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/layers-inside-overflow-scroll-expected.png
new file mode 100644
index 0000000..74918d8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/layers-inside-overflow-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/self-painting-layers-expected.png
new file mode 100644
index 0000000..5629ccb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/self-painting-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/video/video-controls-squashing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/video/video-controls-squashing-expected.png
new file mode 100644
index 0000000..0b38a72
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/video/video-controls-squashing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-menu-expected.png
index 2d5e194..c1c4f39e5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-menu-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
index 60baac3a..27d9a69 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-after-reload-expected.png
index 00f7125..a85412f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-after-reload-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-strict-expected.png
index eaa43d7..0282f7c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-strict-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-expected.png
index 3dc8b25..4d576a99 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-strict-expected.png
index 803ac41..321055a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-strict-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-without-preload-expected.png
index d3ccfe8..353492c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-without-preload-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-horizontal-expected.png
index 4522345..1a96aa87 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-horizontal-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-vertical-expected.png
index 51bd686..2d321a90 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-vertical-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-controls-rendering-expected.png
index 94d92886..dc7208f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-controls-rendering-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-display-toggle-expected.png
index ca3f9a4..a42e45b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-display-toggle-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
index 442db2f..a91dd17 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
index cc053f1..6b9a591 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
index 162fa65..d179d3c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
index ce122c72..5c806c3 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
index 96924a5f..82a8ad6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index e3ff74d..b581251 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
index b03258f..452d917 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..b9f9948
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..d64f7d18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..800294b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt
new file mode 100644
index 0000000..1c9192a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/scroll-unification/plugins/focus-change-4-change-focus-and-blur-expected.txt
@@ -0,0 +1,17 @@
+CONSOLE MESSAGE: Blink Test Plugin: initializing
+CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true)
+i1focus
+i1blur
+pfocus-change-2
+pblur-change-4
+i4focus
+i4blur
+i3focus
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+
+Test changing focus inside plugin onfocus and onblur events
+
+    
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
index 00f7125..a85412f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-strict-expected.png
index eaa43d7..0282f7c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-strict-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-expected.png
index 3dc8b25..4d576a99 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
index 803ac41..321055a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
index d3ccfe8..353492c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
index 4522345..1a96aa87 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
index 51bd686..2d321a90 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
index 94d92886..dc7208f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
index ca3f9a4..a42e45b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/layers-inside-overflow-scroll-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/layers-inside-overflow-scroll-expected.png
new file mode 100644
index 0000000..74918d8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/layers-inside-overflow-scroll-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/self-painting-layers-expected.png
new file mode 100644
index 0000000..5629ccb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/self-painting-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/video/video-controls-squashing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/video/video-controls-squashing-expected.png
new file mode 100644
index 0000000..0b38a72
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/video/video-controls-squashing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..7a28f67f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
new file mode 100644
index 0000000..3052bcd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-after-reload-expected.png
new file mode 100644
index 0000000..88fed9a9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-strict-expected.png
new file mode 100644
index 0000000..fc4d3c9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-expected.png
new file mode 100644
index 0000000..9cca21c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-strict-expected.png
new file mode 100644
index 0000000..aaf3dbf2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-without-preload-expected.png
new file mode 100644
index 0000000..171b2f8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-horizontal-expected.png
new file mode 100644
index 0000000..c0199be
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..3b61e305
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..07f01276
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-display-toggle-expected.png
new file mode 100644
index 0000000..bffbb6e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
new file mode 100644
index 0000000..06b5458
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-fixed-scrolling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/backface-visibility-interop/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..8477d83
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
index 23d8a5c..c8a32c95 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
new file mode 100644
index 0000000..0f2f03a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-menu-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
new file mode 100644
index 0000000..0306a2e2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/media/video-overlay-play-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..11620df
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
index b03258f..452d917 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..b9f9948
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/gpu/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..6904a0c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..d28437f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/no-alloc-direct-call/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
new file mode 100644
index 0000000..d64f7d18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
new file mode 100644
index 0000000..800294b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
new file mode 100644
index 0000000..87ecfee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
new file mode 100644
index 0000000..88cdfd65
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
new file mode 100644
index 0000000..00357c7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-expected.png
new file mode 100644
index 0000000..94a9be87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
new file mode 100644
index 0000000..bbbfc6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
new file mode 100644
index 0000000..9ebfd14
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
new file mode 100644
index 0000000..f0d3fca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/color-profile-video-seek-object-fit-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-after-reload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
new file mode 100644
index 0000000..88fed9a9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-after-reload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-expected.png
new file mode 100644
index 0000000..9cca21c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
new file mode 100644
index 0000000..aaf3dbf2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-styling-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-without-preload-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
new file mode 100644
index 0000000..171b2f8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/controls-without-preload-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
new file mode 100644
index 0000000..c0199be
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
new file mode 100644
index 0000000..3b61e305
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/track/track-cue-rendering-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..9e64707d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
new file mode 100644
index 0000000..fd6a9eba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-canvas-alpha-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
new file mode 100644
index 0000000..07f01276
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-controls-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-display-toggle-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
new file mode 100644
index 0000000..bffbb6e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-display-toggle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
new file mode 100644
index 0000000..4bbeaaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-remove-insert-repaints-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
new file mode 100644
index 0000000..3405eb4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-replaces-poster-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
new file mode 100644
index 0000000..d41fbdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-expected.png
new file mode 100644
index 0000000..8ad3c9a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/synchronous_html_parser/media/video-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
new file mode 100644
index 0000000..7d2a82d4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/threaded/compositing/visibility/visibility-simple-video-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
new file mode 100644
index 0000000..2c5ced9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/geometry/video-opacity-overlay-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
new file mode 100644
index 0000000..071f9ba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/overflow-compositing-descendant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
new file mode 100644
index 0000000..ce33a85
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/transform-interop-disabled/compositing/overflow/scroll-ancestor-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/input/reveal-caret-of-multiline-contenteditable-expected.png b/third_party/blink/web_tests/platform/mac/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
index 11460bb..3dec65eb 100644
--- a/third_party/blink/web_tests/platform/mac/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/input/reveal-caret-of-multiline-contenteditable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/block-focus-ring-with-border-radius-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/block-focus-ring-with-border-radius-expected.png
index 4a891b6..3ab1705 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/block-focus-ring-with-border-radius-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/block-focus-ring-with-border-radius-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
index 231e681..e2dd002 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-scrolled-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
index 3a1fbd8..2158ee8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
index 297d950..da9880e 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 55, 25]
+        [7, 7, 53, 23]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
index 4c854b0..0cf053e 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 62, 25]
+        [7, 7, 60, 23]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/textarea-caret-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/textarea-caret-expected.txt
index 9b92c06..2e806b4 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/textarea-caret-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/forms/textarea-caret-expected.txt
@@ -11,11 +11,11 @@
     },
     {
       "name": "LayoutNGTextControlMultiLine TEXTAREA id='editor'",
-      "position": [-2, -2],
-      "bounds": [185, 40],
+      "position": [-1, -1],
+      "bounds": [183, 38],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 185, 40]
+        [0, 0, 183, 38]
       ],
       "transform": 1
     },
@@ -46,10 +46,10 @@
     },
     {
       "name": "Decoration Layer",
-      "position": [-2, -2],
-      "bounds": [185, 40],
+      "position": [-1, -1],
+      "bounds": [183, 38],
       "invalidations": [
-        [0, 0, 185, 40]
+        [0, 0, 183, 38]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
index 5f075927..c7ca30b 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
@@ -27,7 +27,7 @@
       "name": "Scrolling Contents Layer",
       "bounds": [205, 1021],
       "invalidations": [
-        [0, 998, 205, 23]
+        [0, 999, 205, 22]
       ],
       "transform": 2
     }
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
index ac034b5..61e4ae3 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [52, 25],
+      "position": [-1, -1],
+      "bounds": [50, 23],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 52, 25]
+        [0, 0, 50, 23]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
index ac034b5..61e4ae3 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [52, 25],
+      "position": [-1, -1],
+      "bounds": [50, 23],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 52, 25]
+        [0, 0, 50, 23]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
index 3826a1f9..2b28169 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 52, 25]
+        [7, 7, 50, 23]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
index 3826a1f9..2b28169 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 52, 25]
+        [7, 7, 50, 23]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
index c3662187..570ce3d7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
index be3771d..6fa2a8e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/textarea-with-scrollbar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
new file mode 100644
index 0000000..d10d3fc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/focus-rect/textarea-with-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
index 3804e765..e008a4e 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/button-reset-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 54, 26]
+        [7, 7, 52, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
index 739cb50..9a0d921 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 61, 26]
+        [7, 7, 59, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/textarea-caret-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/textarea-caret-expected.txt
index 5ecb5e43..eafeef0 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/forms/textarea-caret-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/forms/textarea-caret-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 185, 42]
+        [7, 7, 183, 40]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
index 50f016c..ac68195 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/caret-with-composited-scroll-expected.txt
@@ -27,7 +27,7 @@
       "name": "Scrolling Contents Layer",
       "bounds": [205, 1022],
       "invalidations": [
-        [0, 998, 205, 24]
+        [0, 999, 205, 23]
       ],
       "transform": 2
     }
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
index b5a6105..ad73cbc 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [76, 26],
+      "position": [-1, -1],
+      "bounds": [74, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 76, 26]
+        [0, 0, 74, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
index b5a6105..ad73cbc 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/scroll/invalidate-caret-in-non-composited-scrolling-container-expected.txt
@@ -8,11 +8,11 @@
     },
     {
       "name": "LayoutNGTextControlSingleLine INPUT id='root'",
-      "position": [-2, -2],
-      "bounds": [76, 26],
+      "position": [-1, -1],
+      "bounds": [74, 24],
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [0, 0, 76, 26]
+        [0, 0, 74, 24]
       ],
       "transform": 1
     }
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
index 40034d5b..7a299fb 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 76, 26]
+        [7, 7, 74, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
index 40034d5b..7a299fb 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-in-non-composited-scrolling-container-expected.txt
@@ -6,7 +6,7 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "invalidations": [
-        [6, 6, 76, 26]
+        [7, 7, 74, 24]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
index 807abd7..0833ca8 100644
--- a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-overflowing-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
index c698a08..9aa08f79 100644
--- a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/imagemap-polygon-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html
new file mode 100644
index 0000000..a2a5e57c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-cross-origin-subframe-navigation.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="unload-utils.js"></script>
+<script src="utils.js"></script>
+<body>
+<script type="module">
+const params = new URLSearchParams(location.search);
+const state = params.get('state') || 'start';
+
+const bc = openChannel();
+
+// Test steps:
+//   1. `start` page starts prerendering `prerendering` page.
+//   2. `prerendering` page adds `same-origin-frame`.
+//   3. `same-origin-frame' navigates to `cross-origin-frame`.
+//   4. `same-origin-frame` asks `start` page to activate `prerendering`.
+//   5. `visibilitychange` event is handled in `same-origin-frame` due to the
+//       activation.
+//   6. `pagehide`, `visibilitychange`, and `unload` events are handled in
+//      `same-origin-frame` for the resumed navigation.
+//   7. `cross-origin-frame` is loaded, then `prerendering` quits the test.
+bc.postMessage('load ' + state);
+if (state === 'start') {
+  const url = createTestUrl('prerendering');
+  startPrerendering(url);
+
+  // Wait for a message from 'same-origin-frame' that is sent after triggering
+  // cross-origin navigation.
+  await waitChannelMessage('request activation');
+
+  // Activate the 'prerendering' page.
+  document.location = url;
+} else if (state === 'prerendering') {
+  const frame = addFrame(createTestUrl('same-origin-frame'));
+
+  // Complete the test when the `cross-origin-frame` is loaded.
+  const message = await waitWindowMessage();
+  bc.postMessage(message);
+  bc.postMessage('Done');
+} else if (state === 'same-origin-frame') {
+  // unload handler should be triggered after the frame navigation.
+  // The deferred cross-origin navigation resumes when the browser process
+  // starts activation, and when Blink handles the unload event handler,
+  // document.prerendering state is unstable.
+  // TODO(https://crbug.com/1222547): Fix this unstable state by waiting for
+  // DidActivateForPrerendering() before proceeding with the subframe
+  // navigation.
+  addEventListeners('same-origin-frame', false);
+
+  // Run a cross-origin navigation.
+  document.location = createCrossOriginTestUrl('cross-origin-frame');
+
+  // Ask the 'start' page to activate the prerendering page.
+  bc.postMessage('request activation');
+} else if (state === 'cross-origin-frame') {
+  // Let the 'prerendering' page know this frame is loaded.
+  window.parent.postMessage('load ' + state, '*');
+}
+
+bc.close();
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html
new file mode 100644
index 0000000..1c4c7e4
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-remove-subframe.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="unload-utils.js"></script>
+<script src="utils.js"></script>
+<body>
+<script type="module">
+const params = new URLSearchParams(location.search);
+const state = params.get('state') || 'start';
+
+const bc = openChannel();
+
+// Test steps:
+//   1. `start` page starts prerendering `prerendering` page.
+//   2. `prerendering` page adds `frame`.
+//   3. `prerendering` page removes `frame`.
+//   4. `pageshow`, `pagehide` and `unload` are handled in `frame`.
+bc.postMessage('load ' + state);
+if (state == 'start') {
+  startPrerendering(createTestUrl('prerendering'));
+} else if (state === 'prerendering') {
+  const frame = addFrame(createTestUrl('frame'));
+
+  // Wait until the frame is loaded and requests removal.
+  await waitChannelMessage('request removal');
+
+  // Set up for waiting the unload message from `frame` and get a promise to
+  // wait it, then remove the frame. Once the promise is resolved, complete
+  // the test.
+  const promise = waitChannelMessage('unload frame in prerendering');
+  frame.remove();
+  await promise;
+  bc.postMessage('Done');
+} else if (state == 'frame') {
+  addEventListeners('frame', true);
+  bc.postMessage('request removal');
+}
+bc.close();
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html
new file mode 100644
index 0000000..f978010
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-on-prerender-same-origin-subframe-navigation.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="unload-utils.js"></script>
+<script src="utils.js"></script>
+<body>
+<script type="module">
+const params = new URLSearchParams(location.search);
+const state = params.get('state') || 'start';
+
+const bc = openChannel();
+
+// Test steps:
+//   1. `start` page starts prerendering `prerendering` page.
+//   2. `prerendering` page adds `same-origin-frame1`.
+//   3. `same-origin-frame1` navigates to `same-origin-frame2`.
+//   4. `pagehide` and `unload` events are handled.
+bc.postMessage('load ' + state);
+if (state === 'start') {
+  startPrerendering(createTestUrl('prerendering'));
+} else if (state === 'prerendering') {
+  addFrame(createTestUrl('same-origin-frame1'));
+} else if (state === 'same-origin-frame1') {
+  // unload handler should be triggered after the frame navigation.
+  addEventListeners('same-origin-frame1', true);
+
+  // Run a same-origin navigation.
+  document.location = createTestUrl('same-origin-frame2');
+} else if (state === 'same-origin-frame2') {
+  bc.postMessage('Done');
+}
+
+bc.close();
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js
new file mode 100644
index 0000000..51089dc
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload-utils.js
@@ -0,0 +1,58 @@
+// Note: Following utility functions are expected to be used from
+// upload-on-prerender-* test files.
+
+function createTestUrl(nextState) {
+  const params = new URLSearchParams();
+  params.set('state', nextState);
+  return location.pathname + '?' + params.toString();
+}
+
+function createCrossOriginTestUrl(nextState) {
+  const path = createTestUrl(nextState);
+  const url = new URL(path, location.href);
+  url.host = get_host_info().REMOTE_HOST;
+  return url.href;
+}
+
+function openChannel() {
+  return new BroadcastChannel('prerender');
+}
+
+function addFrame(url) {
+  const frame = document.createElement('iframe');
+  frame.src = url;
+  document.body.appendChild(frame);
+  return frame;
+}
+
+function addEventListeners(name, checkPrerenderingState) {
+  ['unload', 'pagehide', 'pageshow', 'visibilitychange'].forEach(eventName => {
+    window.addEventListener(eventName, e => {
+      const bc = openChannel();
+      bc.postMessage(eventName + ' ' + name +
+          (checkPrerenderingState && document.prerendering ? ' in prerendering'
+                                                             : ''));
+      bc.close();
+    });
+  });
+}
+
+function waitWindowMessage() {
+  return new Promise(resolve => {
+    window.addEventListener('message', e => resolve(e.data), { once: true });
+  });
+}
+
+function waitChannelMessage(message) {
+  return new Promise(resolve => {
+    const bc = openChannel();
+    bc._messages = [];
+    bc.addEventListener('message', e => {
+      bc._messages.push(e.data);
+      if (e.data == message) {
+        bc.close();
+        resolve(bc._messages);
+      }
+    });
+  });
+}
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload.html b/third_party/blink/web_tests/wpt_internal/prerender/resources/unload.html
deleted file mode 100644
index 111035c..0000000
--- a/third_party/blink/web_tests/wpt_internal/prerender/resources/unload.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE html>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="utils.js"></script>
-<body>
-<script>
-const params = new URLSearchParams(location.search);
-const testcase = params.get('testcase');
-const state = params.get('state');
-
-function createTestUrl(nextState) {
-  const params = new URLSearchParams();
-  params.set('state', nextState);
-  params.set('testcase', testcase);
-  return 'unload.html?' + params.toString();
-}
-
-function createCrossOriginTestUrl(nextState) {
-  const path = createTestUrl(nextState);
-  const url = new URL(path, location.href);
-  url.host = get_host_info().REMOTE_HOST;
-  return url.href;
-}
-
-function openChannel() {
-  return new BroadcastChannel('prerender-' + testcase);
-}
-
-function addFrame(url) {
-  const frame = document.createElement('iframe');
-  frame.src = url;
-  document.body.appendChild(frame);
-  return frame;
-}
-
-function addEventListeners(name, checkPrerenderingState) {
-  ['unload', 'pagehide', 'pageshow', 'visibilitychange'].forEach(eventName => {
-    window.addEventListener(eventName, e => {
-      const bc = openChannel();
-      bc.postMessage(eventName + ' ' + name +
-          (checkPrerenderingState && document.prerendering ? ' in prerendering'
-                                                             : ''));
-      bc.close();
-    });
-  });
-}
-
-function waitPostMessage() {
-  return new Promise(resolve => {
-    window.addEventListener('message', e => resolve(e.data), { once: true });
-  });
-}
-
-function waitMessage(message) {
-  return new Promise(resolve => {
-    const bc = openChannel();
-    bc.addEventListener('message', e => {
-      if (e.data == message) {
-        bc.close();
-        resolve();
-      }
-    });
-  });
-}
-
-async function sameOriginSubframeNavigation() {
-  const bc = new openChannel();
-
-  // Test steps:
-  //   1. `start` page starts prerendering `prerendering` page.
-  //   2. `prerendering` page adds `same-origin-frame1`.
-  //   3. `same-origin-frame1` navigates to `same-origin-frame2`.
-  //   4. `pagehide` and `unload` events are handled.
-  bc.postMessage('load ' + state);
-  if (state === 'start') {
-    startPrerendering(createTestUrl('prerendering'));
-  } else if (state === 'prerendering') {
-    addFrame(createTestUrl('same-origin-frame1'));
-  } else if (state === 'same-origin-frame1') {
-    // unload handler should be triggered after the frame navigation.
-    addEventListeners('same-origin-frame1', true);
-
-    // Run a same-origin navigation.
-    document.location = createTestUrl('same-origin-frame2');
-  } else if (state === 'same-origin-frame2') {
-    bc.postMessage('Done');
-  }
-
-  bc.close();
-}
-
-async function crossOriginSubframeNavigation() {
-  const bc = new openChannel();
-
-  // Test steps:
-  //   1. `start` page starts prerendering `prerendering` page.
-  //   2. `prerendering` page adds `same-origin-frame`.
-  //   3. `same-origin-frame' navigates to `cross-origin-frame`.
-  //   4. `same-origin-frame` asks `start` page to activate `prerendering`.
-  //   5. `visibilitychange` event is handled in `same-origin-frame` due to the
-  //       activation.
-  //   6. `pagehide`, `visibilitychange`, and `unload` events are handled in
-  //      `same-origin-frame` for the resumed navigation.
-  //   7. `cross-origin-frame` is loaded, then `prerendering` quits the test.
-  bc.postMessage('load ' + state);
-  if (state === 'start') {
-    const url = createTestUrl('prerendering');
-    startPrerendering(url);
-
-    // Wait for a message from 'same-origin-frame' that is sent after triggering
-    // cross-origin navigation.
-    await waitMessage('request activation');
-
-    // Activate the 'prerendering' page.
-    document.location = url;
-  } else if (state === 'prerendering') {
-    const frame = addFrame(createTestUrl('same-origin-frame'));
-
-    // Complete the test when the `cross-origin-frame` is loaded.
-    const message = await waitPostMessage();
-    bc.postMessage(message);
-    bc.postMessage('Done');
-  } else if (state === 'same-origin-frame') {
-    // unload handler should be triggered after the frame navigation.
-    // The deferred cross-origin navigation resumes when the browser process
-    // starts activation, and when Blink handles the unload event handler,
-    // document.prerendering state is unstable.
-    // TODO(https://crbug.com/1222547): Fix this unstable state by waiting for
-    // DidActivateForPrerendering() before proceeding with the subframe
-    // navigation.
-    addEventListeners('same-origin-frame', false);
-
-    // Run a cross-origin navigation.
-    document.location = createCrossOriginTestUrl('cross-origin-frame');
-
-    // Ask the 'start' page to activate the prerendering page.
-    bc.postMessage('request activation');
-  } else if (state === 'cross-origin-frame') {
-    // Let the 'prerendering' page know this frame is loaded.
-    window.parent.postMessage('load ' + state, '*');
-  }
-
-  bc.close();
-}
-
-async function removeSubframe() {
-  const bc = new openChannel();
-
-  // Test steps:
-  //   1. `start` page starts prerendering `prerendering` page.
-  //   2. `prerendering` page adds `frame`.
-  //   3. `prerendering` page removes `frame`.
-  //   4. `pageshow`, `pagehide` and `unload` are handled in `frame`.
-  bc.postMessage('load ' + state);
-  if (state == 'start') {
-    startPrerendering(createTestUrl('prerendering'));
-  } else if (state === 'prerendering') {
-    const frame = addFrame(createTestUrl('frame'));
-
-    // Wait until the frame is loaded and requests removal.
-    await waitMessage('request removal');
-
-    // Set up for waiting the unload message from `frame` and get a promise to
-    // wait it, then remove the frame. Once the promise is resolved, complete
-    // the test.
-    promise = waitMessage('unload frame in prerendering');
-    frame.remove();
-    await promise;
-    bc.postMessage('Done');
-  } else if (state == 'frame') {
-    addEventListeners('frame', true);
-    bc.postMessage('request removal');
-  }
-  bc.close();
-}
-
-async function mainFrameNavigation() {
-  const bc = new openChannel();
-
-  // Test steps:
-  //   1. `start` page starts prerendering `prerendering` page.
-  //   2. `prerendering` page navigates to `another-page`.
-  //   3. `prerendering` page asks the `start` page to navigate.
-  //   4. ``pagehide` and unload` may not be handled as the prerendering is
-  //      cancelled.
-  //   5. `start` does a fallback navigation as the prerendering is cancelled.
-  //   6. `prerendering` page loads again with document.prerendering == false.
-  //   7. `prerendering` page navigates to `another-page` again.
-  //   8. `pagehide`, `visibilitychange`, and `unload` are handled this time.
-  //   9. `another-page` finishes the test.
-  bc.postMessage('load ' + state +
-                 (document.prerendering ? ' in prerendering' : ''));
-  if (state === 'start') {
-    const url = createTestUrl('prerendering');
-    startPrerendering(url);
-
-    // Wait for a message from `prerendering` to navigate that results in
-    // fallback network navigation as the prerendering is cancelled.
-    await waitMessage('request fallback');
-
-    // Navigate.
-    document.location = url;
-  } else if (state === 'prerendering') {
-    // unload handler may not be triggered for cancellation.
-    addEventListeners('main-frame', true);
-
-    // Trigger a main frame navigation that will cancel the prerendering.
-    // This navigates successfully if the page isn't prerendered.
-    document.location = createTestUrl('another-page');
-
-    // Ask the `start` page to navigate if on prerendering. Otherwise, finish
-    // the test.
-    if (document.prerendering)
-      bc.postMessage('request fallback');
-  } else if (state === 'another-page') {
-    // Reach here after the prerendering is cancelled and fallback request loads
-    // the `prerendering` page with document.prerendering == false. The main
-    // frame navigation will succeed this time.
-    bc.postMessage('Done');
-  }
-
-  bc.close();
-}
-
-if (testcase === 'same-origin-subframe-navigation')
-  sameOriginSubframeNavigation();
-else if (testcase === 'cross-origin-subframe-navigation')
-  crossOriginSubframeNavigation();
-else if (testcase === 'remove-subframe')
-  removeSubframe();
-else if (testcase === 'main-frame-navigation')
-  mainFrameNavigation();
-
-</script>
-</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html
new file mode 100644
index 0000000..32a0c91
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-cross-origin-subframe-navigation.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<!--
+This file cannot be upstreamed to WPT until:
+* Cross-origin subframe navigation is aligned with the spec. Currently the test
+  expects the navigation to be deferred until prerendering activation. Also
+  document.prerendering state is unexpectedly unstable on resuming navigation.
+  (https://crbug.com/1222547)
+* `unload` event handling matches what the specification expects. The current
+  specification expects that the unload event handler is never fired, and the
+  test passes whether or not it is fired.
+* `pageshow` and `pagehide` behaviors during prerendering is clearly defined
+  in the specification. This test just checks current behaviors.
+  (https://crbug.com/1222551)
+-->
+<title>unload event handlers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/unload-utils.js"></script>
+<script>
+promise_test(async t => {
+  const gotMessages = waitChannelMessage('Done');
+  const url =
+      'resources/unload-on-prerender-cross-origin-subframe-navigation.html';
+  window.open(url, '_blank', 'noopener');
+  const result = await gotMessages;
+
+  const expected = [
+    'load start',
+    'load prerendering',
+    'load same-origin-frame',
+    'request activation',
+    'visibilitychange same-origin-frame',
+    'pagehide same-origin-frame',
+    'visibilitychange same-origin-frame',
+    'unload same-origin-frame',
+    'load cross-origin-frame',
+    'Done',
+  ];
+  assert_array_equals(result, expected, 'gotMessages');
+}, 'unload after activation on cross origin subframe navigation');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html
new file mode 100644
index 0000000..20e0528c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-remove-subframe.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!--
+This file cannot be upstreamed to WPT until:
+* `unload` event handling matches what the specification expects. The current
+  specification expects that the unload event handler is never fired, and the
+  test passes whether or not it is fired.
+* `pageshow` and `pagehide` behaviors during prerendering is clearly defined
+  in the specification. This test just checks current behaviors.
+  (https://crbug.com/1222551)
+-->
+<title>unload event handlers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/unload-utils.js"></script>
+<script>
+promise_test(async t => {
+  const gotMessages = waitChannelMessage('Done');
+  const url = 'resources/unload-on-prerender-remove-subframe.html';
+  window.open(url, '_blank', 'noopener');
+  const result = await gotMessages;
+
+  const expected = [
+    'load start',
+    'load prerendering',
+    'load frame',
+    'request removal',
+    'pageshow frame in prerendering',
+    'pagehide frame in prerendering',
+    'unload frame in prerendering',
+    'Done',
+  ];
+  assert_array_equals(result, expected, 'gotMessages');
+}, 'unload on removing subframe');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html
new file mode 100644
index 0000000..8bb0564
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!--
+This file cannot be upstreamed to WPT until:
+* `unload` event handling matches what the specification expects. The current
+  specification expects that the unload event handler is never fired, and the
+  test passes whether or not it is fired.
+* `pageshow` and `pagehide` behaviors during prerendering is clearly defined
+  in the specification. This test just checks current behaviors.
+  (https://crbug.com/1222551)
+-->
+<title>unload event handlers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/unload-utils.js"></script>
+<script>
+promise_test(async t => {
+  const gotMessages = waitChannelMessage('Done');
+  const url =
+      'resources/unload-on-prerender-same-origin-subframe-navigation.html';
+  window.open(url, '_blank', 'noopener');
+  const result = await gotMessages;
+
+  const expected = [
+    'load start',
+    'load prerendering',
+    'load same-origin-frame1',
+    'pagehide same-origin-frame1 in prerendering',
+    'unload same-origin-frame1 in prerendering',
+    'load same-origin-frame2',
+    'Done',
+  ];
+  assert_array_equals(result, expected, 'gotMessages');
+}, 'unload on same origin subframe navigation');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/unload.html b/third_party/blink/web_tests/wpt_internal/prerender/unload.html
deleted file mode 100644
index 3bb3493..0000000
--- a/third_party/blink/web_tests/wpt_internal/prerender/unload.html
+++ /dev/null
@@ -1,140 +0,0 @@
-<!DOCTYPE html>
-<!--
-This file cannot be upstreamed to WPT until:
-* The test changes to use a method to trigger cancellation of prerendering that
-  is guaranteed by the specification. Currently the test cancels prerendering
-  by performing a main frame navigation after the initial prerendering
-  navigation.
-* Cross-origin subframe navigation is aligned with the spec. Currently the test
-  expects the navigation to be deferred until prerendering activation. Also
-  document.prerendering state is unexpectedly unstable on resuming navigation.
-  (https://crbug.com/1222547)
-* `unload` event handling matches what the specification expects. the current
-  specification expects that the unload event handler is never fired, and the
-  test passes whether or not it is fired.
-  prerendering, but it would be practically difficult, and need a spec change.
-* `pageshow` and `pagehide` behaviors during prerendering is clearly defined
-  in the specification. This test just checks current behaviors.
-  (https://crbug.com/1222551)
--->
-<title>unload event handlers</title>
-<meta name="timeout" content="long">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-function createGotMessagesPromise(bc) {
-  return new Promise(resolve => {
-    bc._messages = [];
-    bc.addEventListener('message', e => {
-      bc._messages.push(e.data);
-      if (e.data == 'Done')
-        resolve(bc._messages);
-    });
-  });
-}
-
-function startTest(test) {
-  const url = `resources/unload.html?state=start&testcase=${test}`;
-  window.open(url, '_blank', 'noopener');
-}
-
-promise_test(async t => {
-  const bc = new BroadcastChannel('prerender-same-origin-subframe-navigation');
-  t.add_cleanup(_ => bc.close());
-
-  const gotMessages = createGotMessagesPromise(bc);
-  startTest('same-origin-subframe-navigation');
-  const result = await gotMessages;
-
-  const expected = [
-    'load start',
-    'load prerendering',
-    'load same-origin-frame1',
-    'pagehide same-origin-frame1 in prerendering',
-    'unload same-origin-frame1 in prerendering',
-    'load same-origin-frame2',
-    'Done',
-  ];
-  assert_array_equals(result, expected, 'gotMessages');
-}, 'unload on same origin subframe navigation');
-
-promise_test(async t => {
-  const bc = new BroadcastChannel('prerender-cross-origin-subframe-navigation');
-  t.add_cleanup(_ => bc.close());
-
-  const gotMessages = createGotMessagesPromise(bc);
-  startTest('cross-origin-subframe-navigation');
-  const result = await gotMessages;
-
-  const expected = [
-    'load start',
-    'load prerendering',
-    'load same-origin-frame',
-    'request activation',
-    'visibilitychange same-origin-frame',
-    'pagehide same-origin-frame',
-    'visibilitychange same-origin-frame',
-    'unload same-origin-frame',
-    'load cross-origin-frame',
-    'Done',
-  ];
-  assert_array_equals(result, expected, 'gotMessages');
-}, 'unload after activation on cross origin subframe navigation');
-
-promise_test(async t => {
-  const bc = new BroadcastChannel('prerender-remove-subframe');
-  t.add_cleanup(_ => bc.close());
-
-  const gotMessages = createGotMessagesPromise(bc);
-  startTest('remove-subframe');
-  const result = await gotMessages;
-
-  const expected = [
-    'load start',
-    'load prerendering',
-    'load frame',
-    'request removal',
-    'pageshow frame in prerendering',
-    'pagehide frame in prerendering',
-    'unload frame in prerendering',
-    'Done',
-  ];
-  assert_array_equals(result, expected, 'gotMessages');
-}, 'unload on removing subframe');
-
-promise_test(async t => {
-  const bc = new BroadcastChannel('prerender-main-frame-navigation');
-  t.add_cleanup(_ => bc.close());
-
-  const gotMessages = createGotMessagesPromise(bc);
-  startTest('main-frame-navigation');
-  const result = await gotMessages;
-
-  const expected = [
-    // If `optional` is specified as true, that entry may not appear.
-    { message: 'load start' },
-    { message: 'load prerendering in prerendering' },
-    { message: 'request fallback' },
-    // TODO(https://crbug.com/1200241): `pagehide` and `unload` may not run
-    // sometimes for unknown reason. Clarify the reason and fix it.
-    { message: 'pagehide main-frame in prerendering', optional: true },
-    { message: 'unload main-frame in prerendering', optional: true },
-    { message: 'load prerendering' },
-    { message: 'pagehide main-frame' },
-    { message: 'visibilitychange main-frame' },
-    { message: 'unload main-frame' },
-    { message: 'load another-page' },
-    { message: 'Done' },
-  ];
-  let offset = 0;
-  assert_less_than_equal(result.length, expected.length);
-  for (let i = 0; i < expected.length; ++i) {
-    assert_less_than(offset, result.length);
-    while (expected[i].optional && expected[i].message != result[offset])
-      continue;
-    assert_equals(result[offset], expected[i].message, `messages${offset}`);
-    offset++;
-  }
-  assert_equals(offset, result.length);
-}, 'unload on main frame navigation to cancel prerendering');
-</script>
diff --git a/third_party/zlib/google/zip_internal.cc b/third_party/zlib/google/zip_internal.cc
index c23e92e..cea1e88 100644
--- a/third_party/zlib/google/zip_internal.cc
+++ b/third_party/zlib/google/zip_internal.cc
@@ -8,9 +8,13 @@
 #include <string.h>
 
 #include <algorithm>
+#include <unordered_set>
 
+#include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "base/notreached.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -36,9 +40,9 @@
 } WIN32FILE_IOWIN;
 
 // This function is derived from third_party/minizip/iowin32.c.
-// Its only difference is that it treats the char* as UTF8 and
+// Its only difference is that it treats the filename as UTF-8 and
 // uses the Unicode version of CreateFile.
-void* ZipOpenFunc(void* opaque, const char* filename, int mode) {
+void* ZipOpenFunc(void* opaque, const void* filename, int mode) {
   DWORD desired_access = 0, creation_disposition = 0;
   DWORD share_mode = 0, flags_and_attributes = 0;
   HANDLE file = 0;
@@ -56,10 +60,11 @@
     creation_disposition = CREATE_ALWAYS;
   }
 
-  std::wstring filenamew = base::UTF8ToWide(filename);
-  if ((filename != NULL) && (desired_access != 0)) {
-    file = CreateFile(filenamew.c_str(), desired_access, share_mode, NULL,
-                      creation_disposition, flags_and_attributes, NULL);
+  if (filename != nullptr && desired_access != 0) {
+    file = CreateFileW(
+        base::UTF8ToWide(static_cast<const char*>(filename)).c_str(),
+        desired_access, share_mode, nullptr, creation_disposition,
+        flags_and_attributes, nullptr);
   }
 
   if (file == INVALID_HANDLE_VALUE)
@@ -83,7 +88,7 @@
 // Callback function for zlib that opens a file stream from a file descriptor.
 // Since we do not own the file descriptor, dup it so that we can fdopen/fclose
 // a file stream.
-void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* FdOpenFileFunc(void* opaque, const void* filename, int mode) {
   FILE* file = NULL;
   const char* mode_fopen = NULL;
 
@@ -111,9 +116,9 @@
 
 // Fills |pzlib_filecunc_def| appropriately to handle the zip file
 // referred to by |fd|.
-void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
-  fill_fopen_filefunc(pzlib_filefunc_def);
-  pzlib_filefunc_def->zopen_file = FdOpenFileFunc;
+void FillFdOpenFileFunc(zlib_filefunc64_def* pzlib_filefunc_def, int fd) {
+  fill_fopen64_filefunc(pzlib_filefunc_def);
+  pzlib_filefunc_def->zopen64_file = FdOpenFileFunc;
   pzlib_filefunc_def->zclose_file = FdCloseFileFunc;
   int* ptr_fd = static_cast<int*>(malloc(sizeof(fd)));
   *ptr_fd = fd;
@@ -124,7 +129,7 @@
 #if defined(OS_WIN)
 // Callback function for zlib that opens a file stream from a Windows handle.
 // Does not take ownership of the handle.
-void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) {
+void* HandleOpenFileFunc(void* opaque, const void* /*filename*/, int mode) {
   WIN32FILE_IOWIN file_ret;
   file_ret.hf = static_cast<HANDLE>(opaque);
   file_ret.error = 0;
@@ -148,8 +153,8 @@
 // expect their opaque parameters refer to this struct.
 struct ZipBuffer {
   const char* data;  // weak
-  size_t length;
-  size_t offset;
+  ZPOS64_T length;
+  ZPOS64_T offset;
 };
 
 // Opens the specified file. When this function returns a non-NULL pointer, zlib
@@ -158,7 +163,7 @@
 // given opaque parameter and returns it because this parameter stores all
 // information needed for uncompressing data. (This function does not support
 // writing compressed data and it returns NULL for this case.)
-void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) {
+void* OpenZipBuffer(void* opaque, const void* /*filename*/, int mode) {
   if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) {
     NOTREACHED();
     return NULL;
@@ -175,10 +180,11 @@
 uLong ReadZipBuffer(void* opaque, void* /*stream*/, void* buf, uLong size) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   DCHECK_LE(buffer->offset, buffer->length);
-  size_t remaining_bytes = buffer->length - buffer->offset;
+  ZPOS64_T remaining_bytes = buffer->length - buffer->offset;
   if (!buffer || !buffer->data || !remaining_bytes)
     return 0;
-  size = std::min(size, static_cast<uLong>(remaining_bytes));
+  if (size > remaining_bytes)
+    size = remaining_bytes;
   memcpy(buf, &buffer->data[buffer->offset], size);
   buffer->offset += size;
   return size;
@@ -195,21 +201,23 @@
 }
 
 // Returns the offset from the beginning of the data.
-long GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
+ZPOS64_T GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
-  return static_cast<long>(buffer->offset);
+  return buffer->offset;
 }
 
 // Moves the current offset to the specified position.
-long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) {
+long SeekZipBuffer(void* opaque,
+                   void* /*stream*/,
+                   ZPOS64_T offset,
+                   int origin) {
   ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque);
   if (!buffer)
     return -1;
   if (origin == ZLIB_FILEFUNC_SEEK_CUR) {
-    buffer->offset =
-        std::min(buffer->offset + static_cast<size_t>(offset), buffer->length);
+    buffer->offset = std::min(buffer->offset + offset, buffer->length);
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_END) {
@@ -217,7 +225,7 @@
     return 0;
   }
   if (origin == ZLIB_FILEFUNC_SEEK_SET) {
-    buffer->offset = std::min(buffer->length, static_cast<size_t>(offset));
+    buffer->offset = std::min(buffer->length, offset);
     return 0;
   }
   NOTREACHED();
@@ -268,33 +276,33 @@
 namespace internal {
 
 unzFile OpenForUnzipping(const std::string& file_name_utf8) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs);
+  return unzOpen2_64(file_name_utf8.c_str(), zip_func_ptrs);
 }
 
 #if defined(OS_POSIX)
 unzFile OpenFdForUnzipping(int zip_fd) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
 #if defined(OS_WIN)
 unzFile OpenHandleForUnzipping(HANDLE zip_handle) {
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = HandleOpenFileFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = HandleOpenFileFunc;
   zip_funcs.zclose_file = HandleCloseFileFunc;
   zip_funcs.opaque = zip_handle;
-  return unzOpen2("fd", &zip_funcs);
+  return unzOpen2_64("fd", &zip_funcs);
 }
 #endif
 
@@ -310,43 +318,43 @@
   buffer->length = data.length();
   buffer->offset = 0;
 
-  zlib_filefunc_def zip_functions;
-  zip_functions.zopen_file = OpenZipBuffer;
+  zlib_filefunc64_def zip_functions;
+  zip_functions.zopen64_file = OpenZipBuffer;
   zip_functions.zread_file = ReadZipBuffer;
   zip_functions.zwrite_file = WriteZipBuffer;
-  zip_functions.ztell_file = GetOffsetOfZipBuffer;
-  zip_functions.zseek_file = SeekZipBuffer;
+  zip_functions.ztell64_file = GetOffsetOfZipBuffer;
+  zip_functions.zseek64_file = SeekZipBuffer;
   zip_functions.zclose_file = CloseZipBuffer;
   zip_functions.zerror_file = GetErrorOfZipBuffer;
-  zip_functions.opaque = static_cast<void*>(buffer);
-  return unzOpen2(NULL, &zip_functions);
+  zip_functions.opaque = buffer;
+  return unzOpen2_64(nullptr, &zip_functions);
 }
 
 zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) {
-  zlib_filefunc_def* zip_func_ptrs = NULL;
+  zlib_filefunc64_def* zip_func_ptrs = nullptr;
 #if defined(OS_WIN)
-  zlib_filefunc_def zip_funcs;
-  fill_win32_filefunc(&zip_funcs);
-  zip_funcs.zopen_file = ZipOpenFunc;
+  zlib_filefunc64_def zip_funcs;
+  fill_win32_filefunc64(&zip_funcs);
+  zip_funcs.zopen64_file = ZipOpenFunc;
   zip_func_ptrs = &zip_funcs;
 #endif
-  return zipOpen2(file_name_utf8.c_str(), append_flag,
-                  NULL,  // global comment
-                  zip_func_ptrs);
+  return zipOpen2_64(file_name_utf8.c_str(), append_flag, nullptr,
+                     zip_func_ptrs);
 }
 
 #if defined(OS_POSIX)
 zipFile OpenFdForZipping(int zip_fd, int append_flag) {
-  zlib_filefunc_def zip_funcs;
+  zlib_filefunc64_def zip_funcs;
   FillFdOpenFileFunc(&zip_funcs, zip_fd);
   // Passing dummy "fd" filename to zlib.
-  return zipOpen2("fd", append_flag, NULL, &zip_funcs);
+  return zipOpen2_64("fd", append_flag, nullptr, &zip_funcs);
 }
 #endif
 
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time) {
+                         base::Time last_modified_time,
+                         Compression compression) {
   // Section 4.4.4 http://www.pkware.com/documents/casestudies/APPNOTE.TXT
   // Setting the Language encoding flag so the file is told to be in utf-8.
   const uLong LANGUAGE_ENCODING_FLAG = 0x1 << 11;
@@ -361,7 +369,7 @@
       /*extrafield_global=*/nullptr,
       /*size_extrafield_global=*/0u,
       /*comment=*/nullptr,
-      /*method=*/Z_DEFLATED,
+      /*method=*/compression,
       /*level=*/Z_DEFAULT_COMPRESSION,
       /*raw=*/0,
       /*windowBits=*/-MAX_WBITS,
@@ -382,5 +390,80 @@
   return true;
 }
 
+Compression GetCompressionMethod(const base::FilePath& path) {
+  // Get the filename extension in lower case.
+  const base::FilePath::StringType ext =
+      base::ToLowerASCII(path.FinalExtension());
+
+  if (ext.empty())
+    return kDeflated;
+
+  using StringPiece = base::FilePath::StringPieceType;
+
+  // Skip the leading dot.
+  StringPiece ext_without_dot = ext;
+  DCHECK_EQ(ext_without_dot.front(), FILE_PATH_LITERAL('.'));
+  ext_without_dot.remove_prefix(1);
+
+  // Well known filename extensions of files that a likely to be already
+  // compressed. The extensions are in lower case without the leading dot.
+  static const base::NoDestructor<
+      std::unordered_set<StringPiece, base::StringPieceHashImpl<StringPiece>>>
+      exts(std::initializer_list<StringPiece>{
+          FILE_PATH_LITERAL("3g2"),   //
+          FILE_PATH_LITERAL("3gp"),   //
+          FILE_PATH_LITERAL("7z"),    //
+          FILE_PATH_LITERAL("7zip"),  //
+          FILE_PATH_LITERAL("aac"),   //
+          FILE_PATH_LITERAL("avi"),   //
+          FILE_PATH_LITERAL("bz"),    //
+          FILE_PATH_LITERAL("bz2"),   //
+          FILE_PATH_LITERAL("crx"),   //
+          FILE_PATH_LITERAL("gif"),   //
+          FILE_PATH_LITERAL("gz"),    //
+          FILE_PATH_LITERAL("jar"),   //
+          FILE_PATH_LITERAL("jpeg"),  //
+          FILE_PATH_LITERAL("jpg"),   //
+          FILE_PATH_LITERAL("lz"),    //
+          FILE_PATH_LITERAL("m2v"),   //
+          FILE_PATH_LITERAL("m4p"),   //
+          FILE_PATH_LITERAL("m4v"),   //
+          FILE_PATH_LITERAL("mng"),   //
+          FILE_PATH_LITERAL("mov"),   //
+          FILE_PATH_LITERAL("mp2"),   //
+          FILE_PATH_LITERAL("mp3"),   //
+          FILE_PATH_LITERAL("mp4"),   //
+          FILE_PATH_LITERAL("mpe"),   //
+          FILE_PATH_LITERAL("mpeg"),  //
+          FILE_PATH_LITERAL("mpg"),   //
+          FILE_PATH_LITERAL("mpv"),   //
+          FILE_PATH_LITERAL("ogg"),   //
+          FILE_PATH_LITERAL("ogv"),   //
+          FILE_PATH_LITERAL("png"),   //
+          FILE_PATH_LITERAL("qt"),    //
+          FILE_PATH_LITERAL("rar"),   //
+          FILE_PATH_LITERAL("taz"),   //
+          FILE_PATH_LITERAL("tb2"),   //
+          FILE_PATH_LITERAL("tbz"),   //
+          FILE_PATH_LITERAL("tbz2"),  //
+          FILE_PATH_LITERAL("tgz"),   //
+          FILE_PATH_LITERAL("tlz"),   //
+          FILE_PATH_LITERAL("tz"),    //
+          FILE_PATH_LITERAL("tz2"),   //
+          FILE_PATH_LITERAL("vob"),   //
+          FILE_PATH_LITERAL("webm"),  //
+          FILE_PATH_LITERAL("wma"),   //
+          FILE_PATH_LITERAL("wmv"),   //
+          FILE_PATH_LITERAL("xz"),    //
+          FILE_PATH_LITERAL("z"),     //
+          FILE_PATH_LITERAL("zip"),   //
+      });
+
+  if (exts->count(ext_without_dot))
+    return kStored;
+
+  return kDeflated;
+}
+
 }  // namespace internal
 }  // namespace zip
diff --git a/third_party/zlib/google/zip_internal.h b/third_party/zlib/google/zip_internal.h
index 9fb5482..ef5b5d0 100644
--- a/third_party/zlib/google/zip_internal.h
+++ b/third_party/zlib/google/zip_internal.h
@@ -60,10 +60,24 @@
 zipFile OpenFdForZipping(int zip_fd, int append_flag);
 #endif
 
+// Compression methods.
+enum Compression {
+  kStored = 0,             // Stored (no compression)
+  kDeflated = Z_DEFLATED,  // Deflated
+};
+
 // Adds a file (or directory) entry to the ZIP archive.
 bool ZipOpenNewFileInZip(zipFile zip_file,
                          const std::string& str_path,
-                         base::Time last_modified_time);
+                         base::Time last_modified_time,
+                         Compression compression);
+
+// Selects the best compression method for the given file. The heuristic is
+// based on the filename extension. By default, the compression method is
+// kDeflated. But if the given path has an extension indicating a well known
+// file format which is likely to be already compressed (eg ZIP, RAR, JPG,
+// PNG...) then the compression method is simply kStored.
+Compression GetCompressionMethod(const base::FilePath& path);
 
 const int kZipMaxPath = 256;
 const int kZipBufSize = 8192;
diff --git a/third_party/zlib/google/zip_unittest.cc b/third_party/zlib/google/zip_unittest.cc
index 03d389e..876f3eb1 100644
--- a/third_party/zlib/google/zip_unittest.cc
+++ b/third_party/zlib/google/zip_unittest.cc
@@ -26,8 +26,12 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 #include "third_party/zlib/google/zip.h"
+#include "third_party/zlib/google/zip_internal.h"
 #include "third_party/zlib/google/zip_reader.h"
 
+// Convenience macro to create a file path from a string literal.
+#define FP(path) base::FilePath(FILE_PATH_LITERAL(path))
+
 namespace {
 
 bool CreateFile(const std::string& content,
@@ -58,7 +62,7 @@
 
   VirtualFileSystem() {
     base::FilePath test_dir;
-    base::FilePath foo_txt_path = test_dir.Append(FILE_PATH_LITERAL("foo.txt"));
+    base::FilePath foo_txt_path = test_dir.AppendASCII("foo.txt");
 
     base::FilePath file_path;
     base::File file;
@@ -66,15 +70,13 @@
     DCHECK(success);
     files_[foo_txt_path] = std::move(file);
 
-    base::FilePath bar_dir = test_dir.Append(FILE_PATH_LITERAL("bar"));
-    base::FilePath bar1_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar1.txt"));
+    base::FilePath bar_dir = test_dir.AppendASCII("bar");
+    base::FilePath bar1_txt_path = bar_dir.AppendASCII("bar1.txt");
     success = CreateFile(kBar1Content, &file_path, &file);
     DCHECK(success);
     files_[bar1_txt_path] = std::move(file);
 
-    base::FilePath bar2_txt_path =
-        bar_dir.Append(FILE_PATH_LITERAL("bar2.txt"));
+    base::FilePath bar2_txt_path = bar_dir.AppendASCII("bar2.txt");
     success = CreateFile(kBar2Content, &file_path, &file);
     DCHECK(success);
     files_[bar2_txt_path] = std::move(file);
@@ -172,22 +174,20 @@
     test_dir_ = temp_dir_.GetPath();
 
     base::FilePath zip_path(test_dir_);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("foo.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("foo"));
+    zip_contents_.insert(zip_path.AppendASCII("foo.txt"));
+    zip_path = zip_path.AppendASCII("foo");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("bar.txt")));
-    zip_path = zip_path.Append(FILE_PATH_LITERAL("bar"));
+    zip_contents_.insert(zip_path.AppendASCII("bar.txt"));
+    zip_path = zip_path.AppendASCII("bar");
     zip_contents_.insert(zip_path);
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("baz.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL("quux.txt")));
-    zip_contents_.insert(zip_path.Append(FILE_PATH_LITERAL(".hidden")));
+    zip_contents_.insert(zip_path.AppendASCII("baz.txt"));
+    zip_contents_.insert(zip_path.AppendASCII("quux.txt"));
+    zip_contents_.insert(zip_path.AppendASCII(".hidden"));
 
     // Include a subset of files in |zip_file_list_| to test ZipFiles().
-    zip_file_list_.push_back(base::FilePath(FILE_PATH_LITERAL("foo.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/quux.txt")));
-    zip_file_list_.push_back(
-        base::FilePath(FILE_PATH_LITERAL("foo/bar/.hidden")));
+    zip_file_list_.push_back(FP("foo.txt"));
+    zip_file_list_.push_back(FP("foo/bar/quux.txt"));
+    zip_file_list_.push_back(FP("foo/bar/.hidden"));
   }
 
   virtual void TearDown() { PlatformTest::TearDown(); }
@@ -224,7 +224,7 @@
         base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);
     base::FilePath unzipped_entry_path = files.Next();
     size_t count = 0;
-    while (!unzipped_entry_path.value().empty()) {
+    while (!unzipped_entry_path.empty()) {
       EXPECT_EQ(zip_contents_.count(unzipped_entry_path), 1U)
           << "Couldn't find " << unzipped_entry_path.value();
       count++;
@@ -232,28 +232,15 @@
       if (base::PathExists(unzipped_entry_path) &&
           !base::DirectoryExists(unzipped_entry_path)) {
         // It's a file, check its contents are what we zipped.
-        // TODO(774156): figure out why the commented out EXPECT_TRUE below
-        // fails on the build bots (but not on the try-bots).
         base::FilePath relative_path;
-        bool append_relative_path_success =
-            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path);
-        if (!append_relative_path_success) {
-          LOG(ERROR) << "Append relative path failed, params: " << test_dir_
-                     << " and " << unzipped_entry_path;
-        }
+        ASSERT_TRUE(
+            test_dir_.AppendRelativePath(unzipped_entry_path, &relative_path))
+            << "Cannot append relative path failed, params: '" << test_dir_
+            << "' and '" << unzipped_entry_path << "'";
         base::FilePath original_path = original_dir.Append(relative_path);
-        const bool equal =
-            base::ContentsEqual(original_path, unzipped_entry_path);
-        if (equal) {
-          LOG(INFO) << "Original and unzipped file '" << relative_path
-                    << "' are equal";
-        } else {
-          LOG(ERROR) << "Original and unzipped file '" << relative_path
-                     << "' are different";
-        }
-        // EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
-        //    << "Contents differ between original " << original_path.value()
-        //    << " and unzipped file " << unzipped_entry_path.value();
+        EXPECT_TRUE(base::ContentsEqual(original_path, unzipped_entry_path))
+            << "Original file '" << original_path << "' and unzipped file '"
+            << unzipped_entry_path << "' have different contents";
       }
       unzipped_entry_path = files.Next();
     }
@@ -575,17 +562,17 @@
   ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
   const base::FilePath& temp_dir = scoped_temp_dir.GetPath();
   ASSERT_TRUE(zip::Unzip(zip_file, temp_dir));
-  base::FilePath bar_dir = temp_dir.Append(FILE_PATH_LITERAL("bar"));
+  base::FilePath bar_dir = temp_dir.AppendASCII("bar");
   EXPECT_TRUE(base::DirectoryExists(bar_dir));
   std::string file_content;
-  EXPECT_TRUE(base::ReadFileToString(
-      temp_dir.Append(FILE_PATH_LITERAL("foo.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(temp_dir.AppendASCII("foo.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kFooContent, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar1.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar1.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar1Content, file_content);
-  EXPECT_TRUE(base::ReadFileToString(
-      bar_dir.Append(FILE_PATH_LITERAL("bar2.txt")), &file_content));
+  EXPECT_TRUE(
+      base::ReadFileToString(bar_dir.AppendASCII("bar2.txt"), &file_content));
   EXPECT_EQ(VirtualFileSystem::kBar2Content, file_content);
 }
 
@@ -710,4 +697,121 @@
   }
 }
 
+// Tests zip::internal::GetCompressionMethod()
+TEST_F(ZipTest, GetCompressionMethod) {
+  using zip::internal::GetCompressionMethod;
+  using zip::internal::kDeflated;
+  using zip::internal::kStored;
+
+  EXPECT_EQ(GetCompressionMethod(FP("")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("NoExtension")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Folder.zip").Append(FP("NoExtension"))),
+            kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.txt")), kDeflated);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name....zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.zip")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("NAME.ZIP")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar.gz")), kStored);
+  EXPECT_EQ(GetCompressionMethod(FP("Name.tar")), kDeflated);
+
+  // This one is controversial.
+  EXPECT_EQ(GetCompressionMethod(FP(".zip")), kStored);
+}
+
+// Tests that files put inside a ZIP are effectively compressed.
+TEST_F(ZipTest, Compressed) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create some dummy source files.
+  for (const base::StringPiece s : {"foo", "bar.txt", ".hidden"}) {
+    base::File f(src_dir.AppendASCII(s),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(5000));
+  }
+
+  // Zip the source files.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir,
+                        .dest_file = dest_file,
+                        .include_hidden_files = true}));
+
+  // Since the source files compress well, the destination ZIP file should be
+  // smaller than the source files.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, 300);
+  EXPECT_LT(dest_file_size, 1000);
+}
+
+// Tests that a ZIP put inside a ZIP is simply stored instead of being
+// compressed.
+TEST_F(ZipTest, NestedZip) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a dummy ZIP file. This is not a valid ZIP file, but for the purpose
+  // of this test, it doesn't really matter.
+  const int64_t src_size = 5000;
+
+  {
+    base::File f(src_dir.AppendASCII("src.zip"),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+}
+
+// Tests that there is no 2GB or 4GB limits. Tests that big files can be zipped
+// (crbug.com/1207737) and that big ZIP files can be created
+// (crbug.com/1221447).
+TEST_F(ZipTest, DISABLED_BigFile) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+
+  const base::FilePath src_dir = temp_dir.GetPath().AppendASCII("input");
+  EXPECT_TRUE(base::CreateDirectory(src_dir));
+
+  // Create a big dummy ZIP file. This is not a valid ZIP file, but for the
+  // purpose of this test, it doesn't really matter.
+  const int64_t src_size = 5'000'000'000;
+
+  {
+    base::File f(src_dir.AppendASCII("src.zip"),
+                 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(f.SetLength(src_size));
+  }
+
+  // Zip the dummy ZIP file.
+  const base::FilePath dest_file = temp_dir.GetPath().AppendASCII("dest.zip");
+  EXPECT_TRUE(zip::Zip({.src_dir = src_dir, .dest_file = dest_file}));
+
+  // Since the dummy source (inner) ZIP file should simply be stored in the
+  // destination (outer) ZIP file, the destination file should be bigger than
+  // the source file, but not much bigger.
+  int64_t dest_file_size;
+  ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size));
+  EXPECT_GT(dest_file_size, src_size + 100);
+  EXPECT_LT(dest_file_size, src_size + 300);
+}
+
 }  // namespace
diff --git a/third_party/zlib/google/zip_writer.cc b/third_party/zlib/google/zip_writer.cc
index 90b56eda..3e2345a4 100644
--- a/third_party/zlib/google/zip_writer.cc
+++ b/third_party/zlib/google/zip_writer.cc
@@ -74,13 +74,21 @@
                                  bool is_directory,
                                  base::Time last_modified) {
   std::string str_path = path.AsUTF8Unsafe();
+
 #if defined(OS_WIN)
   base::ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/");
 #endif
-  if (is_directory)
-    str_path += "/";
 
-  return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified);
+  Compression compression = kDeflated;
+
+  if (is_directory) {
+    str_path += "/";
+  } else {
+    compression = GetCompressionMethod(path);
+  }
+
+  return zip::internal::ZipOpenNewFileInZip(zip_file_, str_path, last_modified,
+                                            compression);
 }
 
 bool ZipWriter::CloseNewFileEntry() {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a81780ea..8ca30ff 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -66244,6 +66244,7 @@
   <int value="23" label="kDidFailLoad"/>
   <int value="24" label="kStop"/>
   <int value="25" label="kSslCertificateError"/>
+  <int value="26" label="kLoginAuthRequested"/>
 </enum>
 
 <enum name="PrerenderHoverEvent">
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 46c62b34..592a6d5 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -182,17 +182,6 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.CredentialExtension.KeychainSavePasswordFailureCount"
-    units="count" expires_after="2022-03-31">
-  <owner>javierrobles@chromium.org</owner>
-  <owner>rkgibson@google.com</owner>
-  <summary>
-    The number of times the Credential Extension failed to save a
-    newly-generated password into the system Keychain since last Chrome
-    foregrounding. Reported when Chrome is put in foreground.
-  </summary>
-</histogram>
-
 <histogram name="IOS.CredentialExtension.PasswordUseCount" units="count"
     expires_after="2021-12-11">
   <owner>javierrobles@chromium.org</owner>
@@ -226,17 +215,6 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.CredentialExtension.SaveCredentialFailureCount"
-    units="count" expires_after="2022-03-31">
-  <owner>javierrobles@chromium.org</owner>
-  <owner>rkgibson@google.com</owner>
-  <summary>
-    The number of times the Credential Extension failed to save a
-    newly-generated credential to disk since last Chrome foregrounding. Reported
-    when Chrome is put in foreground.
-  </summary>
-</histogram>
-
 <histogram name="IOS.CredentialExtension.SearchCount" units="count"
     expires_after="2021-12-11">
   <owner>javierrobles@chromium.org</owner>
diff --git a/ui/android/java/src/org/chromium/ui/base/Clipboard.java b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
index e2fc402..b7c0653 100644
--- a/ui/android/java/src/org/chromium/ui/base/Clipboard.java
+++ b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
@@ -262,6 +262,8 @@
         // we will access the clipboard content and valid by URLUtil#isValidUrl.
         if (BuildInfo.isAtLeastS()) {
             ClipDescription description = mClipboardManager.getPrimaryClipDescription();
+            if (description == null) return false;
+
             float score = ApiHelperForS.getConfidenceScore(description, TextClassifier.TYPE_URL);
             return score > CONFIDENCE_THRESHOLD_FOR_URL_DETECTION;
         } else {
diff --git a/ui/chromeos/events/pref_names.cc b/ui/chromeos/events/pref_names.cc
index b4f16ea..a3102bb 100644
--- a/ui/chromeos/events/pref_names.cc
+++ b/ui/chromeos/events/pref_names.cc
@@ -10,8 +10,8 @@
 // These are attached to the user profile
 
 // Integer prefs which determine how we remap modifier keys (e.g. swap Alt and
-// Control.) Possible values for these prefs are 0-6. See ModifierKey enum in
-// src/chrome/browser/chromeos/input_method/xkeyboard.h
+// Control.) Possible values for these prefs are 0-7. See ModifierKey enum in
+// src/ui/chromeos/events/modifier_key.h
 const char kLanguageRemapSearchKeyTo[] =
     // Note: we no longer use XKB for remapping these keys, but we can't change
     // the pref names since the names are already synced with the cloud.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
index 0f00f77..be2088b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -321,6 +321,7 @@
 <translation id="383652340667548381">Serbian</translation>
 <translation id="385051799172605136">Back</translation>
 <translation id="3855472144336161447">German Neo 2</translation>
+<translation id="3858860766373142691">Name</translation>
 <translation id="386548886866354912">Pack with <ph name="EXTENSION_NAME" /></translation>
 <translation id="3866249974567520381">Description</translation>
 <translation id="3899991606604168269">French (Canada) with multilingual keyboard</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
index c2e6d04..f6c53a7 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -321,6 +321,7 @@
 <translation id="383652340667548381">සයිබීරියානු</translation>
 <translation id="385051799172605136">ආපසු</translation>
 <translation id="3855472144336161447">ජර්මානු නියෝ 2</translation>
+<translation id="3858860766373142691">නම</translation>
 <translation id="386548886866354912"><ph name="EXTENSION_NAME" /> සමඟ අසුරන්න</translation>
 <translation id="3866249974567520381">විස්තරය</translation>
 <translation id="3899991606604168269">බහුභාෂා යතුරුපුවරුව සමග ප්‍රංශ (කැනඩාව)</translation>
diff --git a/ui/file_manager/file_manager/common/js/storage_adapter.js b/ui/file_manager/file_manager/common/js/storage_adapter.js
index c5ff9bd43..67911ea 100644
--- a/ui/file_manager/file_manager/common/js/storage_adapter.js
+++ b/ui/file_manager/file_manager/common/js/storage_adapter.js
@@ -6,6 +6,64 @@
 export const storage = {};
 
 /**
+ * StorageAreaAsync is a wrapper for existing storage implementations to
+ * include async/await compatible version of get/set.
+ * @extends {StorageArea}
+ */
+class StorageAreaAsync {
+  /**
+   * @param {?StorageArea} storageArea chrome.storage.{local,sync} or null
+   */
+  constructor(storageArea) {
+    this.storageArea_ = (storageArea) ? storageArea : this;
+
+    this.get = this.storageArea_.get.bind(this.storageArea_);
+    this.set = this.storageArea_.set.bind(this.storageArea_);
+    this.remove = this.storageArea_.remove.bind(this.storageArea_);
+    this.clear = this.storageArea_.clear.bind(this.storageArea_);
+  }
+
+  /**
+   * Convert the storage.{local,sync}.get method to return a Promise.
+   * @param {string|!Array<string>} keys
+   * @returns {!Promise<!Object<string, *>>}
+   */
+  async getAsync(keys) {
+    return new Promise((resolve, reject) => {
+      this.get(keys, (values) => {
+        if (chrome && chrome.runtime && chrome.runtime.lastError) {
+          const keysString = keys && keys.join(', ');
+          reject(`Failed to retrieve keys [${keysString}] from browser storage:
+              ${chrome.runtime.lastError.message}`);
+          return;
+        }
+        resolve(values);
+      });
+    });
+  }
+
+  /**
+   * Convert the storage.{local,sync}.set method to return a Promise.
+   * @param {!Object<string, *>} values
+   * @returns {!Promise<void>}
+   */
+  async setAsync(values) {
+    return new Promise((resolve, reject) => {
+      this.set(values, () => {
+        if (chrome && chrome.runtime && chrome.runtime.lastError) {
+          const keysString = values && Object.keys(values).join(', ');
+          reject(`Failed to update browser storage keys
+              [${keysString}] with supplied values:
+              ${chrome.runtime.lastError.message}`);
+          return;
+        }
+        resolve();
+      });
+    });
+  }
+}
+
+/**
  * If localStorage hasn't been loaded, read it and populate the storage
  * for the specified type ('sync' or 'local').
  * @param {string} type
@@ -36,13 +94,17 @@
 };
 
 /**
- * @extends {StorageArea}
+ * StorageAreaSWAImpl enables the SWA version of Files app to continue using the
+ * xfm.storage.* APIs by transparently switching them to use window.localStorage
+ * instead of the chrome.storage APIs.
  */
-class StorageAreaSWAImpl {
+class StorageAreaSWAImpl extends StorageAreaAsync {
   /**
    * @param {string} type
    */
   constructor(type) {
+    super(/** storageArea */ null);
+
     /** @private {boolean} */
     this.loaded_ = false;
     /** @private {!Object} */
@@ -90,6 +152,15 @@
     flushIntoLocalStorage(this.type_, this.store_);
   }
 
+  /**
+   * @override
+   */
+  clear(callback) {
+    this.load_();
+    this.store_ = {};
+    flushIntoLocalStorage(this.type_, this.store_);
+  }
+
   load_() {
     if (!this.loaded_) {
       this.store_ = getFromLocalStorage(this.type_);
@@ -99,12 +170,12 @@
 }
 
 /**
- * @type {!StorageArea}
+ * @type {!StorageAreaAsync}
  */
 storage.sync;
 
 /**
- * @type {!StorageArea}
+ * @type {!StorageAreaAsync}
  */
 storage.local;
 
@@ -112,8 +183,8 @@
   storage.sync = new StorageAreaSWAImpl('sync');
   storage.local = new StorageAreaSWAImpl('local');
 } else if (chrome && chrome.storage) {
-  storage.sync = chrome.storage.sync;
-  storage.local = chrome.storage.local;
+  storage.sync = new StorageAreaAsync(chrome.storage.sync);
+  storage.local = new StorageAreaAsync(chrome.storage.local);
 } else {
   console.warn('Creating sync and local stubs for tests');
   storage.sync = new StorageAreaSWAImpl('test-sync');
diff --git a/ui/file_manager/file_manager/foreground/js/banner_controller.js b/ui/file_manager/file_manager/foreground/js/banner_controller.js
index 540387fe..5f29452 100644
--- a/ui/file_manager/file_manager/foreground/js/banner_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/banner_controller.js
@@ -86,27 +86,19 @@
     }
 
     const cacheKeys = Object.keys(this.localStorageCache_);
-
-    // TODO(crbug.com/1233372): Update xfm.storage.local.get method to async
-    // friendly syntax once implemented.
-    return new Promise((resolve, reject) => {
-      xfm.storage.local.get(cacheKeys, values => {
-        if (chrome.runtime.lastError) {
-          reject(
-              'Failed to load banner data from storage: ' +
-              chrome.runtime.lastError.message);
-          return;
-        }
-        for (const key of cacheKeys) {
-          const storedValue = parseInt(values[key], 10);
-          if (storedValue) {
-            this.localStorageCache_[key] = storedValue;
-          }
-        }
-        this.reconcile();
-        resolve();
-      });
-    });
+    let values = {};
+    try {
+      values = await xfm.storage.local.getAsync(cacheKeys);
+    } catch (e) {
+      console.warn(e.message);
+    }
+    for (const key of cacheKeys) {
+      const storedValue = parseInt(values[key], 10);
+      if (storedValue) {
+        this.localStorageCache_[key] = storedValue;
+      }
+    }
+    this.reconcile();
   }
 
   /**
@@ -208,7 +200,6 @@
     }
   }
 
-
   /**
    * Listens for localStorage changes to ensure instance cache is in sync.
    * @param {!Object<string, !StorageChange>} changes Changes that occurred.
diff --git a/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.m.js b/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.m.js
index 65488e55..70394ae 100644
--- a/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.m.js
+++ b/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.m.js
@@ -6,6 +6,7 @@
 
 import {MockChromeStorageAPI} from '../../common/js/mock_chrome.js';
 import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js';
+import {xfm} from '../../common/js/xfm.js';
 import {Banner} from '../../externs/banner.js';
 import {VolumeInfo} from '../../externs/volume_info.js';
 
@@ -167,6 +168,7 @@
   assertEquals(bannerContainer.childElementCount, 0);
 
   new MockChromeStorageAPI();
+  xfm.storage.local.clear();
   directoryModel = createFakeDirectoryModel();
   controller = new BannerController(directoryModel);
 
diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc
index a22b908..a53a78d 100644
--- a/weblayer/browser/content_browser_client_impl.cc
+++ b/weblayer/browser/content_browser_client_impl.cc
@@ -906,6 +906,13 @@
         render_frame_host);
     return true;
   }
+  if (interface_name == page_load_metrics::mojom::PageLoadMetrics::Name_) {
+    page_load_metrics::MetricsWebContentsObserver::BindPageLoadMetrics(
+        mojo::PendingAssociatedReceiver<
+            page_load_metrics::mojom::PageLoadMetrics>(std::move(*handle)),
+        render_frame_host);
+    return true;
+  }
   if (interface_name ==
       security_interstitials::mojom::InterstitialCommands::Name_) {
     security_interstitials::SecurityInterstitialTabHelper::