diff --git a/DEPS b/DEPS
index 902630cd..5c114093 100644
--- a/DEPS
+++ b/DEPS
@@ -181,11 +181,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '1d457b7d9533d229dc1d22d0768878f0e468bf36',
+  'skia_revision': 'f5bc8fba95737140784435f5f6e22aaa0ce0340b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '1c30f07c92a6ad9849ce0da9d8e8602827314ab4',
+  'v8_revision': 'b6f9b1b907ddcae6b920e1b1ee3701ad76715f3f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -193,11 +193,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'c431d59626e1e878022703f79585fddae8c0cfe7',
+  'angle_revision': '1c40e03a42159c54b6be655eabac7fb39f2aaef6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '77c89ff847b623b76f8b559562dc4b8f767a621f',
+  'swiftshader_revision': '73bcece48b0c7dd52b8577c982284974a1f9a7a9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -244,7 +244,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '52175631d301a98a7c0580343d5e6771fe0f5fb0',
+  'catapult_revision': '85c4a438f6f1a86137b109db6b6283d1f084f2be',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -252,7 +252,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': 'b629ec3917dad4e715ef4db128f7838e3e0fb3ed',
+  'devtools_frontend_revision': '6a46fc9f347cf62a9ddc36aaeed1a1eea1699271',
   # 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.
@@ -690,7 +690,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_build_tools/aapt2',
-              'version': 'by7YdhjwRQYtrv0Q_q_fPsqptrm5ib-SXmiNfgJYp50C',
+              'version': 'TM6ESkOFwhdEwjsIxbY3m6j7BIhg8mpY_X9Pg0nwb1AC',
           },
       ],
       'condition': 'checkout_android',
@@ -894,7 +894,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'cdae7443f8cf261d8b078d5294ce89c841598172',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'e831a312c4ab87704a1139852c276797c47f7e4a',
       'condition': 'checkout_linux',
   },
 
@@ -1297,7 +1297,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9553930c2093fd36cd79e2756294cec2e55bd624',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '0e2896bef11409b1a02ad0ca4601da00230733f0',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1498,7 +1498,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '88d715c9115a5ce65c0bf660209dfeee9131ccd0',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '293d46c31c84ba4e8841b0ec3ed0156ec499e353',
+    Var('webrtc_git') + '/src.git' + '@' + '26e1b7ac01757895a6edf198362a4405c7edc79e',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1568,7 +1568,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@72cd27a2044107c376e5f85a2cbd22c986d6cb5e',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4d4d40b08d201865b6a02e74a97d6b6284239dac',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java b/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java
index c460b31..b8d77d3b 100644
--- a/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java
+++ b/base/android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java
@@ -56,6 +56,15 @@
     // Delay between the call to freeConnection and the connection actually beeing freed.
     private static final long FREE_CONNECTION_DELAY_MILLIS = 1;
 
+    // Max number of connections allocated for variable allocator.
+    private static final int MAX_VARIABLE_ALLOCATED = 100;
+
+    // Runnable which will be called when allocator wants to allocate a new connection, but does
+    // not have any more free slots. May be null.
+    private final Runnable mFreeSlotCallback;
+
+    private final Queue<Runnable> mPendingAllocations = new ArrayDeque<>();
+
     // The handler of the thread on which all interations should happen.
     private final Handler mLauncherHandler;
 
@@ -112,11 +121,13 @@
     }
 
     public static ChildConnectionAllocator createVariableSize(Context context,
-            Handler launcherHandler, String packageName, String serviceClassName,
-            boolean bindToCaller, boolean bindAsExternalService, boolean useStrongBinding) {
+            Handler launcherHandler, Runnable freeSlotCallback, String packageName,
+            String serviceClassName, boolean bindToCaller, boolean bindAsExternalService,
+            boolean useStrongBinding) {
         checkServiceExists(context, packageName, serviceClassName);
-        return new VariableSizeAllocatorImpl(launcherHandler, packageName, serviceClassName,
-                bindToCaller, bindAsExternalService, useStrongBinding);
+        return new VariableSizeAllocatorImpl(launcherHandler, freeSlotCallback, packageName,
+                serviceClassName, bindToCaller, bindAsExternalService, useStrongBinding,
+                MAX_VARIABLE_ALLOCATED);
     }
 
     /**
@@ -134,17 +145,20 @@
 
     @VisibleForTesting
     public static VariableSizeAllocatorImpl createVariableSizeForTesting(Handler launcherHandler,
-            String packageName, String serviceClassName, boolean bindToCaller,
-            boolean bindAsExternalService, boolean useStrongBinding) {
-        return new VariableSizeAllocatorImpl(launcherHandler, packageName, serviceClassName + "0",
-                bindToCaller, bindAsExternalService, useStrongBinding);
+            String packageName, Runnable freeSlotCallback, String serviceClassName,
+            boolean bindToCaller, boolean bindAsExternalService, boolean useStrongBinding,
+            int maxAllocated) {
+        return new VariableSizeAllocatorImpl(launcherHandler, freeSlotCallback, packageName,
+                serviceClassName + "0", bindToCaller, bindAsExternalService, useStrongBinding,
+                maxAllocated);
     }
 
-    private ChildConnectionAllocator(Handler launcherHandler, String packageName,
-            String serviceClassName, boolean bindToCaller, boolean bindAsExternalService,
-            boolean useStrongBinding) {
+    private ChildConnectionAllocator(Handler launcherHandler, Runnable freeSlotCallback,
+            String packageName, String serviceClassName, boolean bindToCaller,
+            boolean bindAsExternalService, boolean useStrongBinding) {
         mLauncherHandler = launcherHandler;
         assert isRunningOnLauncherThread();
+        mFreeSlotCallback = freeSlotCallback;
         mPackageName = packageName;
         mServiceClassName = serviceClassName;
         mBindToCaller = bindToCaller;
@@ -232,15 +246,19 @@
     private void free(ChildProcessConnection connection) {
         assert isRunningOnLauncherThread();
         doFree(connection);
+
+        if (mPendingAllocations.isEmpty()) return;
+        mPendingAllocations.remove().run();
+        if (!mPendingAllocations.isEmpty() && mFreeSlotCallback != null) {
+            mFreeSlotCallback.run();
+        }
     }
 
-    // Can only be called once all slots are full, ie when allocate returns null. Note
-    // this should not be called in if created with createVariableSize.
-    // The callback will be called when a slot becomes free, and should synchronous call
-    // allocate to take the slot.
-    public void queueAllocation(Runnable runnable) {
+    public final void queueAllocation(Runnable runnable) {
         assert isRunningOnLauncherThread();
-        doQueueAllocation(runnable);
+        boolean wasEmpty = mPendingAllocations.isEmpty();
+        mPendingAllocations.add(runnable);
+        if (wasEmpty && mFreeSlotCallback != null) mFreeSlotCallback.run();
     }
 
     /** May return -1 if size is not fixed. */
@@ -264,30 +282,22 @@
 
     /* package */ abstract ChildProcessConnection doAllocate(Context context, Bundle serviceBundle);
     /* package */ abstract void doFree(ChildProcessConnection connection);
-    /* package */ abstract void doQueueAllocation(Runnable runnable);
 
     /** Implementation class accessed directly by tests. */
     @VisibleForTesting
     public static class FixedSizeAllocatorImpl extends ChildConnectionAllocator {
-        // Runnable which will be called when allocator wants to allocate a new connection, but does
-        // not have any more free slots. May be null.
-        private final Runnable mFreeSlotCallback;
-
         // Connections to services. Indices of the array correspond to the service numbers.
         private final ChildProcessConnection[] mChildProcessConnections;
 
         // The list of free (not bound) service indices.
         private final ArrayList<Integer> mFreeConnectionIndices;
 
-        private final Queue<Runnable> mPendingAllocations = new ArrayDeque<>();
-
         private FixedSizeAllocatorImpl(Handler launcherHandler, Runnable freeSlotCallback,
                 String packageName, String serviceClassName, boolean bindToCaller,
                 boolean bindAsExternalService, boolean useStrongBinding, int numChildServices) {
-            super(launcherHandler, packageName, serviceClassName, bindToCaller,
+            super(launcherHandler, freeSlotCallback, packageName, serviceClassName, bindToCaller,
                     bindAsExternalService, useStrongBinding);
 
-            mFreeSlotCallback = freeSlotCallback;
             mChildProcessConnections = new ChildProcessConnection[numChildServices];
 
             mFreeConnectionIndices = new ArrayList<Integer>(numChildServices);
@@ -330,21 +340,11 @@
                 Log.d(TAG, "Allocator freed a connection, name: %s, slot: %d", mServiceClassName,
                         slot);
             }
-
-            if (mPendingAllocations.isEmpty()) return;
-            mPendingAllocations.remove().run();
-            assert mFreeConnectionIndices.isEmpty();
-            if (!mPendingAllocations.isEmpty() && mFreeSlotCallback != null) {
-                mFreeSlotCallback.run();
-            }
         }
 
-        @Override
-        /* package */ void doQueueAllocation(Runnable runnable) {
-            assert mFreeConnectionIndices.isEmpty();
-            boolean wasEmpty = mPendingAllocations.isEmpty();
-            mPendingAllocations.add(runnable);
-            if (wasEmpty && mFreeSlotCallback != null) mFreeSlotCallback.run();
+        @VisibleForTesting
+        public boolean isFreeConnectionAvailable() {
+            return !mFreeConnectionIndices.isEmpty();
         }
 
         @Override
@@ -362,11 +362,6 @@
             return mChildProcessConnections[slotNumber];
         }
 
-        @VisibleForTesting
-        public boolean isFreeConnectionAvailable() {
-            return !mFreeConnectionIndices.isEmpty();
-        }
-
         @Override
         public boolean anyConnectionAllocated() {
             return mFreeConnectionIndices.size() < mChildProcessConnections.length;
@@ -375,6 +370,7 @@
 
     @VisibleForTesting
     /* package */ static class VariableSizeAllocatorImpl extends ChildConnectionAllocator {
+        private final int mMaxAllocated;
         private final ArraySet<ChildProcessConnection> mAllocatedConnections = new ArraySet<>();
         private int mNextInstance;
 
@@ -394,15 +390,22 @@
             return "0";
         }
 
-        private VariableSizeAllocatorImpl(Handler launcherHandler, String packageName,
-                String serviceClassName, boolean bindToCaller, boolean bindAsExternalService,
-                boolean useStrongBinding) {
-            super(launcherHandler, packageName, serviceClassName + getServiceSuffix(), bindToCaller,
-                    bindAsExternalService, useStrongBinding);
+        private VariableSizeAllocatorImpl(Handler launcherHandler, Runnable freeSlotCallback,
+                String packageName, String serviceClassName, boolean bindToCaller,
+                boolean bindAsExternalService, boolean useStrongBinding, int maxAllocated) {
+            super(launcherHandler, freeSlotCallback, packageName,
+                    serviceClassName + getServiceSuffix(), bindToCaller, bindAsExternalService,
+                    useStrongBinding);
+            assert maxAllocated > 0;
+            mMaxAllocated = maxAllocated;
         }
 
         @Override
         /* package */ ChildProcessConnection doAllocate(Context context, Bundle serviceBundle) {
+            if (mAllocatedConnections.size() >= mMaxAllocated) {
+                Log.d(TAG, "Ran out of UIDs to allocate.");
+                return null;
+            }
             ComponentName serviceName = new ComponentName(mPackageName, mServiceClassName);
             String instanceName = Integer.toString(mNextInstance);
             mNextInstance++;
@@ -420,11 +423,6 @@
         }
 
         @Override
-        /* package */ void doQueueAllocation(Runnable runnable) {
-            assert false;
-        }
-
-        @Override
         public int getNumberOfServices() {
             return -1;
         }
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
index 64a31a22..599fd0e 100644
--- a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
+++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
@@ -149,8 +149,9 @@
         mAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
 
         mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting(
-                new Handler(), TEST_PACKAGE_NAME, "AllocatorTest", true /* bindTocall */,
-                false /* bindAsExternalService */, false /* useStrongBinding */);
+                new Handler(), TEST_PACKAGE_NAME, null /* freeSlotCallback */, "AllocatorTest",
+                true /* bindTocall */, false /* bindAsExternalService */,
+                false /* useStrongBinding */, 10);
         mVariableSizeAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
     }
 
@@ -196,24 +197,40 @@
         mAllocator = ChildConnectionAllocator.createFixedForTesting(freeConnectionCallback,
                 TEST_PACKAGE_NAME, "AllocatorTest", 1, true /* bindToCaller */,
                 false /* bindAsExternalService */, false /* useStrongBinding */);
-        mAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+        doTestQueueAllocation(mAllocator, freeConnectionCallback);
+    }
+
+    @Test
+    @Feature({"ProcessManagement"})
+    public void testQueueAllocationVariableSize() {
+        Runnable freeConnectionCallback = mock(Runnable.class);
+        mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting(
+                new Handler(), TEST_PACKAGE_NAME, freeConnectionCallback, "AllocatorTest",
+                true /* bindToCaller */, false /* bindAsExternalService */,
+                false /* useStrongBinding */, 1);
+        doTestQueueAllocation(mVariableSizeAllocator, freeConnectionCallback);
+    }
+
+    private void doTestQueueAllocation(
+            ChildConnectionAllocator allocator, Runnable freeConnectionCallback) {
+        allocator.setConnectionFactoryForTesting(mTestConnectionFactory);
         // Occupy all slots.
         ChildProcessConnection connection =
-                mAllocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+                allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
         assertNotNull(connection);
-        assertFalse(mAllocator.isFreeConnectionAvailable());
+        assertEquals(1, allocator.allocatedConnectionsCountForTesting());
 
         final ChildProcessConnection newConnection[] = new ChildProcessConnection[2];
         Runnable allocate1 = () -> {
-            newConnection[0] = mAllocator.allocate(
+            newConnection[0] = allocator.allocate(
                     null /* context */, null /* serviceBundle */, mServiceCallback);
         };
         Runnable allocate2 = () -> {
-            newConnection[1] = mAllocator.allocate(
+            newConnection[1] = allocator.allocate(
                     null /* context */, null /* serviceBundle */, mServiceCallback);
         };
-        mAllocator.queueAllocation(allocate1);
-        mAllocator.queueAllocation(allocate2);
+        allocator.queueAllocation(allocate1);
+        allocator.queueAllocation(allocate2);
         verify(freeConnectionCallback, times(1)).run();
         assertNull(newConnection[0]);
 
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index 2d4b96d..c1ddee3 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -844,13 +844,13 @@
         config.write('{}#no_obfuscate\n'.format(resource))
 
     optimize_command += [
-        '--enable-resource-obfuscation',
+        '--collapse-resource-names',
         '--resources-config-path',
         gen_config_path,
     ]
 
   if options.short_resource_paths:
-    optimize_command += ['--enable-resource-path-shortening']
+    optimize_command += ['--shorten-resource-paths']
   if options.resources_path_map_out_path:
     optimize_command += [
         '--resource-path-shortening-map', options.resources_path_map_out_path
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 1b0218d..e9c3fe57 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8891801759347717888
\ No newline at end of file
+8891760011566027456
\ No newline at end of file
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 3d1102aa..9fee4fd1 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -224,6 +224,7 @@
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabBarControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCaptionControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java",
+  "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabSheetContent.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabTitleControl.java",
@@ -1393,7 +1394,6 @@
   "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java",
   "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfileFragment.java",
   "java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java",
-  "java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java",
   "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java",
   "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java",
   "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 5e16b9ed..d575736 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -411,7 +411,6 @@
   "javatests/src/org/chromium/chrome/browser/settings/accessibility/AccessibilitySettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java",
-  "javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/developer/TracingSettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/notifications/NotificationsSettingsTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
index 2990301b..c85512841 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
@@ -16,7 +16,7 @@
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipViewHolder;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
-import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
@@ -142,7 +142,7 @@
             int itemId = item.getItemId();
             if (itemId == R.id.settings) {
                 SettingsLauncher.launchSettingsPage(
-                        view.mHeader.getContext(), AutofillAssistantSettings.class);
+                        view.mHeader.getContext(), SyncAndServicesPreferences.class);
                 return true;
             } else if (itemId == R.id.send_feedback) {
                 if (feedbackCallback != null) {
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
index c529ed8..dbfd567a 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
@@ -7,9 +7,10 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 
 /** Autofill Assistant related preferences util class. */
+@SuppressWarnings("UseSharedPreferencesManagerFromChromeCheck")
 class AutofillAssistantPreferencesUtil {
     // Avoid instatiation by accident.
     private AutofillAssistantPreferencesUtil() {}
@@ -26,7 +27,7 @@
     /** Checks whether the Autofill Assistant switch preference in settings is on. */
     static boolean isAutofillAssistantSwitchOn() {
         return ContextUtils.getAppSharedPreferences().getBoolean(
-                AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, true);
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, true);
     }
 
     /** Checks whether the Autofill Assistant onboarding has been accepted. */
@@ -53,7 +54,7 @@
     static void setInitialPreferences(boolean accept) {
         ContextUtils.getAppSharedPreferences()
                 .edit()
-                .putBoolean(AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, accept)
+                .putBoolean(ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, accept)
                 .apply();
         ContextUtils.getAppSharedPreferences()
                 .edit()
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
index 5ab37eb..d9e55c1 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -45,70 +45,65 @@
         android:key="autofill_addresses"
         android:order="7"
         android:title="@string/autofill_addresses_settings_title"/>
-    <org.chromium.chrome.browser.settings.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings"
-        android:key="autofill_assistant"
-        android:order="8"
-        android:title="@string/prefs_autofill_assistant_title"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.notifications.NotificationsSettings"
         android:key="notifications"
-        android:order="9"
+        android:order="8"
         android:title="@string/prefs_notifications"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.homepage.HomepageSettings"
         android:key="homepage"
-        android:order="10"
+        android:order="9"
         android:title="@string/options_homepage_title"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.themes.ThemeSettingsFragment"
         android:key="ui_theme"
-        android:order="11"
+        android:order="10"
         android:title="@string/theme_settings" />
 
     <PreferenceCategory
         android:key="advanced_section"
-        android:order="12"
+        android:order="11"
         android:title="@string/prefs_section_advanced"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.privacy.PrivacySettings"
         android:key="privacy"
-        android:order="13"
+        android:order="12"
         android:title="@string/prefs_privacy"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.accessibility.AccessibilitySettings"
         android:key="accessibility"
-        android:order="14"
+        android:order="13"
         android:title="@string/prefs_accessibility"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.website.SiteSettings"
         android:key="content_settings"
-        android:order="15"
+        android:order="14"
         android:title="@string/prefs_site_settings"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.languages.LanguageSettings"
         android:key="languages"
-        android:order="16"
+        android:order="15"
         android:title="@string/language_settings"/>
     <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment"
         android:key="data_reduction"
-        android:order="17"
+        android:order="16"
         android:title="@string/data_reduction_title_lite_mode"/>
     <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.settings.download.DownloadSettings"
         android:key="downloads"
-        android:order="18"
+        android:order="17"
         android:title="@string/menu_downloads"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.developer.DeveloperSettings"
         android:key="developer"
-        android:order="19"
+        android:order="18"
         android:title="Developer options"/>
     <Preference
         android:fragment="org.chromium.chrome.browser.settings.about.AboutChromeSettings"
         android:key="about_chrome"
-        android:order="20"
+        android:order="19"
         android:title="@string/prefs_about_chrome"/>
 
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/sync_and_services_preferences.xml b/chrome/android/java/res/xml/sync_and_services_preferences.xml
index c082183..7c5a7c4 100644
--- a/chrome/android/java/res/xml/sync_and_services_preferences.xml
+++ b/chrome/android/java/res/xml/sync_and_services_preferences.xml
@@ -79,6 +79,11 @@
             android:title="@string/url_keyed_anonymized_data_title"
             android:summary="@string/url_keyed_anonymized_data_summary"
             android:persistent="false"/>
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
+            android:key="autofill_assistant"
+            android:title="@string/prefs_autofill_assistant_title"
+            android:summary="@string/prefs_autofill_assistant_summary"
+            android:persistent="false"/>
         <org.chromium.chrome.browser.settings.ChromeBasePreference
             android:key="contextual_search"
             android:title="@string/contextual_search_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 603cad0..54adc1c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -672,10 +672,16 @@
                 }
             };
             OnClickListener newTabClickHandler = v -> {
-                getTabModelSelector().getModel(false).commitAllTabClosures();
-                // This assumes that the keyboard can not be seen at the same time as the
-                // newtab button on the toolbar.
-                getCurrentTabCreator().launchNTP();
+                // If Start Surface should be shown as the home page, show the start surface home
+                // page.
+                if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
+                    showOverview(OverviewModeState.SHOWING_HOMEPAGE);
+                } else {
+                    getTabModelSelector().getModel(false).commitAllTabClosures();
+                    // This assumes that the keyboard can not be seen at the same time as the
+                    // newtab button on the toolbar.
+                    getCurrentTabCreator().launchNTP();
+                }
                 mLocaleManager.showSearchEnginePromoIfNeeded(ChromeTabbedActivity.this, null);
                 if (getTabModelSelector().isIncognitoSelected()) {
                     RecordUserAction.record("MobileToolbarStackViewNewIncognitoTab");
@@ -1686,7 +1692,14 @@
             RecordUserAction.record("MobileNewTabOpened");
             reportNewTabShortcutUsed(false);
             if (fromMenu) RecordUserAction.record("MobileMenuNewTab.AppMenu");
-            getTabCreator(false).launchNTP();
+
+            // If Start Surface should be shown as the home page, show the start surface home page.
+            if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
+                getTabModelSelector().selectModel(false);
+                showOverview(OverviewModeState.SHOWING_HOMEPAGE);
+            } else {
+                getTabCreator(false).launchNTP();
+            }
 
             mLocaleManager.showSearchEnginePromoIfNeeded(this, null);
         } else if (id == R.id.new_incognito_tab_menu_id) {
@@ -1698,7 +1711,15 @@
                 RecordUserAction.record("MobileNewTabOpened");
                 reportNewTabShortcutUsed(true);
                 if (fromMenu) RecordUserAction.record("MobileMenuNewIncognitoTab.AppMenu");
-                getTabCreator(true).launchNTP();
+
+                // If Start Surface should be shown as the home page, show the start surface home
+                // page.
+                if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
+                    getTabModelSelector().selectModel(true);
+                    showOverview(OverviewModeState.SHOWING_HOMEPAGE);
+                } else {
+                    getTabCreator(true).launchNTP();
+                }
             }
         } else if (id == R.id.all_bookmarks_menu_id) {
             // Note that 'currentTab' could be null in overview mode when start surface is
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
index c907e91f..5b9fc4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
@@ -49,6 +49,7 @@
     private final ChromeActivity mActivity;
     private final BottomSheetController mBottomSheetController;
     private final FaviconLoader mFaviconLoader;
+    private final EphemeralTabMetrics mMetrics = new EphemeralTabMetrics();
     private OverlayPanelContent mPanelContent;
     private WebContentsObserver mWebContentsObserver;
     private EphemeralTabSheetContent mSheetContent;
@@ -67,6 +68,8 @@
         mBottomSheetController = bottomSheetController;
         mFaviconLoader = new FaviconLoader(mActivity);
         mBottomSheetController.addObserver(new EmptyBottomSheetObserver() {
+            private int mCloseReason;
+
             @Override
             public void onSheetContentChanged(BottomSheetContent newContent) {
                 if (newContent != mSheetContent) destroyContent();
@@ -76,6 +79,28 @@
             public void onSheetStateChanged(int newState) {
                 if (mSheetContent == null) return;
                 mSheetContent.showOpenInNewTabButton(newState == SheetState.FULL);
+                switch (newState) {
+                    case SheetState.PEEK:
+                        mMetrics.recordMetricsForPeeked();
+                        break;
+                    case SheetState.FULL:
+                        mMetrics.recordMetricsForOpened();
+                        break;
+                }
+            }
+
+            @Override
+            public void onSheetClosed(int reason) {
+                // "Closed" actually means "Peek" for bottom sheet. Save the reason to log
+                // when the sheet goes to hidden state.
+                mCloseReason = reason;
+            }
+
+            @Override
+            public void onSheetOffsetChanged(float heightFraction, float offsetPx) {
+                if (heightFraction == 0.0f) {
+                    mMetrics.recordMetricsForClosed(mCloseReason);
+                }
             }
         });
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java
new file mode 100644
index 0000000..cdf514b2
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java
@@ -0,0 +1,89 @@
+// Copyright 2020 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.compositor.bottombar.ephemeraltab;
+
+import org.chromium.base.TimeUtils;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController.StateChangeReason;
+
+/**
+ * Metrics util class for ephemeral tab.
+ */
+public class EphemeralTabMetrics {
+    /** Remembers whether the panel was opened to the peeking state. */
+    private boolean mDidRecordFirstPeek;
+
+    /** The timestamp when the panel entered the peeking state for the first time. */
+    private long mPanelPeekedNanoseconds;
+
+    /** Remembers whether the panel was opened beyond the peeking state. */
+    private boolean mDidRecordFirstOpen;
+
+    /** The timestamp when the panel entered the opened state for the first time. */
+    private long mPanelOpenedNanoseconds;
+
+    /** Records metrics for the peeked panel state. */
+    public void recordMetricsForPeeked() {
+        startPeekTimer();
+        // Could be returning to Peek from Open.
+        finishOpenTimer();
+    }
+
+    /** Records metrics when the panel has been fully opened. */
+    public void recordMetricsForOpened() {
+        startOpenTimer();
+        finishPeekTimer();
+    }
+
+    /** Records metrics when the panel has been closed. */
+    public void recordMetricsForClosed(@StateChangeReason int stateChangeReason) {
+        finishPeekTimer();
+        finishOpenTimer();
+        RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen);
+        RecordHistogram.recordEnumeratedHistogram("EphemeralTab.BottomSheet.CloseReason",
+                stateChangeReason, StateChangeReason.MAX_VALUE + 1);
+        resetTimers();
+    }
+
+    /** Resets the metrics used by the timers. */
+    private void resetTimers() {
+        mDidRecordFirstPeek = false;
+        mPanelPeekedNanoseconds = 0;
+        mDidRecordFirstOpen = false;
+        mPanelOpenedNanoseconds = 0;
+    }
+
+    /** Starts timing the peek state if it's not already been started. */
+    private void startPeekTimer() {
+        if (mPanelPeekedNanoseconds == 0) mPanelPeekedNanoseconds = System.nanoTime();
+    }
+
+    /** Finishes timing metrics for the first peek state, unless that has already been done. */
+    private void finishPeekTimer() {
+        if (!mDidRecordFirstPeek && mPanelPeekedNanoseconds != 0) {
+            mDidRecordFirstPeek = true;
+            long durationPeeking = (System.nanoTime() - mPanelPeekedNanoseconds)
+                    / TimeUtils.NANOSECONDS_PER_MILLISECOND;
+            RecordHistogram.recordMediumTimesHistogram(
+                    "EphemeralTab.DurationPeeked", durationPeeking);
+        }
+    }
+
+    /** Starts timing the open state if it's not already been started. */
+    private void startOpenTimer() {
+        if (mPanelOpenedNanoseconds == 0) mPanelOpenedNanoseconds = System.nanoTime();
+    }
+
+    /** Finishes timing metrics for the first open state, unless that has already been done. */
+    private void finishOpenTimer() {
+        if (!mDidRecordFirstOpen && mPanelOpenedNanoseconds != 0) {
+            mDidRecordFirstOpen = true;
+            long durationOpened = (System.nanoTime() - mPanelOpenedNanoseconds)
+                    / TimeUtils.NANOSECONDS_PER_MILLISECOND;
+            RecordHistogram.recordMediumTimesHistogram(
+                    "EphemeralTab.DurationOpened", durationOpened);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java
index 4c7490cc..bd92e50 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabPanel.java
@@ -10,8 +10,6 @@
 import android.view.MotionEvent;
 
 import org.chromium.base.SysUtils;
-import org.chromium.base.TimeUtils;
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
@@ -50,18 +48,6 @@
     /** The compositor layer used for drawing the panel. */
     private EphemeralTabSceneLayer mSceneLayer;
 
-    /** Remembers whether the panel was opened to the peeking state. */
-    private boolean mDidRecordFirstPeek;
-
-    /** The timestamp when the panel entered the peeking state for the first time. */
-    private long mPanelPeekedNanoseconds;
-
-    /** Remembers whether the panel was opened beyond the peeking state. */
-    private boolean mDidRecordFirstOpen;
-
-    /** The timestamp when the panel entered the opened state for the first time. */
-    private long mPanelOpenedNanoseconds;
-
     /** True if the Tab from which the panel is opened is in incognito mode. */
     private boolean mIsIncognito;
 
@@ -248,18 +234,6 @@
         return 1.0f;
     }
 
-    @Override
-    public void setPanelState(@PanelState int toState, @StateChangeReason int reason) {
-        super.setPanelState(toState, reason);
-        if (toState == PanelState.PEEKED) {
-            recordMetricsForPeeked();
-        } else if (toState == PanelState.CLOSED) {
-            recordMetricsForClosed(reason);
-        } else if (toState == PanelState.EXPANDED || toState == PanelState.MAXIMIZED) {
-            recordMetricsForOpened();
-        }
-    }
-
     // Scene Overlay
 
     @Override
@@ -451,70 +425,4 @@
             mEphemeralTabBarControl = null;
         }
     }
-
-    //--------
-    // METRICS
-    //--------
-    /** Records metrics for the peeked panel state. */
-    private void recordMetricsForPeeked() {
-        startPeekTimer();
-        // Could be returning to Peek from Open.
-        finishOpenTimer();
-    }
-
-    /** Records metrics when the panel has been fully opened. */
-    private void recordMetricsForOpened() {
-        startOpenTimer();
-        finishPeekTimer();
-    }
-
-    /** Records metrics when the panel has been closed. */
-    private void recordMetricsForClosed(@StateChangeReason int stateChangeReason) {
-        finishPeekTimer();
-        finishOpenTimer();
-        RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen);
-        RecordHistogram.recordEnumeratedHistogram(
-                "EphemeralTab.CloseReason", stateChangeReason, StateChangeReason.MAX_VALUE + 1);
-        resetTimers();
-    }
-
-    /** Resets the metrics used by the timers. */
-    private void resetTimers() {
-        mDidRecordFirstPeek = false;
-        mPanelPeekedNanoseconds = 0;
-        mDidRecordFirstOpen = false;
-        mPanelOpenedNanoseconds = 0;
-    }
-
-    /** Starts timing the peek state if it's not already been started. */
-    private void startPeekTimer() {
-        if (mPanelPeekedNanoseconds == 0) mPanelPeekedNanoseconds = System.nanoTime();
-    }
-
-    /** Finishes timing metrics for the first peek state, unless that has already been done. */
-    private void finishPeekTimer() {
-        if (!mDidRecordFirstPeek && mPanelPeekedNanoseconds != 0) {
-            mDidRecordFirstPeek = true;
-            long durationPeeking = (System.nanoTime() - mPanelPeekedNanoseconds)
-                    / TimeUtils.NANOSECONDS_PER_MILLISECOND;
-            RecordHistogram.recordMediumTimesHistogram(
-                    "EphemeralTab.DurationPeeked", durationPeeking);
-        }
-    }
-
-    /** Starts timing the open state if it's not already been started. */
-    private void startOpenTimer() {
-        if (mPanelOpenedNanoseconds == 0) mPanelOpenedNanoseconds = System.nanoTime();
-    }
-
-    /** Finishes timing metrics for the first open state, unless that has already been done. */
-    private void finishOpenTimer() {
-        if (!mDidRecordFirstOpen && mPanelOpenedNanoseconds != 0) {
-            mDidRecordFirstOpen = true;
-            long durationOpened = (System.nanoTime() - mPanelOpenedNanoseconds)
-                    / TimeUtils.NANOSECONDS_PER_MILLISECOND;
-            RecordHistogram.recordMediumTimesHistogram(
-                    "EphemeralTab.DurationOpened", durationOpened);
-        }
-    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
index 731f98f..45de2bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
@@ -26,7 +26,6 @@
 import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
 import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
-import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantSettings;
 import org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment;
 import org.chromium.chrome.browser.settings.developer.DeveloperSettings;
 import org.chromium.chrome.browser.settings.sync.SignInPreference;
@@ -58,7 +57,6 @@
     public static final String PREF_LANGUAGES = "languages";
     public static final String PREF_DOWNLOADS = "downloads";
     public static final String PREF_DEVELOPER = "developer";
-    public static final String PREF_AUTOFILL_ASSISTANT = "autofill_assistant";
 
     public static final String AUTOFILL_GUID = "guid";
     // Needs to be in sync with kSettingsOrigin[] in
@@ -170,14 +168,6 @@
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE)) {
             getPreferenceScreen().removePreference(findPreference(PREF_DOWNLOADS));
         }
-
-        // This checks whether Autofill Assistant is enabled and was shown at least once (only then
-        // will the AA switch be assigned a value).
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT)
-                || !ContextUtils.getAppSharedPreferences().contains(
-                        AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH)) {
-            getPreferenceScreen().removePreference(findPreference(PREF_AUTOFILL_ASSISTANT));
-        }
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java
deleted file mode 100644
index 42300e38..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettings.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.settings.autofill_assistant;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v7.preference.PreferenceFragmentCompat;
-import android.support.v7.preference.PreferenceScreen;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
-
-/** The "Autofill Assistant" Settings screen. */
-public class AutofillAssistantSettings extends PreferenceFragmentCompat {
-    /** Autofill Assistant switch preference key name. */
-    public static final String PREF_AUTOFILL_ASSISTANT_SWITCH = "autofill_assistant_switch";
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        getActivity().setTitle(R.string.prefs_autofill_assistant_title);
-
-        PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getStyledContext());
-        setPreferenceScreen(screen);
-        createAutofillAssistantSwitch();
-    }
-
-    private void createAutofillAssistantSwitch() {
-        ChromeSwitchPreference autofillAssistantSwitch =
-                new ChromeSwitchPreference(getStyledContext(), null);
-        autofillAssistantSwitch.setKey(PREF_AUTOFILL_ASSISTANT_SWITCH);
-        autofillAssistantSwitch.setTitle(R.string.prefs_autofill_assistant_switch);
-        autofillAssistantSwitch.setSummaryOn(R.string.text_on);
-        autofillAssistantSwitch.setSummaryOff(R.string.text_off);
-        autofillAssistantSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
-            ContextUtils.getAppSharedPreferences()
-                    .edit()
-                    .putBoolean(PREF_AUTOFILL_ASSISTANT_SWITCH, (boolean) newValue)
-                    .apply();
-            return true;
-        });
-        getPreferenceScreen().addPreference(autofillAssistantSwitch);
-
-        // Note: setting the switch state before the preference is added to the screen results in
-        // some odd behavior where the switch state doesn't always match the internal enabled state
-        // (e.g. the switch will say "On" when it is really turned off), so .setChecked() should be
-        // called after .addPreference()
-        autofillAssistantSwitch.setChecked(ContextUtils.getAppSharedPreferences().getBoolean(
-                PREF_AUTOFILL_ASSISTANT_SWITCH, true));
-    }
-
-    private Context getStyledContext() {
-        return getPreferenceManager().getContext();
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
deleted file mode 100644
index 829eb83..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://components/autofill_assistant/OWNERS
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
index 5608e62..286a864 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
@@ -42,8 +42,10 @@
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.safe_browsing.SafeBrowsingBridge;
 import org.chromium.chrome.browser.settings.ChromeBasePreference;
@@ -111,6 +113,8 @@
     private static final String PREF_USAGE_AND_CRASH_REPORTING = "usage_and_crash_reports";
     private static final String PREF_URL_KEYED_ANONYMIZED_DATA = "url_keyed_anonymized_data";
     private static final String PREF_CONTEXTUAL_SEARCH = "contextual_search";
+    @VisibleForTesting
+    public static final String PREF_AUTOFILL_ASSISTANT = "autofill_assistant";
 
     @IntDef({SyncError.NO_ERROR, SyncError.ANDROID_SYNC_DISABLED, SyncError.AUTH_ERROR,
             SyncError.PASSPHRASE_REQUIRED, SyncError.CLIENT_OUT_OF_DATE,
@@ -134,6 +138,8 @@
             PrivacyPreferencesManager.getInstance();
     private final ManagedPreferenceDelegate mManagedPreferenceDelegate =
             createManagedPreferenceDelegate();
+    private final SharedPreferencesManager mSharedPreferencesManager =
+            SharedPreferencesManager.getInstance();
 
     private boolean mIsFromSigninScreen;
 
@@ -153,6 +159,7 @@
     private ChromeSwitchPreference mSafeBrowsingReporting;
     private ChromeSwitchPreference mUsageAndCrashReporting;
     private ChromeSwitchPreference mUrlKeyedAnonymizedData;
+    private @Nullable ChromeSwitchPreference mAutofillAssistant;
     private @Nullable Preference mContextualSearch;
 
     private ProfileSyncService.SyncSetupInProgressHandle mSyncSetupInProgressHandle;
@@ -246,6 +253,15 @@
         mUrlKeyedAnonymizedData.setOnPreferenceChangeListener(this);
         mUrlKeyedAnonymizedData.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
+        mAutofillAssistant = (ChromeSwitchPreference) findPreference(PREF_AUTOFILL_ASSISTANT);
+        if (shouldShowAutofillAssistantPreference()) {
+            mAutofillAssistant.setOnPreferenceChangeListener(this);
+            mAutofillAssistant.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+        } else {
+            removePreference(servicesCategory, mAutofillAssistant);
+            mAutofillAssistant = null;
+        }
+
         mContextualSearch = findPreference(PREF_CONTEXTUAL_SEARCH);
         if (!ContextualSearchFieldTrial.isEnabled()) {
             removePreference(servicesCategory, mContextualSearch);
@@ -383,6 +399,8 @@
         } else if (PREF_URL_KEYED_ANONYMIZED_DATA.equals(key)) {
             UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled(
                     (boolean) newValue);
+        } else if (PREF_AUTOFILL_ASSISTANT.equals(key)) {
+            setAutofillAssistantSwitchValue((boolean) newValue);
         }
         return true;
     }
@@ -610,6 +628,9 @@
         mUrlKeyedAnonymizedData.setChecked(
                 UnifiedConsentServiceBridge.isUrlKeyedAnonymizedDataCollectionEnabled());
 
+        if (mAutofillAssistant != null) {
+            mAutofillAssistant.setChecked(isAutofillAssistantSwitchOn());
+        }
         if (mContextualSearch != null) {
             boolean isContextualSearchEnabled =
                     !ContextualSearchManager.isContextualSearchDisabled();
@@ -783,4 +804,24 @@
             fragment.cancelSync();
         }
     }
+
+    /**
+     *  This checks whether Autofill Assistant is enabled and was shown at least once (only then
+     *  will the AA switch be assigned a value).
+     */
+    private boolean shouldShowAutofillAssistantPreference() {
+        return ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT)
+                && mSharedPreferencesManager.contains(
+                        ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED);
+    }
+
+    public boolean isAutofillAssistantSwitchOn() {
+        return mSharedPreferencesManager.readBoolean(
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, false);
+    }
+
+    public void setAutofillAssistantSwitchValue(boolean newValue) {
+        mSharedPreferencesManager.writeBoolean(
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, newValue);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
index 4accea4..841b12f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
@@ -45,6 +45,16 @@
          */
         @Nullable
         Intent createKeyRetrievalIntent();
+
+        /**
+         * Invoked when the result of fetchKeys() represents keys that cannot decrypt Nigori, which
+         * should only be possible if the provided keys are not up-to-date.
+         *
+         * @param gaiaId String representation of the Gaia ID.
+         * @return a promise which indicates completion and also represents whether the operation
+         * took any effect (false positives acceptable).
+         */
+        Promise<Boolean> markKeysAsStale(String gaiaId);
     }
 
     /**
@@ -60,6 +70,11 @@
         public Intent createKeyRetrievalIntent() {
             return null;
         }
+
+        @Override
+        public Promise<Boolean> markKeysAsStale(String gaiaId) {
+            return Promise.fulfilled(false);
+        }
     };
 
     private static TrustedVaultClient sInstance;
@@ -162,8 +177,35 @@
                 });
     }
 
+    /**
+     * Forwards calls to Backend.markKeysAsStale() and upon completion invokes native method
+     * markKeysAsStaleCompleted().
+     */
+    @CalledByNative
+    private static void markKeysAsStale(long nativeTrustedVaultClientAndroid, String gaiaId) {
+        assert isNativeRegistered(nativeTrustedVaultClientAndroid);
+        get().mBackend.markKeysAsStale(gaiaId).then(
+                (result)
+                        -> {
+                    if (isNativeRegistered(nativeTrustedVaultClientAndroid)) {
+                        TrustedVaultClientJni.get().markKeysAsStaleCompleted(
+                                nativeTrustedVaultClientAndroid, result);
+                    }
+                },
+                (exception) -> {
+                    if (isNativeRegistered(nativeTrustedVaultClientAndroid)) {
+                        // There's no certainty about whether the operation made any difference so
+                        // let's return true indicating that it might have, since false positives
+                        // are allowed.
+                        TrustedVaultClientJni.get().markKeysAsStaleCompleted(
+                                nativeTrustedVaultClientAndroid, true);
+                    }
+                });
+    }
+
     @NativeMethods
     interface Natives {
         void fetchKeysCompleted(long nativeTrustedVaultClientAndroid, String gaiaId, byte[][] keys);
+        void markKeysAsStaleCompleted(long nativeTrustedVaultClientAndroid, boolean result);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
index 2efb2aef..6117aed 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -8,6 +8,7 @@
 import android.view.ViewStub;
 
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
@@ -103,6 +104,14 @@
         mToolbarMediator.onBottomToolbarVisibilityChanged(isVisible);
     }
 
+    /**
+     * @param overviewModeBehavior The {@link OverviewModeBehavior} to observe overview state
+     *         changes.
+     */
+    void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
+        mToolbarMediator.setOverviewModeBehavior(overviewModeBehavior);
+    }
+
     void onNativeLibraryReady() {
         mToolbarMediator.onNativeLibraryReady();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
index ffd03cc9..da33654 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -11,10 +11,15 @@
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.LOGO_IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.MENU_IS_VISIBLE;
+import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER;
 
 import android.view.View;
 
+import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
@@ -32,6 +37,8 @@
     private TabModelSelector mTabModelSelector;
     private TemplateUrlServiceObserver mTemplateUrlObserver;
     private TabModelSelectorObserver mTabModelSelectorObserver;
+    private OverviewModeBehavior mOverviewModeBehavior;
+    private OverviewModeObserver mOverviewModeObserver;
 
     StartSurfaceToolbarMediator(PropertyModel model) {
         mPropertyModel = model;
@@ -61,6 +68,9 @@
         if (mTabModelSelectorObserver != null) {
             mTabModelSelector.removeObserver(mTabModelSelectorObserver);
         }
+        if (mOverviewModeObserver != null) {
+            mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
+        }
     }
 
     void setAppMenuButtonHelper(AppMenuButtonHelper appMenuButtonHelper) {
@@ -105,4 +115,23 @@
     void onBottomToolbarVisibilityChanged(boolean isVisible) {
         mPropertyModel.set(MENU_IS_VISIBLE, !isVisible);
     }
+
+    void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
+        assert mOverviewModeBehavior == null;
+
+        mOverviewModeBehavior = overviewModeBehavior;
+        if (mOverviewModeObserver == null) {
+            mOverviewModeObserver = new EmptyOverviewModeObserver() {
+                @Override
+                public void onOverviewModeStateChanged(
+                        @OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) {
+                    boolean isShownTabswitcherState =
+                            overviewModeState == OverviewModeState.SHOWN_TABSWITCHER;
+                    mPropertyModel.set(LOGO_IS_VISIBLE, !isShownTabswitcherState);
+                    mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState);
+                }
+            };
+        }
+        mOverviewModeBehavior.addOverviewModeObserver(mOverviewModeObserver);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
index 1ae0472..d4d8d8b7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarProperties.java
@@ -34,8 +34,11 @@
             new PropertyModel.WritableBooleanPropertyKey();
     public static final PropertyModel.WritableBooleanPropertyKey MENU_IS_VISIBLE =
             new PropertyModel.WritableBooleanPropertyKey();
+    public static final PropertyModel.WritableBooleanPropertyKey NEW_TAB_BUTTON_IS_VISIBLE =
+            new PropertyModel.WritableBooleanPropertyKey();
 
-    public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {APP_MENU_BUTTON_HELPER,
-            NEW_TAB_CLICK_HANDLER, IS_VISIBLE, LOGO_IS_VISIBLE, IS_INCOGNITO,
-            INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED, MENU_IS_VISIBLE};
+    public static final PropertyKey[] ALL_KEYS =
+            new PropertyKey[] {APP_MENU_BUTTON_HELPER, NEW_TAB_CLICK_HANDLER, IS_VISIBLE,
+                    LOGO_IS_VISIBLE, IS_INCOGNITO, INCOGNITO_STATE_PROVIDER, ACCESSIBILITY_ENABLED,
+                    MENU_IS_VISIBLE, NEW_TAB_BUTTON_IS_VISIBLE};
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java
index 3e2ecf4..601dc9e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarView.java
@@ -77,6 +77,13 @@
         mMenuButton.setVisibility(isVisible ? View.VISIBLE : View.GONE);
     }
 
+    /**
+     * @param isVisible Whether the new tab button is visible.
+     */
+    void setNewTabButtonVisibility(boolean isVisible) {
+        mNewTabButton.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+    }
+
     /** Called when incognito mode changes. */
     void updateIncognito(boolean isIncognito) {
         updatePrimaryColorAndTint(isIncognito);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
index 935e598..59d37da 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarViewBinder.java
@@ -11,6 +11,7 @@
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.LOGO_IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.MENU_IS_VISIBLE;
+import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_BUTTON_IS_VISIBLE;
 import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.NEW_TAB_CLICK_HANDLER;
 
 import android.view.View;
@@ -38,6 +39,8 @@
             view.onAccessibilityStatusChanged(model.get(ACCESSIBILITY_ENABLED));
         } else if (propertyKey == MENU_IS_VISIBLE) {
             view.setMenuButtonVisibility(model.get(MENU_IS_VISIBLE));
+        } else if (propertyKey == NEW_TAB_BUTTON_IS_VISIBLE) {
+            view.setNewTabButtonVisibility(model.get(NEW_TAB_BUTTON_IS_VISIBLE));
         }
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
index 804f372..56148813 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -144,6 +144,7 @@
         } else if (mStartSurfaceToolbarCoordinator != null) {
             mStartSurfaceToolbarCoordinator.setOnNewTabClickHandler(newTabClickHandler);
             mStartSurfaceToolbarCoordinator.setTabModelSelector(tabModelSelector);
+            mStartSurfaceToolbarCoordinator.setOverviewModeBehavior(overviewModeBehavior);
             mStartSurfaceToolbarCoordinator.onNativeLibraryReady();
         }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java
deleted file mode 100644
index 31bcef9..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantSettingsTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.settings.autofill_assistant;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.nullValue;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.espresso.intent.rule.IntentsTestRule;
-import android.support.test.filters.SmallTest;
-
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.history.HistoryActivity;
-import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
-import org.chromium.chrome.browser.settings.MainPreferences;
-import org.chromium.chrome.browser.settings.SettingsActivity;
-import org.chromium.chrome.browser.settings.SettingsActivityTest;
-import org.chromium.chrome.test.ChromeBrowserTestRule;
-import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
-import org.chromium.content_public.browser.test.util.TestThreadUtils;
-
-/**
- * Tests for the "Autofill Assisatnt" settings screen.
- */
-@RunWith(BaseJUnit4ClassRunner.class)
-public class AutofillAssistantSettingsTest {
-    @Rule
-    public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
-
-    @Rule
-    public TestRule mProcessor = new Features.InstrumentationProcessor();
-
-    @Rule
-    public IntentsTestRule<HistoryActivity> mHistoryActivityTestRule =
-            new IntentsTestRule<>(HistoryActivity.class, false, false);
-
-    /**
-     * Set the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference to the given |value|.
-     * @param value The value to set the preference to.
-     */
-    private void setAutofillAssistantSwitch(boolean value) {
-        ContextUtils.getAppSharedPreferences()
-                .edit()
-                .putBoolean(AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, value)
-                .apply();
-    }
-
-    /**
-     * Get the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference.
-     * @param defaultValue The default value to use if the preference does not exist.
-     * @return The value of the shared preference.
-     */
-    private boolean getAutofillAssistantSwitch(boolean defaultValue) {
-        return ContextUtils.getAppSharedPreferences().getBoolean(
-                AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH, defaultValue);
-    }
-
-    /**
-     * Ensure that the on/off switch in "Autofill Assistant" settings works.
-     */
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
-    public void testAutofillAssistantSwitch() {
-        TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitch(true); });
-
-        final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity(
-                InstrumentationRegistry.getInstrumentation(),
-                AutofillAssistantSettings.class.getName());
-
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            AutofillAssistantSettings autofillAssistantPrefs =
-                    (AutofillAssistantSettings) settingsActivity.getMainFragment();
-            ChromeSwitchPreference onOffSwitch =
-                    (ChromeSwitchPreference) autofillAssistantPrefs.findPreference(
-                            AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH);
-            Assert.assertTrue(onOffSwitch.isChecked());
-
-            onOffSwitch.performClick();
-            Assert.assertFalse(getAutofillAssistantSwitch(true));
-            onOffSwitch.performClick();
-            Assert.assertTrue(getAutofillAssistantSwitch(false));
-
-            settingsActivity.finish();
-            setAutofillAssistantSwitch(false);
-        });
-
-        final SettingsActivity settingsActivity2 = SettingsActivityTest.startSettingsActivity(
-                InstrumentationRegistry.getInstrumentation(),
-                AutofillAssistantSettings.class.getName());
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            AutofillAssistantSettings autofillAssistantPrefs =
-                    (AutofillAssistantSettings) settingsActivity2.getMainFragment();
-            ChromeSwitchPreference onOffSwitch =
-                    (ChromeSwitchPreference) autofillAssistantPrefs.findPreference(
-                            AutofillAssistantSettings.PREF_AUTOFILL_ASSISTANT_SWITCH);
-            Assert.assertFalse(onOffSwitch.isChecked());
-        });
-    }
-
-    /**
-     * Test: if the onboarding was never shown, the AA chrome preference should not exist.
-     *
-     * Note: presence of the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference indicates whether
-     * onboarding was shown or not.
-     */
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
-    public void testAutofillAssistantNoPreferenceIfOnboardingNeverShown() {
-        // Note: |PREF_AUTOFILL_ASSISTANT_SWITCH| is cleared in setUp().
-        final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity(
-                InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment();
-            Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
-                    is(nullValue()));
-        });
-    }
-
-    /**
-     * Test: if the onboarding was shown at least once, the AA chrome preference should also exist.
-     *
-     * Note: presence of the |PREF_AUTOFILL_ASSISTANT_SWITCH| shared preference indicates whether
-     * onboarding was shown or not.
-     */
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
-    public void testAutofillAssistantPreferenceShownIfOnboardingShown() {
-        setAutofillAssistantSwitch(false);
-        final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity(
-                InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment();
-            Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
-                    is(not(nullValue())));
-        });
-    }
-
-    /**
-     * Ensure that the "Autofill Assistant" setting is not shown when the feature is disabled.
-     */
-    @Test
-    @SmallTest
-    @Feature({"Preferences"})
-    @DisableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
-    public void testAutofillAssistantNoPreferenceIfFeatureDisabled() {
-        final SettingsActivity settingsActivity = SettingsActivityTest.startSettingsActivity(
-                InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
-
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) settingsActivity.getMainFragment();
-            Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
-                    is(nullValue()));
-        });
-    }
-}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
deleted file mode 100644
index 829eb83..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://components/autofill_assistant/OWNERS
\ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
index c8b43ca..310d04fe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
@@ -9,6 +9,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
 import android.support.test.filters.SmallTest;
 import android.support.test.uiautomator.UiDevice;
 import android.support.v4.app.FragmentTransaction;
@@ -24,13 +25,18 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
 import org.chromium.chrome.browser.settings.SettingsActivity;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ApplicationTestUtils;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
 import org.chromium.components.sync.AndroidSyncSettings;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -256,6 +262,106 @@
         Assert.assertNotNull("Sync error card should be shown", getSyncErrorCard(fragment));
     }
 
+    /**
+     * Test: if the onboarding was never shown, the AA chrome preference should not exist.
+     *
+     * Note: presence of the {@link SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT}
+     * shared preference indicates whether onboarding was shown or not.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Sync"})
+    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
+    public void testAutofillAssistantNoPreferenceIfOnboardingNeverShown() {
+        final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertNull(
+                    syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT));
+        });
+    }
+
+    /**
+     * Test: if the onboarding was shown at least once, the AA chrome preference should also exist.
+     *
+     * Note: presence of the {@link SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT}
+     * shared preference indicates whether onboarding was shown or not.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Sync"})
+    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
+    public void testAutofillAssistantPreferenceShownIfOnboardingShown() {
+        setAutofillAssistantSwitchValue(true);
+        final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertNotNull(
+                    syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT));
+        });
+    }
+
+    /**
+     * Ensure that the "Autofill Assistant" setting is not shown when the feature is disabled.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Sync"})
+    @DisableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
+    public void testAutofillAssistantNoPreferenceIfFeatureDisabled() {
+        setAutofillAssistantSwitchValue(true);
+        final SyncAndServicesPreferences syncPrefs = startSyncAndServicesPreferences();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertNull(
+                    syncPrefs.findPreference(SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT));
+        });
+    }
+
+    /**
+     * Ensure that the "Autofill Assistant" on/off switch works.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Sync"})
+    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
+    public void testAutofillAssistantSwitchOn() {
+        TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitchValue(true); });
+        final SyncAndServicesPreferences syncAndServicesPreferences =
+                startSyncAndServicesPreferences();
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            ChromeSwitchPreference autofillAssistantSwitch =
+                    (ChromeSwitchPreference) syncAndServicesPreferences.findPreference(
+                            SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT);
+            Assert.assertTrue(autofillAssistantSwitch.isChecked());
+
+            autofillAssistantSwitch.performClick();
+            Assert.assertFalse(syncAndServicesPreferences.isAutofillAssistantSwitchOn());
+            autofillAssistantSwitch.performClick();
+            Assert.assertTrue(syncAndServicesPreferences.isAutofillAssistantSwitchOn());
+        });
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"Sync"})
+    @EnableFeatures(ChromeFeatureList.AUTOFILL_ASSISTANT)
+    public void testAutofillAssistantSwitchOff() {
+        TestThreadUtils.runOnUiThreadBlocking(() -> { setAutofillAssistantSwitchValue(false); });
+        final SyncAndServicesPreferences syncAndServicesPreferences =
+                startSyncAndServicesPreferences();
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            ChromeSwitchPreference autofillAssistantSwitch =
+                    (ChromeSwitchPreference) syncAndServicesPreferences.findPreference(
+                            SyncAndServicesPreferences.PREF_AUTOFILL_ASSISTANT);
+            Assert.assertFalse(autofillAssistantSwitch.isChecked());
+        });
+    }
+
+    private void setAutofillAssistantSwitchValue(boolean newValue) {
+        SharedPreferencesManager.getInstance().writeBoolean(
+                ChromePreferenceKeys.AUTOFILL_ASSISTANT_ENABLED, newValue);
+    }
+
     // TODO(crbug.com/1030725): SyncTestRule should support overriding ProfileSyncService.
     private FakeProfileSyncService overrideProfileSyncService() {
         return TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 6512b5eb..b3a90e17 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -88,6 +88,7 @@
     "//chrome/services/app_service/public/cpp:app_update",
     "//chrome/services/app_service/public/cpp:instance_update",
     "//chrome/services/file_util/public/cpp",
+    "//chrome/services/keymaster/public/mojom",
     "//chrome/services/printing/public/mojom",
     "//chrome/services/wilco_dtc_supportd/public/mojom",
     "//chromeos",
@@ -528,6 +529,8 @@
     "arc/enterprise/cert_store/arc_cert_store_bridge.h",
     "arc/enterprise/cert_store/arc_smart_card_manager_bridge.cc",
     "arc/enterprise/cert_store/arc_smart_card_manager_bridge.h",
+    "arc/enterprise/cert_store/security_token_operation_bridge.cc",
+    "arc/enterprise/cert_store/security_token_operation_bridge.h",
     "arc/extensions/arc_support_message_host.cc",
     "arc/extensions/arc_support_message_host.h",
     "arc/file_system_watcher/arc_file_system_watcher_service.cc",
@@ -613,6 +616,10 @@
     "arc/intent_helper/open_with_menu.h",
     "arc/intent_helper/start_smart_selection_action_menu.cc",
     "arc/intent_helper/start_smart_selection_action_menu.h",
+    "arc/keymaster/arc_keymaster_bridge.cc",
+    "arc/keymaster/arc_keymaster_bridge.h",
+    "arc/keymaster/cert_store_bridge.cc",
+    "arc/keymaster/cert_store_bridge.h",
     "arc/kiosk/arc_kiosk_bridge.cc",
     "arc/kiosk/arc_kiosk_bridge.h",
     "arc/metrics/arc_metrics_service_proxy.cc",
@@ -2602,6 +2609,7 @@
     "arc/enterprise/cert_store/arc_cert_installer_unittest.cc",
     "arc/enterprise/cert_store/arc_cert_installer_utils_unittest.cc",
     "arc/enterprise/cert_store/arc_smart_card_manager_bridge_unittest.cc",
+    "arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc",
     "arc/extensions/arc_support_message_host_unittest.cc",
     "arc/file_system_watcher/arc_file_system_watcher_service_unittest.cc",
     "arc/file_system_watcher/arc_file_system_watcher_util_unittest.cc",
@@ -3075,6 +3083,7 @@
     "//chrome/browser/ui:ash_test_support",
     "//chrome/browser/web_applications/components",
     "//chrome/common",
+    "//chrome/services/keymaster/public/mojom",
     "//chrome/services/wilco_dtc_supportd/public/mojom",
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
diff --git a/chrome/browser/chromeos/DEPS b/chrome/browser/chromeos/DEPS
index f68c057..ebf3424e 100644
--- a/chrome/browser/chromeos/DEPS
+++ b/chrome/browser/chromeos/DEPS
@@ -5,6 +5,7 @@
   "+chrome/browser/ui/views/chrome_layout_provider.h",
 
   "+chrome/services/app_service/public",
+  "+chrome/services/keymaster/public",
   "+chrome/services/wilco_dtc_supportd/public",
   "+components/guest_os",
   "+cros",
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
index 04ce995a..7b697203 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -516,16 +516,6 @@
   return true;
 }
 
-bool KioskAppManager::GetDisableBailoutShortcut() const {
-  bool enable;
-  if (CrosSettings::Get()->GetBoolean(
-          kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) {
-    return !enable;
-  }
-
-  return false;
-}
-
 void KioskAppManager::ClearAppData(const std::string& app_id) {
   KioskAppData* app_data = GetAppDataMutable(app_id);
   if (!app_data)
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
index 963307f..ca7c628 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h
@@ -151,9 +151,6 @@
   // |app| is populated. Otherwise, return false.
   bool GetApp(const std::string& app_id, App* app) const;
 
-  // Gets whether the bailout shortcut is disabled.
-  bool GetDisableBailoutShortcut() const;
-
   // Clears locally cached Gdata.
   void ClearAppData(const std::string& app_id);
 
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc
index 3aca5bb..c333edf 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.cc
@@ -71,6 +71,16 @@
     observer.OnKioskAppDataLoadFailure(app_id);
 }
 
+bool KioskAppManagerBase::GetDisableBailoutShortcut() const {
+  bool enable;
+  if (CrosSettings::Get()->GetBoolean(
+          kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled, &enable)) {
+    return !enable;
+  }
+
+  return false;
+}
+
 void KioskAppManagerBase::NotifyKioskAppsChanged() const {
   for (auto& observer : observers_)
     observer.OnKioskAppsSettingsChanged();
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h
index 4d9f9cb..2614f7f 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_base.h
@@ -63,6 +63,9 @@
   void OnKioskAppDataChanged(const std::string& app_id) const override;
   void OnKioskAppDataLoadFailure(const std::string& app_id) const override;
 
+  // Gets whether the bailout shortcut is disabled.
+  bool GetDisableBailoutShortcut() const;
+
   bool current_app_was_auto_launched_with_zero_delay() const {
     return auto_launched_with_zero_delay_;
   }
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc
new file mode 100644
index 0000000..bf5e829
--- /dev/null
+++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.cc
@@ -0,0 +1,115 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/optional.h"
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h"
+#include "third_party/boringssl/src/include/openssl/ssl.h"
+
+namespace arc {
+namespace keymaster {
+
+namespace {
+
+base::Optional<uint16_t> ConvertMojoAlgorithmToTls(mojom::Algorithm algorithm,
+                                                   mojom::Digest digest) {
+  // Currently, only RSA algorithm is supported.
+  if (algorithm != mojom::Algorithm::kRsaPkcs1)
+    return base::nullopt;
+  switch (digest) {
+    case mojom::Digest::kSha1:
+      return SSL_SIGN_RSA_PKCS1_SHA1;
+    case mojom::Digest::kSha256:
+      return SSL_SIGN_RSA_PKCS1_SHA256;
+    case mojom::Digest::kSha384:
+      return SSL_SIGN_RSA_PKCS1_SHA384;
+    case mojom::Digest::kSha512:
+      return SSL_SIGN_RSA_PKCS1_SHA512;
+  }
+  return base::nullopt;
+}
+
+mojom::SignatureResult ConvertNetToMojomError(net::Error error) {
+  switch (error) {
+    case net::OK:
+      return mojom::SignatureResult::kOk;
+    case net::ERR_FAILED:
+      LOG(ERROR) << "Signature operation failed due to generic reason";
+      return mojom::SignatureResult::kFailed;
+    default:
+      LOG(ERROR) << "Signature operation failed with error=" << error;
+      return mojom::SignatureResult::kFailed;
+  }
+}
+
+}  // namespace
+
+SecurityTokenOperationBridge::SecurityTokenOperationBridge(
+    content::BrowserContext* context,
+    mojo::PendingReceiver<mojom::SecurityTokenOperation> receiver)
+    : receiver_(this, std::move(receiver)),
+      certificate_provider_service_(
+          chromeos::CertificateProviderServiceFactory::GetForBrowserContext(
+              context)),
+      weak_ptr_factory_(this) {
+  VLOG(2) << "SecurityTokenOperationBridge::SecurityTokenOperationBridge";
+  DCHECK(certificate_provider_service_);
+}
+
+SecurityTokenOperationBridge::SecurityTokenOperationBridge(
+    chromeos::CertificateProviderService* certificate_provider_service)
+    : receiver_(this),
+      certificate_provider_service_(certificate_provider_service),
+      weak_ptr_factory_(this) {
+  VLOG(2) << "SecurityTokenOperationBridge::SecurityTokenOperationBridge";
+  DCHECK(certificate_provider_service_);
+}
+
+SecurityTokenOperationBridge::~SecurityTokenOperationBridge() {
+  VLOG(2) << "SecurityTokenOperationBridge::~SecurityTokenOperationBridge";
+}
+
+void SecurityTokenOperationBridge::SignDigest(
+    const std::string& subject_public_key_info,
+    mojom::Algorithm algorithm,
+    mojom::Digest digest,
+    const std::vector<uint8_t>& data,
+    SignDigestCallback callback) {
+  VLOG(2) << "SecurityTokenOperationBridge::SignDigest";
+  base::Optional<uint16_t> crypto_algorithm =
+      ConvertMojoAlgorithmToTls(algorithm, digest);
+  if (!crypto_algorithm.has_value()) {
+    LOG(ERROR) << "Unsupported security token signature algorithm: "
+               << algorithm << " digest: " << digest;
+    std::move(callback).Run(mojom::SignatureResult::kUnsupportedAlgorithm,
+                            base::nullopt);
+    return;
+  }
+  certificate_provider_service_->RequestSignatureBySpki(
+      subject_public_key_info, crypto_algorithm.value(), data, base::nullopt,
+      base::BindOnce(&SecurityTokenOperationBridge::OnSignCompleted,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void SecurityTokenOperationBridge::OnSignCompleted(
+    SignDigestCallback callback,
+    net::Error error,
+    const std::vector<uint8_t>& signature) {
+  VLOG(2) << "SecurityTokenOperationBridge::OnSignCompleted";
+  base::Optional<std::vector<uint8_t>> opt_signature;
+  if (error == net::OK)
+    opt_signature = signature;
+  std::move(callback).Run(ConvertNetToMojomError(error),
+                          std::move(opt_signature));
+}
+
+}  // namespace keymaster
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h
new file mode 100644
index 0000000..71eb350
--- /dev/null
+++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h
@@ -0,0 +1,71 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_
+
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "net/base/net_errors.h"
+
+namespace chromeos {
+
+class CertificateProviderService;
+
+}  // namespace chromeos
+
+namespace content {
+
+class BrowserContext;
+
+}  // namespace content
+
+namespace arc {
+namespace keymaster {
+
+class SecurityTokenOperationBridge : public mojom::SecurityTokenOperation {
+ public:
+  SecurityTokenOperationBridge(
+      content::BrowserContext* context,
+      mojo::PendingReceiver<mojom::SecurityTokenOperation> receiver);
+
+  // This constructor is used only for testing.
+  explicit SecurityTokenOperationBridge(
+      chromeos::CertificateProviderService* certificate_provider_service);
+  SecurityTokenOperationBridge(const SecurityTokenOperationBridge&) = delete;
+  SecurityTokenOperationBridge& operator=(const SecurityTokenOperationBridge&) =
+      delete;
+  ~SecurityTokenOperationBridge() override;
+
+  // mojom::SecurityTokenOperation overrides.
+  void SignDigest(const std::string& subject_public_key_info,
+                  mojom::Algorithm algorithm,
+                  mojom::Digest digest,
+                  const std::vector<uint8_t>& data,
+                  SignDigestCallback callback) override;
+
+ private:
+  void OnSignCompleted(SignDigestCallback callback,
+                       net::Error error,
+                       const std::vector<uint8_t>& signature);
+
+  mojo::Receiver<mojom::SecurityTokenOperation> receiver_;
+
+  chromeos::CertificateProviderService*
+      certificate_provider_service_;  // Not owned.
+
+  base::WeakPtrFactory<SecurityTokenOperationBridge> weak_ptr_factory_;
+};
+
+}  // namespace keymaster
+}  // namespace arc
+
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_ENTERPRISE_CERT_STORE_SECURITY_TOKEN_OPERATION_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc
new file mode 100644
index 0000000..3c3b9cee
--- /dev/null
+++ b/chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge_unittest.cc
@@ -0,0 +1,193 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include "base//strings/string_piece.h"
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h"
+#include "chrome/browser/chromeos/certificate_provider/certificate_info.h"
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider.h"
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
+#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h"
+#include "content/public/test/browser_task_environment.h"
+#include "net/cert/asn1_util.h"
+#include "net/cert/x509_certificate.h"
+#include "net/cert/x509_util.h"
+#include "net/test/cert_test_util.h"
+#include "net/test/test_data_directory.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/boringssl/src/include/openssl/ssl.h"
+
+namespace arc {
+namespace keymaster {
+
+constexpr char kCertFileName[] = "client_1.pem";
+constexpr char kExtensionId[] = "extension";
+
+namespace {
+
+void ReplyToSignRequest(chromeos::CertificateProviderService* service,
+                        int sign_request_id,
+                        const std::vector<uint8_t>* signature) {
+  service->ReplyToSignRequest(kExtensionId, sign_request_id, *signature);
+}
+
+class FakeDelegate : public chromeos::CertificateProviderService::Delegate {
+ public:
+  // * |cert_file_name| - should be empty if there is no certificates.
+  // * |expected_signature| - should be empty to cause an error.
+  FakeDelegate(chromeos::CertificateProviderService* service,
+               const std::string& cert_file_name,
+               const std::vector<uint8_t> expected_signature)
+      : service_(service),
+        cert_file_name_(cert_file_name),
+        expected_signature_(expected_signature) {}
+
+  std::vector<std::string> CertificateProviderExtensions() override {
+    return std::vector<std::string>{kExtensionId};
+  }
+
+  void BroadcastCertificateRequest(int cert_request_id) override {
+    chromeos::certificate_provider::CertificateInfoList infos;
+    if (!cert_file_name_.empty()) {
+      chromeos::certificate_provider::CertificateInfo cert_info;
+      cert_info.certificate = net::ImportCertFromFile(
+          net::GetTestCertsDirectory(), cert_file_name_);
+      EXPECT_TRUE(cert_info.certificate)
+          << "Could not load " << cert_file_name_;
+      cert_info.supported_algorithms.push_back(SSL_SIGN_RSA_PKCS1_SHA256);
+      infos.push_back(cert_info);
+    }
+    service_->SetCertificatesProvidedByExtension(kExtensionId, cert_request_id,
+                                                 infos);
+  }
+
+  bool DispatchSignRequestToExtension(
+      const std::string& extension_id,
+      int sign_request_id,
+      uint16_t algorithm,
+      const scoped_refptr<net::X509Certificate>& certificate,
+      base::span<const uint8_t> digest) override {
+    EXPECT_EQ(kExtensionId, extension_id);
+
+    // Reply after the method result is returned.
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(&ReplyToSignRequest, service_,
+                                  sign_request_id, &expected_signature_));
+    return true;
+  }
+
+ private:
+  chromeos::CertificateProviderService* service_;  // Not owned.
+  std::string cert_file_name_;
+  std::vector<uint8_t> expected_signature_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeDelegate);
+};
+
+}  // namespace
+
+class SecurityTokenOperationBridgeTest
+    : public testing::TestWithParam<std::tuple<mojom::SignatureResult,
+                                               std::string,
+                                               std::vector<uint8_t>>> {
+ public:
+  SecurityTokenOperationBridgeTest() = default;
+  SecurityTokenOperationBridgeTest(const SecurityTokenOperationBridgeTest&) =
+      delete;
+  SecurityTokenOperationBridgeTest& operator=(
+      const SecurityTokenOperationBridgeTest&) = delete;
+
+  void SetUp() override {
+    certificate_provider_service_.SetDelegate(
+        std::make_unique<FakeDelegate>(&certificate_provider_service_,
+                                       cert_file_name(), expected_signature()));
+    bridge_ = std::make_unique<SecurityTokenOperationBridge>(
+        &certificate_provider_service_);
+
+    // Request available certificates.
+    auto certificate_provider =
+        certificate_provider_service()->CreateCertificateProvider();
+    base::RunLoop run_loop;
+    certificate_provider->GetCertificates(base::BindOnce(
+        [](base::RepeatingClosure quit_closure,
+           net::ClientCertIdentityList certs) { quit_closure.Run(); },
+        run_loop.QuitClosure()));
+    run_loop.Run();
+  }
+
+  void TearDown() override { bridge_ = nullptr; }
+
+  chromeos::CertificateProviderService* certificate_provider_service() {
+    return &certificate_provider_service_;
+  }
+
+  SecurityTokenOperationBridge* bridge() { return bridge_.get(); }
+  mojom::SignatureResult expected_result() { return std::get<0>(GetParam()); }
+  std::string cert_file_name() { return std::get<1>(GetParam()); }
+  std::vector<uint8_t> expected_signature() { return std::get<2>(GetParam()); }
+
+  // Extract SPKI from certificate stored in |kCertFileName|.
+  std::string spki() {
+    auto certificate =
+        net::ImportCertFromFile(net::GetTestCertsDirectory(), kCertFileName);
+    base::StringPiece spki_bytes;
+    if (!net::asn1::ExtractSPKIFromDERCert(
+            net::x509_util::CryptoBufferAsStringPiece(
+                certificate->cert_buffer()),
+            &spki_bytes)) {
+      return "";
+    }
+    return spki_bytes.as_string();
+  }
+
+ private:
+  content::BrowserTaskEnvironment browser_task_environment_;
+  chromeos::CertificateProviderService certificate_provider_service_;
+  std::unique_ptr<SecurityTokenOperationBridge> bridge_;
+};
+
+TEST_P(SecurityTokenOperationBridgeTest, BasicTest) {
+  base::RunLoop run_loop;
+
+  bridge()->SignDigest(
+      spki(), mojom::Algorithm::kRsaPkcs1, mojom::Digest::kSha256,
+      std::vector<uint8_t>(),
+      base::BindOnce(
+          [](mojom::SignatureResult expected_result,
+             const std::vector<uint8_t>& expected_signature,
+             base::RepeatingClosure quit_closure, mojom::SignatureResult result,
+             const base::Optional<std::vector<uint8_t>>& signature) {
+            quit_closure.Run();
+            EXPECT_EQ(expected_result, result);
+            if (result == mojom::SignatureResult::kOk) {
+              EXPECT_EQ(expected_signature, signature);
+            } else {
+              EXPECT_FALSE(signature.has_value());
+            }
+          },
+          expected_result(), expected_signature(), run_loop.QuitClosure()));
+  run_loop.Run();
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    SecurityTokenOperationBridgeTest,
+    SecurityTokenOperationBridgeTest,
+    ::testing::Values(std::make_tuple(mojom::SignatureResult::kOk,
+                                      kCertFileName,
+                                      std::vector<uint8_t>(1)),
+                      std::make_tuple(mojom::SignatureResult::kFailed,
+                                      kCertFileName,
+                                      std::vector<uint8_t>()),
+                      std::make_tuple(mojom::SignatureResult::kFailed,
+                                      "",
+                                      std::vector<uint8_t>(1))));
+}  // namespace keymaster
+}  // namespace arc
diff --git a/components/arc/keymaster/arc_keymaster_bridge.cc b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.cc
similarity index 89%
rename from components/arc/keymaster/arc_keymaster_bridge.cc
rename to chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.cc
index 12d57a2..bb54484 100644
--- a/components/arc/keymaster/arc_keymaster_bridge.cc
+++ b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.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 "components/arc/keymaster/arc_keymaster_bridge.h"
+#include "chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h"
 
 #include <utility>
 
@@ -49,7 +49,9 @@
 
 ArcKeymasterBridge::ArcKeymasterBridge(content::BrowserContext* context,
                                        ArcBridgeService* bridge_service)
-    : arc_bridge_service_(bridge_service), weak_factory_(this) {
+    : arc_bridge_service_(bridge_service),
+      cert_store_bridge_(std::make_unique<keymaster::CertStoreBridge>(context)),
+      weak_factory_(this) {
   arc_bridge_service_->keymaster()->SetHost(this);
 }
 
@@ -67,6 +69,7 @@
 
 void ArcKeymasterBridge::OnBootstrapMojoConnection(GetServerCallback callback,
                                                    bool result) {
+  cert_store_bridge_->OnBootstrapMojoConnection(result);
   if (!result) {
     LOG(ERROR) << "Error bootstrapping Mojo in arc-keymasterd.";
     keymaster_server_proxy_.reset();
@@ -79,10 +82,15 @@
 
 void ArcKeymasterBridge::BootstrapMojoConnection(GetServerCallback callback) {
   DVLOG(1) << "Bootstrapping arc-keymasterd Mojo connection via D-Bus.";
+
   mojo::OutgoingInvitation invitation;
   mojo::PlatformChannel channel;
   mojo::ScopedMessagePipeHandle server_pipe =
       invitation.AttachMessagePipe("arc-keymaster-pipe");
+
+  // Bootstrap cert_store channel attached to the same invitation.
+  cert_store_bridge_->BindToInvitation(&invitation);
+
   mojo::OutgoingInvitation::Send(std::move(invitation),
                                  base::kNullProcessHandle,
                                  channel.TakeLocalEndpoint());
diff --git a/components/arc/keymaster/arc_keymaster_bridge.h b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h
similarity index 81%
rename from components/arc/keymaster/arc_keymaster_bridge.h
rename to chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h
index a5ed47e..aa42431 100644
--- a/components/arc/keymaster/arc_keymaster_bridge.h
+++ b/chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
-#define COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h"
 #include "components/arc/mojom/keymaster.mojom.h"
 #include "components/keyed_service/core/keyed_service.h"
 
@@ -47,6 +48,9 @@
   // Points to a proxy bound to the implementation in arc-keymasterd.
   mojom::KeymasterServerPtr keymaster_server_proxy_;
 
+  // Points to a proxy bound to the implementation in arc-keymasterd.
+  std::unique_ptr<keymaster::CertStoreBridge> cert_store_bridge_;
+
   // WeakPtrFactory to use for callbacks.
   base::WeakPtrFactory<ArcKeymasterBridge> weak_factory_;
 
@@ -55,4 +59,4 @@
 
 }  // namespace arc
 
-#endif  // COMPONENTS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_ARC_KEYMASTER_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc
new file mode 100644
index 0000000..fb08dbe
--- /dev/null
+++ b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.cc
@@ -0,0 +1,88 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/logging.h"
+
+#include "mojo/public/cpp/bindings/interface_ptr.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/platform/platform_channel.h"
+
+namespace arc {
+namespace keymaster {
+
+CertStoreBridge::CertStoreBridge(content::BrowserContext* context)
+    : context_(context), weak_ptr_factory_(this) {
+  VLOG(2) << "CertStoreBridge::CertStoreBridge";
+}
+
+CertStoreBridge::~CertStoreBridge() {
+  VLOG(2) << "CertStoreBridge::~CertStoreBridge";
+  security_token_operation_.reset();
+}
+
+void CertStoreBridge::GetSecurityTokenOperation(
+    mojom::SecurityTokenOperationRequest operation_request,
+    GetSecurityTokenOperationCallback callback) {
+  VLOG(2) << "CertStoreBridge::GetSecurityTokenOperation";
+  security_token_operation_ = std::make_unique<SecurityTokenOperationBridge>(
+      context_, mojo::PendingReceiver<mojom::SecurityTokenOperation>(
+                    std::move(operation_request)));
+  std::move(callback).Run();
+}
+
+void CertStoreBridge::BindToInvitation(mojo::OutgoingInvitation* invitation) {
+  VLOG(2) << "CertStoreBridge::BootstrapMojoConnection";
+
+  mojo::ScopedMessagePipeHandle pipe =
+      invitation->AttachMessagePipe("arc-cert-store-pipe");
+
+  cert_store_proxy_.Bind(
+      mojo::InterfacePtrInfo<keymaster::mojom::CertStoreInstance>(
+          std::move(pipe), 0u));
+  VLOG(2) << "Bound remote CertStoreInstance interface to pipe.";
+  cert_store_proxy_.set_connection_error_handler(base::BindOnce(
+      &mojo::InterfacePtr<keymaster::mojom::CertStoreInstance>::reset,
+      base::Unretained(&cert_store_proxy_)));
+}
+
+void CertStoreBridge::OnBootstrapMojoConnection(bool result) {
+  if (!result) {
+    cert_store_proxy_.reset();
+    return;
+  }
+
+  auto binding =
+      std::make_unique<mojo::Binding<keymaster::mojom::CertStoreHost>>(this);
+  mojo::InterfacePtr<keymaster::mojom::CertStoreHost> host_proxy;
+  binding->Bind(mojo::MakeRequest(&host_proxy));
+
+  cert_store_proxy_->Init(
+      std::move(host_proxy),
+      base::BindOnce(&CertStoreBridge::OnConnectionReady,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(binding)));
+}
+
+void CertStoreBridge::OnConnectionReady(
+    std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding) {
+  VLOG(2) << "CertStoreBridge::OnConnectionReady";
+  DCHECK(!binding_);
+  binding->set_connection_error_handler(base::BindOnce(
+      &CertStoreBridge::OnConnectionClosed, base::Unretained(this)));
+  binding_ = std::move(binding);
+}
+
+void CertStoreBridge::OnConnectionClosed() {
+  VLOG(2) << "CertStoreBridge::OnConnectionClosed";
+  DCHECK(binding_);
+  binding_.reset();
+}
+
+}  // namespace keymaster
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h
new file mode 100644
index 0000000..e444798
--- /dev/null
+++ b/chrome/browser/chromeos/arc/keymaster/cert_store_bridge.h
@@ -0,0 +1,62 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_
+
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/arc/enterprise/cert_store/security_token_operation_bridge.h"
+#include "chrome/services/keymaster/public/mojom/cert_store.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/system/invitation.h"
+
+namespace content {
+
+class BrowserContext;
+
+}  // namespace content
+
+namespace arc {
+namespace keymaster {
+
+class CertStoreBridge : public mojom::CertStoreHost {
+ public:
+  explicit CertStoreBridge(content::BrowserContext* context);
+  CertStoreBridge(const CertStoreBridge&) = delete;
+  CertStoreBridge& operator=(const CertStoreBridge&) = delete;
+  ~CertStoreBridge() override;
+
+  // Attaches a new message pipe to the invitation and binds it to the cert
+  // store instance proxy.
+  void BindToInvitation(mojo::OutgoingInvitation* invitation);
+  void OnBootstrapMojoConnection(bool result);
+
+  // CertStoreHost overrides.
+  void GetSecurityTokenOperation(
+      mojom::SecurityTokenOperationRequest operation_request,
+      GetSecurityTokenOperationCallback callback) override;
+
+ private:
+  void OnConnectionReady(
+      std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding);
+  void OnConnectionClosed();
+
+  content::BrowserContext* context_;  // not owned.
+
+  // Points to a proxy bound to the implementation in arc-keymasterd.
+  keymaster::mojom::CertStoreInstancePtr cert_store_proxy_;
+
+  std::unique_ptr<SecurityTokenOperationBridge> security_token_operation_;
+
+  std::unique_ptr<mojo::Binding<mojom::CertStoreHost>> binding_;
+
+  base::WeakPtrFactory<CertStoreBridge> weak_ptr_factory_;
+};
+
+}  // namespace keymaster
+}  // namespace arc
+
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_KEYMASTER_CERT_STORE_BRIDGE_H_
diff --git a/chrome/browser/chromeos/arc/session/arc_service_launcher.cc b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
index a8a9c7b..ca9e02d 100644
--- a/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
+++ b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service.h"
 #include "chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.h"
 #include "chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h"
+#include "chrome/browser/chromeos/arc/keymaster/arc_keymaster_bridge.h"
 #include "chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.h"
 #include "chrome/browser/chromeos/arc/metrics/arc_metrics_service_proxy.h"
 #include "chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h"
@@ -63,7 +64,6 @@
 #include "components/arc/disk_quota/arc_disk_quota_bridge.h"
 #include "components/arc/ime/arc_ime_service.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
-#include "components/arc/keymaster/arc_keymaster_bridge.h"
 #include "components/arc/lock_screen/arc_lock_screen_bridge.h"
 #include "components/arc/media_session/arc_media_session_bridge.h"
 #include "components/arc/metrics/arc_metrics_service.h"
diff --git a/chrome/browser/chromeos/assistant/assistant_util.cc b/chrome/browser/chromeos/assistant/assistant_util.cc
index 60f9d48f..82edd61 100644
--- a/chrome/browser/chromeos/assistant/assistant_util.cc
+++ b/chrome/browser/chromeos/assistant/assistant_util.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
+#include "chromeos/constants/devicetype.h"
 #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -24,35 +25,6 @@
 #include "third_party/icu/source/common/unicode/locid.h"
 #include "ui/chromeos/events/keyboard_layout_util.h"
 
-namespace {
-
-constexpr char kAtlasBoardType[] = "atlas";
-constexpr char kEveBoardType[] = "eve";
-constexpr char kNocturneBoardType[] = "nocturne";
-
-bool IsBoardType(const std::string& board_name, const std::string& board_type) {
-  // The sub-types of the board will have the form boardtype-XXX.
-  // To prevent the possibility of common prefix in board names we check the
-  // board type with '-' here. For example there might be two board types with
-  // codename boardtype1 and boardtype123.
-  return board_name == board_type ||
-         base::StartsWith(board_name, board_type + '-',
-                          base::CompareCase::SENSITIVE);
-}
-
-// TODO(updowndota): Merge this method with the IsGoogleDevice method in
-// ash::assistant::util, probably move to ash::public:cpp.
-//
-// Returns whether the device has a dedicated Assistant key.
-bool IsAssistantDevice() {
-  const std::string board_name = base::SysInfo::GetLsbReleaseBoard();
-  return IsBoardType(board_name, kAtlasBoardType) ||
-         IsBoardType(board_name, kEveBoardType) ||
-         IsBoardType(board_name, kNocturneBoardType);
-}
-
-}  // namespace
-
 namespace assistant {
 
 ash::mojom::AssistantAllowedState IsAssistantAllowedForProfile(
@@ -126,7 +98,8 @@
 
   // Bypass the account type check when using fake gaia login, e.g. in Tast
   // tests, or the account is logged in a device with dedicated Assistant key.
-  if (!chromeos::switches::IsGaiaServicesDisabled() && !(IsAssistantDevice())) {
+  if (!chromeos::switches::IsGaiaServicesDisabled() &&
+      !chromeos::IsGoogleBrandedDevice()) {
     // Only enable non-dasher accounts for devices without physical key.
     bool account_supported = false;
     auto* identity_manager =
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 cc76f53..6df1a59 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -2503,6 +2503,27 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// AutotestPrivateIsArcPackageListInitialRefreshedFunction
+///////////////////////////////////////////////////////////////////////////////
+
+AutotestPrivateIsArcPackageListInitialRefreshedFunction::
+    AutotestPrivateIsArcPackageListInitialRefreshedFunction() = default;
+
+AutotestPrivateIsArcPackageListInitialRefreshedFunction::
+    ~AutotestPrivateIsArcPackageListInitialRefreshedFunction() = default;
+
+ExtensionFunction::ResponseAction
+AutotestPrivateIsArcPackageListInitialRefreshedFunction::Run() {
+  DVLOG(1) << "AutotestPrivateIsArcPackageListInitialRefreshedFunction";
+
+  ArcAppListPrefs* const prefs =
+      ArcAppListPrefs::Get(Profile::FromBrowserContext(browser_context()));
+
+  return RespondNow(OneArgument(
+      std::make_unique<base::Value>(prefs->package_list_initial_refreshed())));
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // AutotestPrivateSetWhitelistedPrefFunction
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
index 3d0bab7..9901885f 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -643,6 +643,18 @@
   base::OneShotTimer timeout_timer_;
 };
 
+class AutotestPrivateIsArcPackageListInitialRefreshedFunction
+    : public ExtensionFunction {
+ public:
+  AutotestPrivateIsArcPackageListInitialRefreshedFunction();
+  DECLARE_EXTENSION_FUNCTION("autotestPrivate.isArcPackageListInitialRefreshed",
+                             AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED)
+
+ private:
+  ~AutotestPrivateIsArcPackageListInitialRefreshedFunction() override;
+  ResponseAction Run() override;
+};
+
 // Set user pref value in the pref tree.
 class AutotestPrivateSetWhitelistedPrefFunction : public ExtensionFunction {
  public:
diff --git a/chrome/browser/chromeos/login/arc_kiosk_controller.cc b/chrome/browser/chromeos/login/arc_kiosk_controller.cc
index 9074f11..8bee0c6 100644
--- a/chrome/browser/chromeos/login/arc_kiosk_controller.cc
+++ b/chrome/browser/chromeos/login/arc_kiosk_controller.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/login/auth/chrome_login_performer.h"
 #include "chrome/browser/chromeos/login/screens/encryption_migration_screen.h"
@@ -56,6 +57,9 @@
 }
 
 void ArcKioskController::OnCancelArcKioskLaunch() {
+  if (ArcKioskAppManager::Get()->GetDisableBailoutShortcut())
+    return;
+
   KioskAppLaunchError::Save(KioskAppLaunchError::USER_CANCEL);
   CleanUp();
   chrome::AttemptUserExit();
diff --git a/chrome/browser/chromeos/login/web_kiosk_controller.cc b/chrome/browser/chromeos/login/web_kiosk_controller.cc
index 301aa64..146e741 100644
--- a/chrome/browser/chromeos/login/web_kiosk_controller.cc
+++ b/chrome/browser/chromeos/login/web_kiosk_controller.cc
@@ -80,6 +80,9 @@
 }
 
 void WebKioskController::OnCancelAppLaunch() {
+  if (WebKioskAppManager::Get()->GetDisableBailoutShortcut())
+    return;
+
   KioskAppLaunchError::Save(KioskAppLaunchError::USER_CANCEL);
   CleanUp();
   chrome::AttemptUserExit();
diff --git a/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc b/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc
index aa4e913a..a827864 100644
--- a/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc
+++ b/chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.cc
@@ -24,7 +24,7 @@
 const brlapi_keyCode_t kMaxLatin1KeySym = 0xff;
 
 // Range of function keys that we support.
-// See ui/events/keycodes/dom/keycode_converter_data.inc for the list of all
+// See ui/events/keycodes/dom/dom_code_data.inc for the list of all
 // key codes.
 const brlapi_keyCode_t kMinFunctionKey = BRLAPI_KEY_SYM_FUNCTION;
 const brlapi_keyCode_t kMaxFunctionKey = BRLAPI_KEY_SYM_FUNCTION + 23;
@@ -42,7 +42,7 @@
 
 // Maps a brlapi keysym, which is similar to an X keysym into the
 // provided event.
-// See ui/events/keycodes/dom/keycode_converter_data.cc for the full
+// See ui/events/keycodes/dom/dom_code_data.cc for the full
 // list of key codes.
 void MapKeySym(brlapi_keyCode_t code, KeyEvent* event) {
   brlapi_keyCode_t key_sym = code & BRLAPI_KEY_CODE_MASK;
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 533703cc..a32ab21 100644
--- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -234,19 +234,19 @@
     // sessions (anything older than 14 days), so we cannot use
     // MockModelTypeWorker's convenience functions, which internally use very
     // old timestamps.
-    auto header_entity_data = std::make_unique<syncer::EntityData>();
-    header_entity_data->client_tag_hash =
+    syncer::EntityData header_entity_data;
+    header_entity_data.client_tag_hash =
         TagHashFromSpecifics(header_entity.session());
-    header_entity_data->id =
-        "FakeId:" + header_entity_data->client_tag_hash.value();
-    header_entity_data->specifics = header_entity;
-    header_entity_data->creation_time =
+    header_entity_data.id =
+        "FakeId:" + header_entity_data.client_tag_hash.value();
+    header_entity_data.specifics = header_entity;
+    header_entity_data.creation_time =
         time_now - base::TimeDelta::FromSeconds(index);
-    header_entity_data->modification_time = header_entity_data->creation_time;
+    header_entity_data.modification_time = header_entity_data.creation_time;
 
-    auto header_update = std::make_unique<syncer::UpdateResponseData>();
-    header_update->entity = std::move(header_entity_data);
-    header_update->response_version = 1;
+    syncer::UpdateResponseData header_update;
+    header_update.entity = std::move(header_entity_data);
+    header_update.response_version = 1;
     syncer::UpdateResponseDataList updates;
     updates.push_back(std::move(header_update));
     worker.UpdateFromServer(std::move(updates));
diff --git a/chrome/browser/notifications/web_page_notifier_controller_unittest.cc b/chrome/browser/notifications/web_page_notifier_controller_unittest.cc
new file mode 100644
index 0000000..40b51e0b
--- /dev/null
+++ b/chrome/browser/notifications/web_page_notifier_controller_unittest.cc
@@ -0,0 +1,121 @@
+// Copyright 2020 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 <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/favicon/favicon_service_factory.h"
+#include "chrome/browser/notifications/web_page_notifier_controller.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/test/content_settings_mock_provider.h"
+#include "components/content_settings/core/test/content_settings_test_utils.h"
+#include "components/favicon/core/test/mock_favicon_service.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace {
+
+// Note that so far it is only working for full URLs with a scheme e.g. https.
+// For every other pattern type it doesn't work (without a scheme or with
+// wildcards).
+// TODO(tomdobro): enable other test cases after the problem is fixed.
+constexpr const char* kTestPatterns[] = {
+    "https://full.test.com",
+    //"no_scheme.test.com",
+    //"[*.]any.test.com",
+    //"*://any_scheme.test.com",
+    //"https://[*.]scheme_any.test.com",
+    //"*://[*.]any_any.test.com",
+};
+
+class MockObserver : public NotifierController::Observer {
+ public:
+  MockObserver() = default;
+
+  MOCK_METHOD2(OnIconImageUpdated,
+               void(const message_center::NotifierId& id,
+                    const gfx::ImageSkia& image));
+
+  MOCK_METHOD2(OnNotifierEnabledChanged,
+               void(const message_center::NotifierId& id, bool enabled));
+};
+
+std::unique_ptr<KeyedService> BuildMockFaviconService(
+    content::BrowserContext* context) {
+  return std::make_unique<testing::NiceMock<favicon::MockFaviconService>>();
+}
+
+}  // namespace
+
+class WebPageNotifierControllerTest : public testing::Test {
+ protected:
+  void TestGetNotifiersList(ContentSetting content_setting,
+                            HostContentSettingsMap::ProviderType provider_type,
+                            bool expect_enabled,
+                            bool expect_enforced);
+
+  content::BrowserTaskEnvironment task_environment_;
+
+  MockObserver mock_observer_;
+};
+
+void WebPageNotifierControllerTest::TestGetNotifiersList(
+    ContentSetting content_setting,
+    HostContentSettingsMap::ProviderType provider_type,
+    bool expect_enabled,
+    bool expect_enforced) {
+  WebPageNotifierController controller(&mock_observer_);
+  std::unique_ptr<TestingProfile> profile;
+
+  TestingProfile::Builder builder;
+  builder.AddTestingFactory(FaviconServiceFactory::GetInstance(),
+                            base::BindRepeating(&BuildMockFaviconService));
+  profile = builder.Build();
+
+  auto* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(profile.get());
+
+  auto provider = std::make_unique<content_settings::MockProvider>();
+
+  for (const char* pattern : kTestPatterns) {
+    provider->SetWebsiteSetting(
+        ContentSettingsPattern::FromString(pattern),
+        ContentSettingsPattern::Wildcard(), ContentSettingsType::NOTIFICATIONS,
+        std::string(), std::make_unique<base::Value>(content_setting));
+  }
+
+  content_settings::TestUtils::OverrideProvider(
+      host_content_settings_map, std::move(provider), provider_type);
+
+  const auto list = controller.GetNotifierList(profile.get());
+
+  for (const auto& el : list) {
+    SCOPED_TRACE(el.name);
+    EXPECT_EQ(expect_enabled, el.enabled);
+    EXPECT_EQ(expect_enforced, el.enforced);
+  }
+}
+
+TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListPrefs) {
+  // Test URL patterns as they were given by PREF_PROVIDER imitating
+  // notifications enabled by the user (as opposed to admin), thus not enforced.
+  TestGetNotifiersList(CONTENT_SETTING_ALLOW,
+                       HostContentSettingsMap::PREF_PROVIDER,
+                       /*expect_enabled=*/true, /*expect_enforced=*/false);
+}
+
+TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListEnforced) {
+  // Test URL patterns as they were given by POLICY_PROVIDER imitating
+  // notifications enabled by the admin, thus enforced.
+  TestGetNotifiersList(CONTENT_SETTING_ALLOW,
+                       HostContentSettingsMap::POLICY_PROVIDER,
+                       /*expect_enabled=*/true, /*expect_enforced=*/true);
+}
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index 4a0f2d15..622b010 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -46,6 +46,9 @@
      */
     public static final String ACCESSIBILITY_TAB_SWITCHER = "accessibility_tab_switcher";
 
+    /** Whether Autofill Assistant is enabled */
+    public static final String AUTOFILL_ASSISTANT_ENABLED = "autofill_assistant_switch";
+
     public static final String BOOKMARKS_LAST_USED_URL = "enhanced_bookmark_last_used_url";
     public static final String BOOKMARKS_LAST_USED_PARENT =
             "enhanced_bookmark_last_used_parent_folder";
@@ -569,6 +572,7 @@
         // clang-format off
         return Arrays.asList(
                 ACCESSIBILITY_TAB_SWITCHER,
+                AUTOFILL_ASSISTANT_ENABLED,
                 BOOKMARKS_LAST_USED_URL,
                 BOOKMARKS_LAST_USED_PARENT,
                 CHROME_DEFAULT_BROWSER,
diff --git a/chrome/browser/resources/chromeos/camera/.clang-format b/chrome/browser/resources/chromeos/camera/.clang-format
new file mode 100644
index 0000000..7defeab
--- /dev/null
+++ b/chrome/browser/resources/chromeos/camera/.clang-format
@@ -0,0 +1,3 @@
+BasedOnStyle: Chromium
+Standard: Cpp11
+JavaScriptWrapImports: true
diff --git a/chrome/browser/resources/chromeos/camera/src/js/background.js b/chrome/browser/resources/chromeos/camera/src/js/background.js
index 1c60e3f..704024a 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/background.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/background.js
@@ -2,71 +2,62 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-'use strict';
-
-/**
- * Namespace for the Camera app.
- */
-var cca = cca || {};
-
-/**
- * Namespace for the background page.
- */
-cca.bg = {};
+import {
+  BackgroundOps,  // eslint-disable-line no-unused-vars
+  ForegroundOps,  // eslint-disable-line no-unused-vars
+} from './background_ops.js';
+import {Intent} from './intent.js';
+import {PerfEvent, PerfLogger} from './perf.js';
 
 /**
  * Fixed minimum width of the window inner-bounds in pixels.
  * @type {number}
- * @const
  */
-cca.bg.MIN_WIDTH = 768;
+const MIN_WIDTH = 768;
 
 /**
  * Initial apsect ratio of the window inner-bounds.
  * @type {number}
- * @const
  */
-cca.bg.INITIAL_ASPECT_RATIO = 1.7777777777;
+const INITIAL_ASPECT_RATIO = 1.7777777777;
 
 /**
  * Top bar color of the window.
  * @type {string}
- * @const
  */
-cca.bg.TOPBAR_COLOR = '#000000';
+const TOPBAR_COLOR = '#000000';
 
 /**
  * The id of the test app used in Tast.
  * @type {string}
- * @const
  */
-cca.bg.TEST_API_ID = 'behllobkkfkfnphdnhnkndlbkcpglgmj';
+const TEST_API_ID = 'behllobkkfkfnphdnhnkndlbkcpglgmj';
 
 /**
  * It's used in test to ensure that we won't connect to the main.html target
  * before the window is created, otherwise the window might disappear.
  * @type {?function(string): undefined}
  */
-cca.bg.onAppWindowCreatedForTesting = null;
+let onAppWindowCreatedForTesting = null;
 
 /**
  * It's used in test to catch the perf event before the creation of app window
  * for time measurement before launch.
- * @type {?cca.perf.PerfLogger}
+ * @type {?PerfLogger}
  */
-cca.bg.perfLoggerForTesting = null;
+let perfLoggerForTesting = null;
 
 /**
  * Background object for handling launch event.
- * @type {?cca.bg.Background}
+ * @type {?Background}
  */
-cca.bg.background = null;
+let background = null;
 
 /**
- * State of cca.bg.Window.
+ * State of CCAWindow.
  * @enum {string}
  */
-cca.bg.WindowState = {
+const WindowState = {
   UNINIT: 'uninitialized',
   LAUNCHING: 'launching',
   ACTIVE: 'active',
@@ -79,51 +70,51 @@
 
 /**
  * Wrapper of AppWindow for tracking its state.
- * @implements {cca.bg.BackgroundOps}
+ * @implements {BackgroundOps}
  */
-cca.bg.Window = class {
+class CCAWindow {
   /**
-   * @param {!function(cca.bg.Window)} onActive Called when window become active
+   * @param {!function(CCAWindow)} onActive Called when window become active
    *     state.
-   * @param {!function(cca.bg.Window)} onSuspended Called when window become
+   * @param {!function(CCAWindow)} onSuspended Called when window become
    *     suspended state.
-   * @param {!function(cca.bg.Window)} onClosed Called when window become closed
+   * @param {!function(CCAWindow)} onClosed Called when window become closed
    *     state.
-   * @param {?cca.perf.PerfLogger} perfLogger The logger for perf events. If it
+   * @param {?PerfLogger} perfLogger The logger for perf events. If it
    *     is null, we will create a new one for the window.
-   * @param {cca.intent.Intent=} intent Intent to be handled by the app window.
+   * @param {Intent=} intent Intent to be handled by the app window.
    *     Set to null for app window not launching from intent.
    */
   constructor(onActive, onSuspended, onClosed, perfLogger, intent = null) {
     /**
-     * @type {!function(!cca.bg.Window)}
+     * @type {!function(!CCAWindow)}
      * @private
      */
     this.onActive_ = onActive;
 
     /**
-     * @type {!function(!cca.bg.Window)}
+     * @type {!function(!CCAWindow)}
      * @private
      */
     this.onSuspended_ = onSuspended;
 
     /**
-     * @type {!function(!cca.bg.Window)}
+     * @type {!function(!CCAWindow)}
      * @private
      */
     this.onClosed_ = onClosed;
 
     /**
-     * @type {?cca.intent.Intent}
+     * @type {?Intent}
      * @private
      */
     this.intent_ = intent;
 
     /**
-     * @type {!cca.perf.PerfLogger}
+     * @type {!PerfLogger}
      * @private
      */
-    this.perfLogger_ = perfLogger || new cca.perf.PerfLogger();
+    this.perfLogger_ = perfLogger || new PerfLogger();
 
     /**
      * @type {?chrome.app.window.AppWindow}
@@ -132,21 +123,21 @@
     this.appWindow_ = null;
 
     /**
-     * @type {?cca.bg.ForegroundOps}
+     * @type {?ForegroundOps}
      * @private
      */
     this.foregroundOps_ = null;
 
     /**
-     * @type {!cca.bg.WindowState}
+     * @type {!WindowState}
      * @private
      */
-    this.state_ = cca.bg.WindowState.UNINIT;
+    this.state_ = WindowState.UNINIT;
   }
 
   /**
    * Gets state of the window.
-   * @return {cca.bg.WindowState}
+   * @return {WindowState}
    */
   get state() {
     return this.state_;
@@ -156,12 +147,11 @@
    * Creates app window and launches app.
    */
   launch() {
-    this.state_ = cca.bg.WindowState.LAUNCHING;
+    this.state_ = WindowState.LAUNCHING;
 
     // The height will be later calculated to match video aspect ratio once the
     // stream is available.
-    var initialHeight =
-        Math.round(cca.bg.MIN_WIDTH / cca.bg.INITIAL_ASPECT_RATIO);
+    const initialHeight = Math.round(MIN_WIDTH / INITIAL_ASPECT_RATIO);
 
     const windowId =
         this.intent_ !== null ? `main-${this.intent_.intentId}` : 'main';
@@ -171,32 +161,31 @@
     chrome.app.window.create(
         windowUrl, {
           id: windowId,
-          frame: {color: cca.bg.TOPBAR_COLOR},
+          frame: {color: TOPBAR_COLOR},
           hidden: true,  // Will be shown from main.js once loaded.
           innerBounds: {
-            width: cca.bg.MIN_WIDTH,
+            width: MIN_WIDTH,
             height: initialHeight,
-            minWidth: cca.bg.MIN_WIDTH,
-            left: Math.round((window.screen.availWidth - cca.bg.MIN_WIDTH) / 2),
+            minWidth: MIN_WIDTH,
+            left: Math.round((window.screen.availWidth - MIN_WIDTH) / 2),
             top: Math.round((window.screen.availHeight - initialHeight) / 2),
           },
         },
         (appWindow) => {
-          this.perfLogger_.start(
-              cca.perf.PerfEvent.LAUNCHING_FROM_WINDOW_CREATION);
+          this.perfLogger_.start(PerfEvent.LAUNCHING_FROM_WINDOW_CREATION);
           this.appWindow_ = appWindow;
           this.appWindow_.onClosed.addListener(() => {
             chrome.storage.local.set({maximized: appWindow.isMaximized()});
             chrome.storage.local.set({fullscreen: appWindow.isFullscreen()});
-            this.state_ = cca.bg.WindowState.CLOSED;
+            this.state_ = WindowState.CLOSED;
             if (this.intent_ !== null && !this.intent_.done) {
               this.intent_.cancel();
             }
             this.onClosed_(this);
           });
           appWindow.contentWindow.backgroundOps = this;
-          if (cca.bg.onAppWindowCreatedForTesting !== null) {
-            cca.bg.onAppWindowCreatedForTesting(windowUrl);
+          if (onAppWindowCreatedForTesting !== null) {
+            onAppWindowCreatedForTesting(windowUrl);
           }
         });
   }
@@ -219,7 +208,7 @@
    * @override
    */
   notifyActivation() {
-    this.state_ = cca.bg.WindowState.ACTIVE;
+    this.state_ = WindowState.ACTIVE;
     // For intent only requiring open camera with specific mode without
     // returning the capture result, called onIntentHandled() right
     // after app successfully launched.
@@ -233,7 +222,7 @@
    * @override
    */
   notifySuspension() {
-    this.state_ = cca.bg.WindowState.SUSPENDED;
+    this.state_ = WindowState.SUSPENDED;
     this.onSuspended_(this);
   }
 
@@ -248,11 +237,11 @@
    * Suspends the app window.
    */
   suspend() {
-    if (this.state_ === cca.bg.WindowState.LAUNCHING) {
+    if (this.state_ === WindowState.LAUNCHING) {
       console.error('Call suspend() while window is still launching.');
       return;
     }
-    this.state_ = cca.bg.WindowState.SUSPENDING;
+    this.state_ = WindowState.SUSPENDING;
     this.foregroundOps_.suspend();
   }
 
@@ -260,7 +249,7 @@
    * Resumes the app window.
    */
   resume() {
-    this.state_ = cca.bg.WindowState.RESUMING;
+    this.state_ = WindowState.RESUMING;
     this.foregroundOps_.resume();
   }
 
@@ -268,35 +257,35 @@
    * Closes the app window.
    */
   close() {
-    this.state_ = cca.bg.WindowState.CLOSING;
+    this.state_ = WindowState.CLOSING;
     this.appWindow_.close();
   }
-};
+}
 
 /**
  * Launch event handler runs in background.
  */
-cca.bg.Background = class {
+class Background {
   /**
    */
   constructor() {
     /**
      * Launch window handles launch event triggered from app launcher.
-     * @type {?cca.bg.Window}
+     * @type {?CCAWindow}
      * @private
      */
     this.launcherWindow_ = null;
 
     /**
      * Intent window handles launch event triggered from ARC++ intent.
-     * @type {?cca.bg.Window}
+     * @type {?CCAWindow}
      * @private
      */
     this.intentWindow_ = null;
 
     /**
      * The pending intent arrived when foreground window is busy.
-     * @type {?cca.intent.Intent}
+     * @type {?Intent}
      */
     this.pendingIntent_ = null;
   }
@@ -330,7 +319,7 @@
 
   /**
    * Returns a Window object handling launch event triggered from app launcher.
-   * @return {!cca.bg.Window}
+   * @return {!CCAWindow}
    * @private
    */
   createLauncherWindow_() {
@@ -364,16 +353,16 @@
         this.processPendingIntent_();
       }
     };
-    const wnd = new cca.bg.Window(
-        onActive, onSuspended, onClosed, cca.bg.perfLoggerForTesting);
-    cca.bg.perfLoggerForTesting = null;
+    const wnd =
+        new CCAWindow(onActive, onSuspended, onClosed, perfLoggerForTesting);
+    perfLoggerForTesting = null;
     return wnd;
   }
 
   /**
    * Returns a Window object handling launch event triggered from ARC++ intent.
-   * @param {!cca.intent.Intent} intent Intent forwarding from ARC++.
-   * @return {!cca.bg.Window}
+   * @param {!Intent} intent Intent forwarding from ARC++.
+   * @return {!CCAWindow}
    * @private
    */
   createIntentWindow_(intent) {
@@ -381,7 +370,7 @@
       this.assert_(wnd === this.intentWindow_, 'Wrong active intent window.');
       this.assert_(
           !this.launcherWindow_ ||
-              this.launcherWindow_.state === cca.bg.WindowState.SUSPENDED,
+              this.launcherWindow_.state === WindowState.SUSPENDED,
           () => `Launch window is ${
               this.launcherWindow_.state} when intent window is active.`);
       if (this.pendingIntent_) {
@@ -397,7 +386,7 @@
       this.assert_(wnd === this.intentWindow_, 'Wrong closed intent window.');
       this.assert_(
           !this.launcherWindow_ ||
-              this.launcherWindow_.state === cca.bg.WindowState.SUSPENDED,
+              this.launcherWindow_.state === WindowState.SUSPENDED,
           () => `Launch window is ${
               this.launcherWindow_.state} when intent window is closed.`);
       this.intentWindow_ = null;
@@ -407,9 +396,9 @@
         this.launcherWindow_.resume();
       }
     };
-    const wnd = new cca.bg.Window(
-        onActive, onSuspended, onClosed, cca.bg.perfLoggerForTesting, intent);
-    cca.bg.perfLoggerForTesting = null;
+    const wnd = new CCAWindow(
+        onActive, onSuspended, onClosed, perfLoggerForTesting, intent);
+    perfLoggerForTesting = null;
     return wnd;
   }
 
@@ -430,7 +419,7 @@
   /**
    * Closes the existing pending intent and replaces it with a new incoming
    * intent.
-   * @param {!cca.intent.Intent} intent New incoming intent.
+   * @param {!Intent} intent New incoming intent.
    * @private
    */
   replacePendingIntent_(intent) {
@@ -442,16 +431,16 @@
 
   /**
    * Handles launch event triggered from ARC++ intent.
-   * @param {!cca.intent.Intent} intent Intent forwarding from ARC++.
+   * @param {!Intent} intent Intent forwarding from ARC++.
    */
   launchIntent(intent) {
     if (this.intentWindow_) {
       switch (this.intentWindow_.state) {
-        case cca.bg.WindowState.LAUNCHING:
-        case cca.bg.WindowState.CLOSING:
+        case WindowState.LAUNCHING:
+        case WindowState.CLOSING:
           this.replacePendingIntent_(intent);
           break;
-        case cca.bg.WindowState.ACTIVE:
+        case WindowState.ACTIVE:
           this.replacePendingIntent_(intent);
           this.intentWindow_.close();
           break;
@@ -463,13 +452,13 @@
       }
     } else if (this.launcherWindow_) {
       switch (this.launcherWindow_.state) {
-        case cca.bg.WindowState.LAUNCHING:
-        case cca.bg.WindowState.SUSPENDING:
-        case cca.bg.WindowState.RESUMING:
-        case cca.bg.WindowState.CLOSING:
+        case WindowState.LAUNCHING:
+        case WindowState.SUSPENDING:
+        case WindowState.RESUMING:
+        case WindowState.CLOSING:
           this.replacePendingIntent_(intent);
           break;
-        case cca.bg.WindowState.ACTIVE:
+        case WindowState.ACTIVE:
           this.assert_(
               !this.pendingIntent_,
               'Pending intent is not processed when launch window is active.');
@@ -487,7 +476,7 @@
       this.intentWindow_.launch();
     }
   }
-};
+}
 
 /**
  * Handles messages from the test extension used in Tast.
@@ -499,72 +488,70 @@
  * @return {boolean|undefined} True to indicate the response is sent
  *     asynchronously.
  */
-cca.bg.handleExternalMessageFromTest = function(message, sender, sendResponse) {
-  if (sender.id !== cca.bg.TEST_API_ID) {
+function handleExternalMessageFromTest(message, sender, sendResponse) {
+  if (sender.id !== TEST_API_ID) {
     console.warn(`Unknown sender id: ${sender.id}`);
     return;
   }
   switch (message.action) {
     case 'SET_WINDOW_CREATED_CALLBACK':
-      cca.bg.onAppWindowCreatedForTesting = sendResponse;
+      onAppWindowCreatedForTesting = sendResponse;
       return true;
     default:
       console.warn(`Unknown action: ${message.action}`);
   }
-};
+}
 
 /**
  * Handles connection from the test extension used in Tast.
  * @param {Port} port The port that used to do two-way communication.
  */
-cca.bg.handleExternalConnectionFromTest = function(port) {
-  if (port.sender.id !== cca.bg.TEST_API_ID) {
+function handleExternalConnectionFromTest(port) {
+  if (port.sender.id !== TEST_API_ID) {
     console.warn(`Unknown sender id: ${port.sender.id}`);
     return;
   }
   switch (port.name) {
     case 'SET_PERF_CONNECTION':
       port.onMessage.addListener((event) => {
-        if (cca.bg.perfLoggerForTesting === null) {
-          cca.bg.perfLoggerForTesting = new cca.perf.PerfLogger();
+        if (perfLoggerForTesting === null) {
+          perfLoggerForTesting = new PerfLogger();
 
-          cca.bg.perfLoggerForTesting.addListener((event, duration, extras) => {
+          perfLoggerForTesting.addListener((event, duration, extras) => {
             port.postMessage({event, duration, extras});
           });
         }
 
         const {name} = event;
-        if (name !== cca.perf.PerfEvent.LAUNCHING_FROM_LAUNCH_APP_COLD &&
-            name !== cca.perf.PerfEvent.LAUNCHING_FROM_LAUNCH_APP_WARM) {
+        if (name !== PerfEvent.LAUNCHING_FROM_LAUNCH_APP_COLD &&
+            name !== PerfEvent.LAUNCHING_FROM_LAUNCH_APP_WARM) {
           console.warn(`Unknown event name from test: ${name}`);
           return;
         }
-        cca.bg.perfLoggerForTesting.start(name);
+        perfLoggerForTesting.start(name);
       });
       return;
     default:
       console.warn(`Unknown port name: ${port.name}`);
   }
-};
+}
 
 chrome.app.runtime.onLaunched.addListener((launchData) => {
-  if (!cca.bg.background) {
-    cca.bg.background = new cca.bg.Background();
+  if (!background) {
+    background = new Background();
   }
   try {
     if (launchData.url) {
-      const intent = cca.intent.Intent.create(new URL(launchData.url));
-      cca.bg.background.launchIntent(intent);
+      const intent = Intent.create(new URL(launchData.url));
+      background.launchIntent(intent);
     } else {
-      cca.bg.background.launchApp();
+      background.launchApp();
     }
   } catch (e) {
     console.error(e.stack);
   }
 });
 
-chrome.runtime.onMessageExternal.addListener(
-    cca.bg.handleExternalMessageFromTest);
+chrome.runtime.onMessageExternal.addListener(handleExternalMessageFromTest);
 
-chrome.runtime.onConnectExternal.addListener(
-    cca.bg.handleExternalConnectionFromTest);
+chrome.runtime.onConnectExternal.addListener(handleExternalConnectionFromTest);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/main.js b/chrome/browser/resources/chromeos/camera/src/js/main.js
index ec74a39..8065937 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/main.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/main.js
@@ -2,70 +2,94 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-'use strict';
-
-/**
- * Namespace for the Camera app.
- */
-var cca = cca || {};
+import {
+  BackgroundOps,  // eslint-disable-line no-unused-vars
+  ForegroundOps,  // eslint-disable-line no-unused-vars
+} from './background_ops.js';
+import {browserProxy} from './browser_proxy/browser_proxy.js';
+import {assert, assertInstanceof} from './chrome_util.js';
+import {
+  PhotoConstraintsPreferrer,
+  VideoConstraintsPreferrer,
+} from './device/constraints_preferrer.js';
+import {DeviceInfoUpdater} from './device/device_info_updater.js';
+import {GalleryButton} from './gallerybutton.js';
+import * as metrics from './metrics.js';
+import * as filesystem from './models/filesystem.js';
+import * as nav from './nav.js';
+import {PerfEvent} from './perf.js';
+import * as state from './state.js';
+import * as tooltip from './tooltip.js';
+import {Mode} from './type.js';
+import * as util from './util.js';
+import {Camera} from './views/camera.js';
+import {CameraIntent} from './views/camera_intent.js';
+import {Dialog} from './views/dialog.js';
+import {
+  BaseSettings,
+  MasterSettings,
+  ResolutionSettings,
+} from './views/settings.js';
+import {ViewName} from './views/view.js';
+import {Warning} from './views/warning.js';
 
 /**
  * Creates the Camera App main object.
- * @implements {cca.bg.ForegroundOps}
+ * @implements {ForegroundOps}
  */
-cca.App = class {
+export class App {
   /**
-   * @param {!cca.bg.BackgroundOps} backgroundOps
+   * @param {!BackgroundOps} backgroundOps
    */
   constructor(backgroundOps) {
     /**
-     * @type {!cca.bg.BackgroundOps}
+     * @type {!BackgroundOps}
      * @private
      */
     this.backgroundOps_ = backgroundOps;
 
     /**
-     * @type {!cca.device.PhotoConstraintsPreferrer}
+     * @type {!PhotoConstraintsPreferrer}
      * @private
      */
-    this.photoPreferrer_ = new cca.device.PhotoConstraintsPreferrer(
-        () => this.cameraView_.start());
+    this.photoPreferrer_ =
+        new PhotoConstraintsPreferrer(() => this.cameraView_.start());
 
     /**
-     * @type {!cca.device.VideoConstraintsPreferrer}
+     * @type {!VideoConstraintsPreferrer}
      * @private
      */
-    this.videoPreferrer_ = new cca.device.VideoConstraintsPreferrer(
-        () => this.cameraView_.start());
+    this.videoPreferrer_ =
+        new VideoConstraintsPreferrer(() => this.cameraView_.start());
 
     /**
-     * @type {!cca.device.DeviceInfoUpdater}
+     * @type {!DeviceInfoUpdater}
      * @private
      */
-    this.infoUpdater_ = new cca.device.DeviceInfoUpdater(
-        this.photoPreferrer_, this.videoPreferrer_);
+    this.infoUpdater_ =
+        new DeviceInfoUpdater(this.photoPreferrer_, this.videoPreferrer_);
 
     /**
-     * @type {!cca.GalleryButton}
+     * @type {!GalleryButton}
      * @private
      */
-    this.galleryButton_ = new cca.GalleryButton();
+    this.galleryButton_ = new GalleryButton();
 
     /**
-     * @type {!cca.views.Camera}
+     * @type {!Camera}
      * @private
      */
     this.cameraView_ = (() => {
       const intent = this.backgroundOps_.getIntent();
       const perfLogger = this.backgroundOps_.getPerfLogger();
       if (intent !== null && intent.shouldHandleResult) {
-        cca.state.set(cca.state.State.SHOULD_HANDLE_INTENT_RESULT, true);
-        return new cca.views.CameraIntent(
+        state.set(state.State.SHOULD_HANDLE_INTENT_RESULT, true);
+        return new CameraIntent(
             intent, this.infoUpdater_, this.photoPreferrer_,
             this.videoPreferrer_, perfLogger);
       } else {
-        const mode = intent !== null ? intent.mode : cca.Mode.PHOTO;
-        return new cca.views.Camera(
+        const mode = intent !== null ? intent.mode : Mode.PHOTO;
+        return new Camera(
             this.galleryButton_, this.infoUpdater_, this.photoPreferrer_,
             this.videoPreferrer_, mode, perfLogger);
       }
@@ -74,22 +98,22 @@
     document.body.addEventListener('keydown', this.onKeyPressed_.bind(this));
 
     document.title = chrome.i18n.getMessage('name');
-    cca.util.setupI18nElements(document.body);
+    util.setupI18nElements(document.body);
     this.setupToggles_();
 
     // Set up views navigation by their DOM z-order.
-    cca.nav.setup([
+    nav.setup([
       this.cameraView_,
-      new cca.views.MasterSettings(),
-      new cca.views.BaseSettings(cca.views.ViewName.GRID_SETTINGS),
-      new cca.views.BaseSettings(cca.views.ViewName.TIMER_SETTINGS),
-      new cca.views.ResolutionSettings(
+      new MasterSettings(),
+      new BaseSettings(ViewName.GRID_SETTINGS),
+      new BaseSettings(ViewName.TIMER_SETTINGS),
+      new ResolutionSettings(
           this.infoUpdater_, this.photoPreferrer_, this.videoPreferrer_),
-      new cca.views.BaseSettings(cca.views.ViewName.PHOTO_RESOLUTION_SETTINGS),
-      new cca.views.BaseSettings(cca.views.ViewName.VIDEO_RESOLUTION_SETTINGS),
-      new cca.views.BaseSettings(cca.views.ViewName.EXPERT_SETTINGS),
-      new cca.views.Warning(),
-      new cca.views.Dialog(cca.views.ViewName.MESSAGE_DIALOG),
+      new BaseSettings(ViewName.PHOTO_RESOLUTION_SETTINGS),
+      new BaseSettings(ViewName.VIDEO_RESOLUTION_SETTINGS),
+      new BaseSettings(ViewName.EXPERT_SETTINGS),
+      new Warning(),
+      new Dialog(ViewName.MESSAGE_DIALOG),
     ]);
 
     this.backgroundOps_.bindForegroundOps(this);
@@ -100,25 +124,23 @@
    * @private
    */
   setupToggles_() {
-    cca.proxy.browserProxy.localStorageGet(
-        {expert: false},
-        ({expert}) => cca.state.set(cca.state.State.EXPERT, expert));
+    browserProxy.localStorageGet(
+        {expert: false}, ({expert}) => state.set(state.State.EXPERT, expert));
     document.querySelectorAll('input').forEach((element) => {
       element.addEventListener(
           'keypress',
-          (event) => cca.util.getShortcutIdentifier(event) === 'Enter' &&
-              element.click());
+          (event) =>
+              util.getShortcutIdentifier(event) === 'Enter' && element.click());
 
       const payload = (element) => ({[element.dataset.key]: element.checked});
       const save = (element) => {
         if (element.dataset.key !== undefined) {
-          cca.proxy.browserProxy.localStorageSet(payload(element));
+          browserProxy.localStorageSet(payload(element));
         }
       };
       element.addEventListener('change', (event) => {
         if (element.dataset.state !== undefined) {
-          cca.state.set(
-              cca.state.assertState(element.dataset.state), element.checked);
+          state.set(state.assertState(element.dataset.state), element.checked);
         }
         if (event.isTrusted) {
           save(element);
@@ -134,10 +156,10 @@
       });
       if (element.dataset.key !== undefined) {
         // Restore the previously saved state on startup.
-        cca.proxy.browserProxy.localStorageGet(
+        browserProxy.localStorageGet(
             payload(element),
-            (values) => cca.util.toggleChecked(
-                cca.assertInstanceof(element, HTMLInputElement),
+            (values) => util.toggleChecked(
+                assertInstanceof(element, HTMLInputElement),
                 values[element.dataset.key]));
       }
     });
@@ -149,11 +171,11 @@
    */
   async start() {
     var ackMigrate = false;
-    cca.models.FileSystem
+    filesystem
         .initialize(() => {
           // Prompt to migrate pictures if needed.
           var message = chrome.i18n.getMessage('migrate_pictures_msg');
-          return cca.nav.open('message-dialog', {message, cancellable: false})
+          return nav.open('message-dialog', {message, cancellable: false})
               .then((acked) => {
                 if (!acked) {
                   throw new Error('no-migrate');
@@ -162,10 +184,10 @@
               });
         })
         .then((external) => {
-          const externalDir = cca.models.FileSystem.getExternalDirectory();
-          cca.assert(externalDir !== null);
+          const externalDir = filesystem.getExternalDirectory();
+          assert(externalDir !== null);
           this.galleryButton_.initialize(externalDir);
-          cca.nav.open(cca.views.ViewName.CAMERA);
+          nav.open(ViewName.CAMERA);
         })
         .catch((error) => {
           console.error(error);
@@ -173,13 +195,13 @@
             chrome.app.window.current().close();
             return;
           }
-          cca.nav.open('warning', 'filesystem-failure');
+          nav.open('warning', 'filesystem-failure');
         })
         .finally(() => {
-          cca.metrics.log(cca.metrics.Type.LAUNCH, ackMigrate);
+          metrics.log(metrics.Type.LAUNCH, ackMigrate);
         });
     const showWindow = (async () => {
-      await cca.util.fitWindow();
+      await util.fitWindow();
       chrome.app.window.current().show();
       this.backgroundOps_.notifyActivation();
     })();
@@ -196,8 +218,8 @@
    * @private
    */
   onKeyPressed_(event) {
-    cca.tooltip.hide();  // Hide shown tooltip on any keypress.
-    cca.nav.onKeyPressed(event);
+    tooltip.hide();  // Hide shown tooltip on any keypress.
+    nav.onKeyPressed(event);
   }
 
   /**
@@ -205,7 +227,7 @@
    * @return {!Promise}
    */
   async suspend() {
-    cca.state.set(cca.state.State.SUSPEND, true);
+    state.set(state.State.SUSPEND, true);
     await this.cameraView_.start();
     chrome.app.window.current().hide();
     this.backgroundOps_.notifySuspension();
@@ -215,47 +237,46 @@
    * Resumes app from suspension and shows app window.
    */
   resume() {
-    cca.state.set(cca.state.State.SUSPEND, false);
+    state.set(state.State.SUSPEND, false);
     chrome.app.window.current().show();
     this.backgroundOps_.notifyActivation();
   }
-};
+}
 
 /**
  * Singleton of the App object.
- * @type {?cca.App}
- * @private
+ * @type {?App}
  */
-cca.App.instance_ = null;
+let instance = null;
 
 /**
  * Creates the App object and starts camera stream.
  */
 document.addEventListener('DOMContentLoaded', async () => {
-  if (cca.App.instance_ !== null) {
+  if (instance !== null) {
     return;
   }
-  cca.assert(window['backgroundOps'] !== undefined);
-  const /** !cca.bg.BackgroundOps */ bgOps = window['backgroundOps'];
+  assert(window['backgroundOps'] !== undefined);
+  const /** !BackgroundOps */ bgOps = window['backgroundOps'];
   const perfLogger = bgOps.getPerfLogger();
 
   // Setup listener for performance events.
   perfLogger.addListener((event, duration, extras) => {
-    cca.metrics.log(cca.metrics.Type.PERF, event, duration, extras);
+    metrics.log(metrics.Type.PERF, event, duration, extras);
   });
-  const states = Object.values(cca.perf.PerfEvent);
-  states.push(cca.state.State.TAKING);
-  states.forEach((state) => {
-    cca.state.addObserver(state, (val, extras) => {
-      let event = state;
-      if (state === cca.state.State.TAKING) {
+  const states = Object.values(PerfEvent);
+  states.push(state.State.TAKING);
+  states.forEach((s) => {
+    state.addObserver(s, (val, extras) => {
+      let event = s;
+      if (s === state.State.TAKING) {
         // 'taking' state indicates either taking photo or video. Skips for
         // video-taking case since we only want to collect the metrics of
         // photo-taking.
-        if (cca.state.get(cca.Mode.VIDEO)) {
+        if (state.get(Mode.VIDEO)) {
           return;
         }
-        event = cca.perf.PerfEvent.PHOTO_TAKING;
+        event = PerfEvent.PHOTO_TAKING;
       }
 
       if (val) {
@@ -265,7 +286,7 @@
       }
     });
   });
-  cca.App.instance_ = new cca.App(
-      /** @type {!cca.bg.BackgroundOps} */ (bgOps));
-  await cca.App.instance_.start();
+  instance = new App(
+      /** @type {!BackgroundOps} */ (bgOps));
+  await instance.start();
 });
diff --git a/chrome/browser/resources/chromeos/camera/src/views/background.html b/chrome/browser/resources/chromeos/camera/src/views/background.html
index 4a4e914..521725a2 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/background.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/background.html
@@ -4,14 +4,10 @@
      found in the LICENSE file. -->
 <html>
   <head>
-    <script src="../js/namespace.js"></script>
     <script src="../js/mojo/mojo_bindings_lite.js"></script>
     <script src="../js/mojo/camera_intent.mojom-lite.js"></script>
     <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script>
-    <script type="module" src="../js/mojo/chrome_helper.js"></script>
-    <script type="module" src="../js/type.js"></script>
-    <script type="module" src="../js/perf.js"></script>
-    <script type="module" src="../js/intent.js"></script>
-    <script defer src="../js/background.js"></script>
+    <script src="../js/namespace.js"></script>
+    <script type="module" src="../js/background.js"></script>
   </head>
 </html>
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html
index d50a7ac..e5d02b3 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/main.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -10,57 +10,18 @@
     <meta charset="utf-8">
     <link rel="stylesheet" href="../css/main.css">
     <script src="../js/namespace.js"></script>
-    <script type="module" src="../js/chrome_util.js"></script>
-    <script type="module" src="../js/browser_proxy/browser_proxy.js"></script>
     <script src="../js/google-analytics-bundle.js"></script>
-    <script type="module" src="../js/type.js"></script>
-    <script type="module" src="../js/perf.js"></script>
-    <script type="module" src="../js/metrics.js"></script>
-    <script type="module" src="../js/intent.js"></script>
-    <script type="module" src="../js/util.js"></script>
-    <script type="module" src="../js/toast.js"></script>
-    <script type="module" src="../js/tooltip.js"></script>
-    <script type="module" src="../js/state.js"></script>
-    <script type="module" src="../js/sound.js"></script>
-    <script type="module" src="../js/device/error.js"></script>
-    <script type="module" src="../js/device/camera3_device_info.js"></script>
-    <script type="module" src="../js/device/constraints_preferrer.js"></script>
-    <script type="module" src="../js/device/device_info_updater.js"></script>
-    <script type="module" src="../js/models/filenamer.js"></script>
-    <script type="module" src="../js/gallerybutton.js"></script>
-    <script type="module" src="../js/models/filesystem.js"></script>
-    <script type="module" src="../js/models/result_saver.js"></script>
-    <script type="module" src="../js/models/video_saver_interface.js"></script>
-    <script type="module" src="../js/models/file_video_saver.js"></script>
-    <script type="module" src="../js/models/intent_video_saver.js"></script>
-    <script defer src="../js/mojo/mojo_bindings_lite.js"></script>
-    <script defer src="../js/mojo/camera_metadata_tags.mojom-lite.js"></script>
-    <script defer src="../js/mojo/camera_metadata.mojom-lite.js"></script>
-    <script defer src="../js/mojo/camera_common.mojom-lite.js"></script>
-    <script defer src="../js/mojo/image_capture.mojom-lite.js"></script>
-    <script defer src="../js/mojo/geometry.mojom-lite.js"></script>
-    <script defer src="../js/mojo/range.mojom-lite.js"></script>
-    <script defer src="../js/mojo/camera_intent.mojom-lite.js"></script>
-    <script defer src="../js/mojo/camera_app.mojom-lite.js"></script>
-    <script defer src="../js/mojo/camera_app_helper.mojom-lite.js"></script>
-    <script type="module" src="../js/mojo/chrome_helper.js"></script>
-    <script type="module" src="../js/mojo/device_operator.js"></script>
-    <script type="module" src="../js/mojo/image_capture.js"></script>
-    <script type="module" src="../js/views/view.js"></script>
-    <script type="module" src="../js/views/camera.js"></script>
-    <script type="module" src="../js/views/camera_intent.js"></script>
-    <script type="module" src="../js/views/camera/layout.js"></script>
-    <script type="module" src="../js/views/camera/options.js"></script>
-    <script type="module" src="../js/views/camera/preview.js"></script>
-    <script type="module" src="../js/views/camera/recordtime.js"></script>
-    <script type="module" src="../js/views/camera/review_result.js"></script>
-    <script type="module" src="../js/views/camera/timertick.js"></script>
-    <script type="module" src="../js/views/camera/modes.js"></script>
-    <script type="module" src="../js/views/dialog.js"></script>
-    <script type="module" src="../js/views/settings.js"></script>
-    <script type="module" src="../js/views/warning.js"></script>
-    <script type="module" src="../js/nav.js"></script>
-    <script defer src="../js/main.js"></script>
+    <script src="../js/mojo/mojo_bindings_lite.js"></script>
+    <script src="../js/mojo/camera_metadata_tags.mojom-lite.js"></script>
+    <script src="../js/mojo/camera_metadata.mojom-lite.js"></script>
+    <script src="../js/mojo/camera_common.mojom-lite.js"></script>
+    <script src="../js/mojo/image_capture.mojom-lite.js"></script>
+    <script src="../js/mojo/geometry.mojom-lite.js"></script>
+    <script src="../js/mojo/range.mojom-lite.js"></script>
+    <script src="../js/mojo/camera_intent.mojom-lite.js"></script>
+    <script src="../js/mojo/camera_app.mojom-lite.js"></script>
+    <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script>
+    <script type="module" src="../js/main.js"></script>
   </head>
   <body class="sound mirror mic _3x3">
     <div id="camera">
diff --git a/chrome/browser/sync/trusted_vault_client_android.cc b/chrome/browser/sync/trusted_vault_client_android.cc
index 002da8b..a1af9f84 100644
--- a/chrome/browser/sync/trusted_vault_client_android.cc
+++ b/chrome/browser/sync/trusted_vault_client_android.cc
@@ -50,6 +50,18 @@
   std::move(cb).Run(converted_keys);
 }
 
+void TrustedVaultClientAndroid::MarkKeysAsStaleCompleted(JNIEnv* env,
+                                                         jboolean result) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(ongoing_mark_keys_as_stale_) << "No ongoing MarkKeysAsStale() request";
+
+  // Make a copy of the callback and reset |ongoing_mark_keys_as_stale_| before
+  // invoking the callback, in case it has side effects.
+  base::OnceCallback<void(bool)> cb = std::move(ongoing_mark_keys_as_stale_);
+
+  std::move(cb).Run(!!result);
+}
+
 std::unique_ptr<TrustedVaultClientAndroid::Subscription>
 TrustedVaultClientAndroid::AddKeysChangedObserver(
     const base::RepeatingClosure& cb) {
@@ -62,6 +74,8 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(!ongoing_fetch_keys_)
       << "Only one FetchKeys() request is allowed at any time";
+  DCHECK(!ongoing_mark_keys_as_stale_)
+      << "FetchKeys() not allowed while ongoing MarkKeysAsStale()";
 
   // Store for later completion when Java invokes FetchKeysCompleted().
   ongoing_fetch_keys_ =
@@ -83,3 +97,25 @@
   // Not supported on Android, where keys are fetched outside the browser.
   NOTREACHED();
 }
+
+void TrustedVaultClientAndroid::MarkKeysAsStale(
+    const std::string& gaia_id,
+    base::OnceCallback<void(bool)> cb) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(cb);
+  DCHECK(!ongoing_mark_keys_as_stale_)
+      << "Only one MarkKeysAsStale() request is allowed at any time";
+  DCHECK(!ongoing_fetch_keys_)
+      << "MarkKeysAsStale() not allowed while ongoing FetchKeys()";
+
+  // Store for later completion when Java invokes MarkKeysAsStaleCompleted().
+  ongoing_mark_keys_as_stale_ = std::move(cb);
+
+  JNIEnv* const env = base::android::AttachCurrentThread();
+  const base::android::ScopedJavaLocalRef<jstring> java_gaia_id =
+      base::android::ConvertUTF8ToJavaString(env, gaia_id);
+
+  // The Java implementation will eventually call MarkKeysAsStaleCompleted().
+  Java_TrustedVaultClient_markKeysAsStale(env, reinterpret_cast<intptr_t>(this),
+                                          java_gaia_id);
+}
diff --git a/chrome/browser/sync/trusted_vault_client_android.h b/chrome/browser/sync/trusted_vault_client_android.h
index c371f86..0141e4e 100644
--- a/chrome/browser/sync/trusted_vault_client_android.h
+++ b/chrome/browser/sync/trusted_vault_client_android.h
@@ -36,6 +36,11 @@
       const base::android::JavaParamRef<jstring>& gaia_id,
       const base::android::JavaParamRef<jobjectArray>& keys);
 
+  // Called from Java to notify the completion of MarkKeysAsStale()
+  // operation previously initiated from C++. This must correspond to an
+  // ongoing MarkKeysAsStale() request.
+  void MarkKeysAsStaleCompleted(JNIEnv* env, jboolean result);
+
   // TrustedVaultClient implementation.
   std::unique_ptr<Subscription> AddKeysChangedObserver(
       const base::RepeatingClosure& cb) override;
@@ -45,6 +50,8 @@
       override;
   void StoreKeys(const std::string& gaia_id,
                  const std::vector<std::vector<uint8_t>>& keys) override;
+  void MarkKeysAsStale(const std::string& gaia_id,
+                       base::OnceCallback<void(bool)> cb) override;
 
  private:
   // Struct representing an in-flight FetchKeys() call invoked from C++.
@@ -62,6 +69,10 @@
   // Null if no in-flight FetchKeys().
   std::unique_ptr<OngoingFetchKeys> ongoing_fetch_keys_;
 
+  // Completion callback of an in-flight MarkKeysAsStale() call invoked from
+  // C++.
+  base::OnceCallback<void(bool)> ongoing_mark_keys_as_stale_;
+
   CallbackList observer_list_;
 };
 
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index ae32bcd..dbc4bdb 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3890,6 +3890,9 @@
       <message name="IDS_PREFS_AUTOFILL_ASSISTANT_SWITCH" desc="Title for the switch toggling whether Autofill Assistant is enabled. [CHAR-LIMIT=32]">
         Assistant Triggered Checkout
       </message>
+      <message name="IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY" desc="Description for the Autofill Assistant toggle.">
+       To complete tasks on the web via Google Assistant, Chrome sends a site's URL, site content, and relevant personal information to Google
+      </message>
       <!-- Usage Stats strings -->
       <message name="IDS_USAGE_STATS_CONSENT_TITLE" desc="Title for activity authorizing Digital Wellbeing to access Chrome usage data">
         Show your Chrome activity in Digital Wellbeing?
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1
new file mode 100644
index 0000000..21d0737
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_AUTOFILL_ASSISTANT_SUMMARY.png.sha1
@@ -0,0 +1 @@
+24bb6483881babd5d1fe4008947d4e34b289d6e9
\ No newline at end of file
diff --git a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
index 8936a013..a95f9ed 100644
--- a/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
+++ b/chrome/browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc
@@ -94,16 +94,6 @@
   }
 
   bool LaunchFlashFullscreenInSubframe() {
-    // Start the embedded test server and set it up to serve PPAPI test case
-    // URLs.
-    base::FilePath document_root;
-    EXPECT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root));
-    embedded_test_server()->AddDefaultHandlers(document_root);
-    if (!embedded_test_server()->Start()) {
-      ADD_FAILURE() << "Failed to launch embedded test server.";
-      return false;
-    }
-
     // Load a page with an <iframe> that points to the test case URL, which
     // runs the simulated fullscreen Flash plugin.  In OOPIF modes, the frame
     // will render in a separate process.  Block until the plugin has completed
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
index dd5237e..f0c7abc 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.cc
@@ -301,20 +301,19 @@
   return specifics;
 }
 
-std::unique_ptr<syncer::UpdateResponseData>
-RecentTabsBuilderTestHelper::BuildUpdateResponseData(
+syncer::UpdateResponseData RecentTabsBuilderTestHelper::BuildUpdateResponseData(
     const sync_pb::SessionSpecifics& specifics,
     base::Time timestamp) {
-  auto entity = std::make_unique<syncer::EntityData>();
-  *entity->specifics.mutable_session() = specifics;
-  entity->creation_time = timestamp;
-  entity->modification_time = timestamp;
-  entity->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+  syncer::EntityData entity;
+  *entity.specifics.mutable_session() = specifics;
+  entity.creation_time = timestamp;
+  entity.modification_time = timestamp;
+  entity.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
       syncer::SESSIONS, sync_sessions::SessionStore::GetClientTag(specifics));
-  entity->id = entity->client_tag_hash.value();
+  entity.id = entity.client_tag_hash.value();
 
-  auto update = std::make_unique<syncer::UpdateResponseData>();
-  update->entity = std::move(entity);
-  update->response_version = ++next_response_version_;
+  syncer::UpdateResponseData update;
+  update.entity = std::move(entity);
+  update.response_version = ++next_response_version_;
   return update;
 }
diff --git a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h
index b8dae09..17cacd5 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h
+++ b/chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h
@@ -67,7 +67,7 @@
   sync_pb::SessionSpecifics BuildTabSpecifics(int session_index,
                                               int window_index,
                                               int tab_index);
-  std::unique_ptr<syncer::UpdateResponseData> BuildUpdateResponseData(
+  syncer::UpdateResponseData BuildUpdateResponseData(
       const sync_pb::SessionSpecifics& specifics,
       base::Time timestamp);
 
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
index 6f11796..a6dea5bf 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -300,6 +300,9 @@
       readable_paths_model_({}, usage_.readable_directories) {
   DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_DONE));
+  DialogDelegate::set_button_label(
+      ui::DIALOG_BUTTON_CANCEL,
+      l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS));
 }
 
 NativeFileSystemUsageBubbleView::~NativeFileSystemUsageBubbleView() = default;
@@ -317,14 +320,6 @@
       ->GetTextForTooltipAndAccessibleName();
 }
 
-base::string16 NativeFileSystemUsageBubbleView::GetDialogButtonLabel(
-    ui::DialogButton button) const {
-  int message_id = IDS_DONE;
-  if (button == ui::DIALOG_BUTTON_CANCEL)
-    message_id = IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS;
-  return l10n_util::GetStringUTF16(message_id);
-}
-
 bool NativeFileSystemUsageBubbleView::ShouldShowCloseButton() const {
   return true;
 }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
index da9cf5e..32c8982 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
@@ -61,7 +61,6 @@
 
   // LocationBarBubbleDelegateView:
   base::string16 GetAccessibleWindowTitle() const override;
-  base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
   bool ShouldShowCloseButton() const override;
   void Init() override;
   bool Cancel() override;
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
index d7c124c..e98c39c7 100644
--- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
+++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -59,6 +59,10 @@
         platform_util::GetViewForWindow(browser->window()->GetNativeWindow()));
   }
   DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::set_button_label(
+      ui::DIALOG_BUTTON_OK,
+      l10n_util::GetStringUTF16(
+          IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL));
 }
 
 base::string16 StoragePressureBubbleView::GetWindowTitle() const {
@@ -80,14 +84,6 @@
   return true;
 }
 
-base::string16 StoragePressureBubbleView::GetDialogButtonLabel(
-    ui::DialogButton button) const {
-  if (button == ui::DIALOG_BUTTON_OK)
-    return l10n_util::GetStringUTF16(
-        IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL);
-  return views::DialogDelegateView::GetDialogButtonLabel(button);
-}
-
 void StoragePressureBubbleView::Init() {
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
index dfc6e528..6769d83 100644
--- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
+++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
@@ -24,7 +24,6 @@
   base::string16 GetWindowTitle() const override;
   bool Accept() override;
   bool Close() override;
-  base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
 
   // views::BubbleDialogDelegateView:
   void Init() override;
diff --git a/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc b/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc
index 8fe5ad2..28b531b4 100644
--- a/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc
+++ b/chrome/browser/web_applications/web_app_sync_bridge_unittest.cc
@@ -140,11 +140,11 @@
   switch (change_type) {
     case syncer::EntityChange::ACTION_ADD:
       entity_change = syncer::EntityChange::CreateAdd(
-          app.app_id(), CreateSyncEntityData(app));
+          app.app_id(), std::move(*CreateSyncEntityData(app)));
       break;
     case syncer::EntityChange::ACTION_UPDATE:
       entity_change = syncer::EntityChange::CreateUpdate(
-          app.app_id(), CreateSyncEntityData(app));
+          app.app_id(), std::move(*CreateSyncEntityData(app)));
       break;
     case syncer::EntityChange::ACTION_DELETE:
       entity_change = syncer::EntityChange::CreateDelete(app.app_id());
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index e132af655..6c090b9 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -239,6 +239,8 @@
 
   callback IsArcProvisionedCallback = void (boolean arcProvisioned);
 
+  callback IsArcPackageListInitialRefreshedCallback = void (boolean refreshed);
+
   dictionary ArcAppDict {
     DOMString name;
     DOMString packageName;
@@ -662,6 +664,11 @@
         long timeout_s,
         AssistantQueryStatusCallback callback);
 
+    // Whether the local list of installed ARC packages has been refreshed for
+    // the first time after user login.
+    static void isArcPackageListInitialRefreshed(
+        IsArcPackageListInitialRefreshedCallback callback);
+
     // Set value for the specified user pref in the pref tree.
     static void setWhitelistedPref(DOMString pref_name, any value,
                                    VoidCallback callback);
diff --git a/chrome/services/keymaster/public/mojom/BUILD.gn b/chrome/services/keymaster/public/mojom/BUILD.gn
new file mode 100644
index 0000000..d49f4c27
--- /dev/null
+++ b/chrome/services/keymaster/public/mojom/BUILD.gn
@@ -0,0 +1,17 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+assert(is_chromeos)
+
+mojom("mojom") {
+  sources = [
+    "cert_store.mojom",
+  ]
+
+  public_deps = [
+    "//mojo/public/mojom/base",
+  ]
+}
diff --git a/chrome/services/keymaster/public/mojom/OWNERS b/chrome/services/keymaster/public/mojom/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/chrome/services/keymaster/public/mojom/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/services/keymaster/public/mojom/cert_store.mojom b/chrome/services/keymaster/public/mojom/cert_store.mojom
new file mode 100644
index 0000000..976d21e9
--- /dev/null
+++ b/chrome/services/keymaster/public/mojom/cert_store.mojom
@@ -0,0 +1,63 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Next MinVersion: 1
+
+// This file defines the mojo interface between arc-keymaster and Chrome for the
+// keys hardware-backed and accessible by Chrome.
+
+module arc.keymaster.mojom;
+
+// Enumerates the crypto algorithms supported by Host.
+[Extensible]
+enum Algorithm {
+  kRsaPkcs1,
+};
+
+// Enumerates the digests supported by Host.
+[Extensible]
+enum Digest {
+  kSha1,
+  kSha256,
+  kSha384,
+  kSha512,
+};
+
+// Enumerates the result codes of signature operation.
+[Extensible]
+enum SignatureResult {
+  kOk,
+  // Failed with error.
+  kFailed,
+  // Inspect Chrome's logs for the exact net::Error.
+  kNetError,
+  kUnsupportedAlgorithm,
+};
+
+// Interface exposed by Chrome.
+// Next method ID: 1
+interface CertStoreHost {
+  // Returns an interface to SecurityTokenOperation.
+  GetSecurityTokenOperation@0(SecurityTokenOperation& operation) => ();
+};
+
+// Interface exposed by arc-keymaster daemon.
+// Next method ID: 1
+interface CertStoreInstance {
+  // Establishes full-duplex communication with the host.
+  Init@0(CertStoreHost host_ptr) => ();
+};
+
+// Implemented in Chrome.
+// Next method ID: 1
+interface SecurityTokenOperation {
+  // Signs input |data| pre-hashed with the given |digest|.
+  // Retrieves a |signature| signed by a certificate identified by
+  // |subject_public_key_info| by |algorithm| (currently, only RSA is
+  // supported).
+  // In case of any error, |signature| is null.
+  SignDigest@0(string subject_public_key_info, Algorithm algorithm,
+       Digest digest, array<uint8> data) => (SignatureResult result,
+           array<uint8>? signature);
+};
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 00dd673..1b746a4 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4294,6 +4294,7 @@
       "../browser/metrics/perf/profile_provider_chromeos_unittest.cc",
       "../browser/metrics/perf/windowed_incognito_observer_unittest.cc",
       "../browser/notifications/chrome_ash_message_center_client_unittest.cc",
+      "../browser/notifications/web_page_notifier_controller_unittest.cc",
       "../browser/signin/signin_error_notifier_ash_unittest.cc",
       "../browser/speech/tts_chromeos_unittest.cc",
       "../browser/sync/sync_error_notifier_ash_unittest.cc",
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index 01cb0b9..7bc18b97 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -31,6 +31,7 @@
 #include "components/nacl/common/buildflags.h"
 #include "components/nacl/common/nacl_switches.h"
 #include "content/public/browser/network_service_instance.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/network_service_util.h"
@@ -47,6 +48,7 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "net/base/net_errors.h"
+#include "net/base/network_isolation_key.h"
 #include "net/dns/public/resolve_error_info.h"
 #include "net/ssl/ssl_info.h"
 #include "ppapi/shared_impl/test_utils.h"
@@ -57,6 +59,7 @@
 #include "services/network/public/mojom/tcp_socket.mojom.h"
 #include "services/network/public/mojom/tls_socket.mojom.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
+#include "services/network/test/test_dns_util.h"
 #include "services/network/test/test_network_context.h"
 
 #if defined(OS_MACOSX)
@@ -1270,13 +1273,55 @@
 TEST_PPAPI_NACL_DISALLOWED_SOCKETS(TCPSocketPrivateDisallowed)
 TEST_PPAPI_NACL_DISALLOWED_SOCKETS(UDPSocketPrivateDisallowed)
 
-// HostResolver and HostResolverPrivate tests.
-#define RUN_HOST_RESOLVER_SUBTESTS \
-  RunTestViaHTTP( \
-      LIST_TEST(HostResolver_Empty) \
-      LIST_TEST(HostResolver_Resolve) \
-      LIST_TEST(HostResolver_ResolveIPv4) \
-  )
+// Checks that a hostname used by the HostResolver tests ("host_resolver.test")
+// is present in the DNS cache with the NetworkIsolationKey associated with the
+// foreground WebContents - this is needed so as not to leak what hostnames were
+// looked up across tabs with different first party origins.
+void CheckTestHostNameUsedWithCorrectNetworkIsolationKey(Browser* browser) {
+  network::mojom::NetworkContext* network_context =
+      content::BrowserContext::GetDefaultStoragePartition(browser->profile())
+          ->GetNetworkContext();
+  const net::HostPortPair kHostPortPair(
+      net::HostPortPair("host_resolver.test", 80));
+
+  network::mojom::ResolveHostParametersPtr params =
+      network::mojom::ResolveHostParameters::New();
+  // Cache only lookup.
+  params->source = net::HostResolverSource::LOCAL_ONLY;
+  // Match the parameters used by the test.
+  params->include_canonical_name = true;
+  net::NetworkIsolationKey network_isolation_key =
+      browser->tab_strip_model()
+          ->GetActiveWebContents()
+          ->GetMainFrame()
+          ->GetNetworkIsolationKey();
+  network::DnsLookupResult result1 = network::BlockingDnsLookup(
+      network_context, kHostPortPair, std::move(params), network_isolation_key);
+  EXPECT_EQ(net::OK, result1.error);
+  ASSERT_TRUE(result1.resolved_addresses.has_value());
+  ASSERT_EQ(1u, result1.resolved_addresses->size());
+  EXPECT_EQ(browser->tab_strip_model()->GetActiveWebContents()->GetURL().host(),
+            result1.resolved_addresses.value()[0].ToStringWithoutPort());
+
+  // Check that the entry isn't present in the cache with the empty
+  // NetworkIsolationKey().
+  params = network::mojom::ResolveHostParameters::New();
+  // Cache only lookup.
+  params->source = net::HostResolverSource::LOCAL_ONLY;
+  // Match the parameters used by the test.
+  params->include_canonical_name = true;
+  network::DnsLookupResult result2 =
+      network::BlockingDnsLookup(network_context, kHostPortPair,
+                                 std::move(params), net::NetworkIsolationKey());
+  EXPECT_EQ(net::ERR_DNS_CACHE_MISS, result2.error);
+}
+
+// HostResolver and HostResolverPrivate tests. The PPAPI code used by these
+// tests is in ppapi/tests/test_host_resolver.cc.
+#define RUN_HOST_RESOLVER_SUBTESTS                                             \
+  RunTestViaHTTP(LIST_TEST(HostResolver_Empty) LIST_TEST(HostResolver_Resolve) \
+                     LIST_TEST(HostResolver_ResolveIPv4));                     \
+  CheckTestHostNameUsedWithCorrectNetworkIsolationKey(browser())
 
 IN_PROC_BROWSER_TEST_F(OutOfProcessPPAPITest, HostResolverCrash_Basic) {
   if (content::IsInProcessNetworkService())
diff --git a/chrome/test/ppapi/ppapi_test.cc b/chrome/test/ppapi/ppapi_test.cc
index 99981c203..d0b987f 100644
--- a/chrome/test/ppapi/ppapi_test.cc
+++ b/chrome/test/ppapi/ppapi_test.cc
@@ -34,7 +34,9 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/ppapi_test_utils.h"
 #include "media/base/media_switches.h"
+#include "net/base/features.h"
 #include "net/base/filename_util.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
 #include "net/test/test_data_directory.h"
 #include "ppapi/shared_impl/ppapi_switches.h"
@@ -132,9 +134,21 @@
 }
 
 PPAPITestBase::PPAPITestBase() {
+  // These are needed to test that the right NetworkIsolationKey is used.
+  scoped_feature_list_.InitWithFeatures(
+      // enabled_features
+      {net::features::kSplitHostCacheByNetworkIsolationKey,
+       net::features::kPartitionConnectionsByNetworkIsolationKey},
+      // disabled_features
+      {});
 }
 
 void PPAPITestBase::SetUp() {
+  base::FilePath document_root;
+  ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root));
+  embedded_test_server()->AddDefaultHandlers(document_root);
+  ASSERT_TRUE(embedded_test_server()->Start());
+
   EnablePixelOutput();
   InProcessBrowserTest::SetUp();
 }
@@ -149,6 +163,14 @@
 }
 
 void PPAPITestBase::SetUpOnMainThread() {
+  host_resolver()->AddRuleWithFlags(
+      "host_resolver.test", embedded_test_server()->host_port_pair().host(),
+      net::HOST_RESOLVER_CANONNAME);
+
+  SetUpPPAPIBroker();
+}
+
+void PPAPITestBase::SetUpPPAPIBroker() {
   // Always allow access to the PPAPI broker.
   HostContentSettingsMapFactory::GetForProfile(browser()->profile())
       ->SetDefaultContentSetting(ContentSettingsType::PPAPI_BROKER,
@@ -182,47 +204,32 @@
 void PPAPITestBase::RunTestViaHTTP(const std::string& test_case) {
   base::FilePath document_root;
   ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root));
-  net::EmbeddedTestServer http_server;
-  http_server.AddDefaultHandlers(document_root);
-  ASSERT_TRUE(http_server.Start());
-  RunTestURL(GetTestURL(http_server, test_case, std::string()));
+  RunTestURL(GetTestURL(*embedded_test_server(), test_case, std::string()));
 }
 
 void PPAPITestBase::RunTestWithSSLServer(const std::string& test_case) {
   base::FilePath http_document_root;
   ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&http_document_root));
-  net::EmbeddedTestServer http_server;
-  http_server.AddDefaultHandlers(http_document_root);
   net::EmbeddedTestServer ssl_server(net::EmbeddedTestServer::TYPE_HTTPS);
   ssl_server.AddDefaultHandlers(http_document_root);
-
-  ASSERT_TRUE(http_server.Start());
   ASSERT_TRUE(ssl_server.Start());
 
   uint16_t port = ssl_server.host_port_pair().port();
-  RunTestURL(GetTestURL(http_server,
-                        test_case,
+  RunTestURL(GetTestURL(*embedded_test_server(), test_case,
                         base::StringPrintf("ssl_server_port=%d", port)));
 }
 
 void PPAPITestBase::RunTestWithWebSocketServer(const std::string& test_case) {
-  base::FilePath http_document_root;
-  ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&http_document_root));
-  net::EmbeddedTestServer http_server;
-  http_server.AddDefaultHandlers(http_document_root);
   net::SpawnedTestServer ws_server(net::SpawnedTestServer::TYPE_WS,
                                    net::GetWebSocketTestDataDirectory());
-  ASSERT_TRUE(http_server.Start());
   ASSERT_TRUE(ws_server.Start());
 
   std::string host = ws_server.host_port_pair().HostForURL();
   uint16_t port = ws_server.host_port_pair().port();
-  RunTestURL(GetTestURL(http_server,
-                        test_case,
-                        base::StringPrintf(
-                            "websocket_host=%s&websocket_port=%d",
-                            host.c_str(),
-                            port)));
+  RunTestURL(
+      GetTestURL(*embedded_test_server(), test_case,
+                 base::StringPrintf("websocket_host=%s&websocket_port=%d",
+                                    host.c_str(), port)));
 }
 
 void PPAPITestBase::RunTestIfAudioOutputAvailable(
@@ -319,8 +326,7 @@
 #endif
 }
 
-void PPAPINaClTest::SetUpOnMainThread() {
-}
+void PPAPINaClTest::SetUpPPAPIBroker() {}
 
 void PPAPINaClTest::RunTest(const std::string& test_case) {
 #if BUILDFLAG(ENABLE_NACL)
@@ -436,7 +442,7 @@
                             test_case.c_str());
 }
 
-void PPAPIBrokerInfoBarTest::SetUpOnMainThread() {
+void PPAPIBrokerInfoBarTest::SetUpPPAPIBroker() {
   // The default content setting for the PPAPI broker is ASK. We purposefully
-  // don't call PPAPITestBase::SetUpOnMainThread() to keep it that way.
+  // don't call PPAPITestBase::SetUpPPAPIBroker() to keep it that way.
 }
diff --git a/chrome/test/ppapi/ppapi_test.h b/chrome/test/ppapi/ppapi_test.h
index 744e79d6..838e2b0 100644
--- a/chrome/test/ppapi/ppapi_test.h
+++ b/chrome/test/ppapi/ppapi_test.h
@@ -44,6 +44,8 @@
   void SetUpCommandLine(base::CommandLine* command_line) override;
   void SetUpOnMainThread() override;
 
+  virtual void SetUpPPAPIBroker();
+
   virtual std::string BuildQuery(const std::string& base,
                                  const std::string& test_case) = 0;
 
@@ -132,8 +134,8 @@
 class PPAPINaClTest : public PPAPITestBase {
  public:
   void SetUpCommandLine(base::CommandLine* command_line) override;
-  void SetUpOnMainThread() override;
   // PPAPITestBase overrides.
+  void SetUpPPAPIBroker() override;
   void RunTest(const std::string& test_case) override;
   void RunTestViaHTTP(const std::string& test_case) override;
   void RunTestWithSSLServer(const std::string& test_case) override;
@@ -205,7 +207,7 @@
 class PPAPIBrokerInfoBarTest : public OutOfProcessPPAPITest {
  public:
   // PPAPITestBase override:
-  void SetUpOnMainThread() override;
+  void SetUpPPAPIBroker() override;
 };
 
 #endif  // CHROME_TEST_PPAPI_PPAPI_TEST_H_
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
index f263deb..9991cb95 100644
--- a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
+++ b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -43,13 +43,13 @@
 const char kSsidMeow[] = "meow";
 const char kSsidWoof[] = "woof";
 
-std::unique_ptr<syncer::EntityData> GenerateWifiEntityData(
+syncer::EntityData GenerateWifiEntityData(
     const sync_pb::WifiConfigurationSpecificsData& data) {
-  auto entity_data = std::make_unique<syncer::EntityData>();
-  entity_data->specifics.mutable_wifi_configuration()
+  syncer::EntityData entity_data;
+  entity_data.specifics.mutable_wifi_configuration()
       ->mutable_client_only_encrypted_data()
       ->CopyFrom(data);
-  entity_data->name = data.hex_ssid();
+  entity_data.name = data.hex_ssid();
   return entity_data;
 }
 
@@ -113,13 +113,13 @@
       const std::vector<WifiConfigurationSpecificsData>& specifics_list) {
     syncer::EntityChangeList changes;
     for (const auto& data : specifics_list) {
-      auto entity_data = std::make_unique<syncer::EntityData>();
+      syncer::EntityData entity_data;
       sync_pb::WifiConfigurationSpecifics specifics;
 
       specifics.mutable_client_only_encrypted_data()->CopyFrom(data);
-      entity_data->specifics.mutable_wifi_configuration()->CopyFrom(specifics);
+      entity_data.specifics.mutable_wifi_configuration()->CopyFrom(specifics);
 
-      entity_data->name = data.hex_ssid();
+      entity_data.name = data.hex_ssid();
 
       changes.push_back(syncer::EntityChange::CreateAdd(
           data.hex_ssid(), std::move(entity_data)));
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index cefdc43..44933bf 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-81-3987.18-1578309018-benchmark-81.0.4016.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-airmont-81-3987.18-1578309018-benchmark-81.0.4019.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/profiles/silvermont.afdo.newest.txt b/chromeos/profiles/silvermont.afdo.newest.txt
index 730ee9d4..dfed4008 100644
--- a/chromeos/profiles/silvermont.afdo.newest.txt
+++ b/chromeos/profiles/silvermont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-silvermont-81-3987.18-1578307131-benchmark-81.0.4016.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-silvermont-81-3987.18-1578307131-benchmark-81.0.4019.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index df59239..a03c956c 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -41,8 +41,6 @@
     "intent_helper/link_handler_model.cc",
     "intent_helper/link_handler_model.h",
     "intent_helper/open_url_delegate.h",
-    "keymaster/arc_keymaster_bridge.cc",
-    "keymaster/arc_keymaster_bridge.h",
     "lock_screen/arc_lock_screen_bridge.cc",
     "lock_screen/arc_lock_screen_bridge.h",
     "metrics/arc_metrics_service.cc",
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
index 66e412c..d559076 100644
--- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge_unittest.cc
@@ -220,13 +220,13 @@
   }
 
   std::string GetClientTag(const AutofillSpecifics& specifics) {
-    std::string tag = bridge()->GetClientTag(*SpecificsToEntity(specifics));
+    std::string tag = bridge()->GetClientTag(SpecificsToEntity(specifics));
     EXPECT_FALSE(tag.empty());
     return tag;
   }
 
   std::string GetStorageKey(const AutofillSpecifics& specifics) {
-    std::string key = bridge()->GetStorageKey(*SpecificsToEntity(specifics));
+    std::string key = bridge()->GetStorageKey(SpecificsToEntity(specifics));
     EXPECT_FALSE(key.empty());
     return key;
   }
@@ -241,19 +241,18 @@
     return changes;
   }
 
-  std::unique_ptr<EntityData> SpecificsToEntity(
-      const AutofillSpecifics& specifics) {
-    auto data = std::make_unique<EntityData>();
-    *data->specifics.mutable_autofill() = specifics;
-    data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
-        syncer::AUTOFILL, bridge()->GetClientTag(*data));
+  EntityData SpecificsToEntity(const AutofillSpecifics& specifics) {
+    EntityData data;
+    *data.specifics.mutable_autofill() = specifics;
+    data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+        syncer::AUTOFILL, bridge()->GetClientTag(data));
     return data;
   }
 
-  std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse(
+  syncer::UpdateResponseData SpecificsToUpdateResponse(
       const AutofillSpecifics& specifics) {
-    auto data = std::make_unique<syncer::UpdateResponseData>();
-    data->entity = SpecificsToEntity(specifics);
+    syncer::UpdateResponseData data;
+    data.entity = SpecificsToEntity(specifics);
     return data;
   }
 
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
index 0ebf17d..de79851 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
@@ -292,19 +292,18 @@
     return data;
   }
 
-  std::unique_ptr<EntityData> SpecificsToEntity(
-      const AutofillProfileSpecifics& specifics) {
-    auto data = std::make_unique<EntityData>();
-    *data->specifics.mutable_autofill_profile() = specifics;
-    data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
-        syncer::AUTOFILL_PROFILE, bridge()->GetClientTag(*data));
+  EntityData SpecificsToEntity(const AutofillProfileSpecifics& specifics) {
+    EntityData data;
+    *data.specifics.mutable_autofill_profile() = specifics;
+    data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+        syncer::AUTOFILL_PROFILE, bridge()->GetClientTag(data));
     return data;
   }
 
-  std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse(
+  syncer::UpdateResponseData SpecificsToUpdateResponse(
       const AutofillProfileSpecifics& specifics) {
-    auto data = std::make_unique<syncer::UpdateResponseData>();
-    data->entity = SpecificsToEntity(specifics);
+    syncer::UpdateResponseData data;
+    data.entity = SpecificsToEntity(specifics);
     return data;
   }
 
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc b/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc
index 39e44a9a..52e23a4 100644
--- a/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_util_unittest.cc
@@ -46,12 +46,11 @@
   DISALLOW_COPY_AND_ASSIGN(TestAutofillTable);
 };
 
-std::unique_ptr<EntityData> SpecificsToEntity(
-    const sync_pb::AutofillWalletSpecifics& specifics,
-    const std::string& client_tag) {
-  auto data = std::make_unique<syncer::EntityData>();
-  *data->specifics.mutable_autofill_wallet() = specifics;
-  data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+EntityData SpecificsToEntity(const sync_pb::AutofillWalletSpecifics& specifics,
+                             const std::string& client_tag) {
+  syncer::EntityData data;
+  *data.specifics.mutable_autofill_wallet() = specifics;
+  data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
       syncer::AUTOFILL_WALLET_DATA, client_tag);
   return data;
 }
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
index 23f973c..fed8e9a 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
@@ -348,28 +348,27 @@
     real_processor_->OnUpdateReceived(state, std::move(updates));
   }
 
-  std::unique_ptr<EntityData> SpecificsToEntity(
-      const WalletMetadataSpecifics& specifics,
-      bool is_deleted = false) {
-    auto data = std::make_unique<EntityData>();
-    *data->specifics.mutable_wallet_metadata() = specifics;
-    data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
-        syncer::AUTOFILL_WALLET_METADATA, bridge()->GetClientTag(*data));
+  EntityData SpecificsToEntity(const WalletMetadataSpecifics& specifics,
+                               bool is_deleted = false) {
+    EntityData data;
+    *data.specifics.mutable_wallet_metadata() = specifics;
+    data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+        syncer::AUTOFILL_WALLET_METADATA, bridge()->GetClientTag(data));
     if (is_deleted) {
       // Specifics had to be set in order to generate the client tag. Since
       // deleted entity is defined by specifics being empty, we need to clear
       // them now.
-      data->specifics = sync_pb::EntitySpecifics();
+      data.specifics = sync_pb::EntitySpecifics();
     }
     return data;
   }
 
-  std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse(
+  syncer::UpdateResponseData SpecificsToUpdateResponse(
       const WalletMetadataSpecifics& specifics,
       bool is_deleted = false) {
-    auto data = std::make_unique<syncer::UpdateResponseData>();
-    data->entity = SpecificsToEntity(specifics, is_deleted);
-    data->response_version = response_version;
+    syncer::UpdateResponseData data;
+    data.entity = SpecificsToEntity(specifics, is_deleted);
+    data.response_version = response_version;
     return data;
   }
 
@@ -467,7 +466,7 @@
   ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kAddr1SyncTag);
 }
 
@@ -475,7 +474,7 @@
   ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForCard(kCard1SpecificsId);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kCard1SyncTag);
 }
 
@@ -484,7 +483,7 @@
   ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)),
             GetAddressStorageKey(kAddr1SpecificsId));
 }
 
@@ -492,7 +491,7 @@
   ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForCard(kCard1SpecificsId);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)),
             GetCardStorageKey(kCard1SpecificsId));
 }
 
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
index 69d194b..03e489c 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -278,12 +278,11 @@
     EXPECT_EQ(addresses_count, addresses_metadata.size());
   }
 
-  std::unique_ptr<EntityData> SpecificsToEntity(
-      const AutofillWalletSpecifics& specifics) {
-    auto data = std::make_unique<EntityData>();
-    *data->specifics.mutable_autofill_wallet() = specifics;
-    data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
-        syncer::AUTOFILL_WALLET_DATA, bridge()->GetClientTag(*data));
+  EntityData SpecificsToEntity(const AutofillWalletSpecifics& specifics) {
+    EntityData data;
+    *data.specifics.mutable_autofill_wallet() = specifics;
+    data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+        syncer::AUTOFILL_WALLET_DATA, bridge()->GetClientTag(data));
     return data;
   }
 
@@ -300,10 +299,10 @@
     return data;
   }
 
-  std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse(
+  syncer::UpdateResponseData SpecificsToUpdateResponse(
       const AutofillWalletSpecifics& specifics) {
-    auto data = std::make_unique<syncer::UpdateResponseData>();
-    data->entity = SpecificsToEntity(specifics);
+    syncer::UpdateResponseData data;
+    data.entity = SpecificsToEntity(specifics);
     return data;
   }
 
@@ -335,14 +334,14 @@
 TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForAddress) {
   AutofillWalletSpecifics specifics =
       CreateAutofillWalletSpecificsForAddress(kAddr1ClientTag);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kAddr1ClientTag);
 }
 
 TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForCard) {
   AutofillWalletSpecifics specifics =
       CreateAutofillWalletSpecificsForCard(kCard1ClientTag);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kCard1ClientTag);
 }
 
@@ -350,7 +349,7 @@
   AutofillWalletSpecifics specifics =
       CreateAutofillWalletSpecificsForPaymentsCustomerData(
           kCustomerDataClientTag);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kCustomerDataClientTag);
 }
 
@@ -358,7 +357,7 @@
   AutofillWalletSpecifics specifics =
       CreateAutofillWalletSpecificsForCreditCardCloudTokenData(
           kCloudTokenDataClientTag);
-  EXPECT_EQ(bridge()->GetClientTag(*SpecificsToEntity(specifics)),
+  EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
             kCloudTokenDataClientTag);
 }
 
@@ -366,14 +365,14 @@
 TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForAddress) {
   AutofillWalletSpecifics specifics1 =
       CreateAutofillWalletSpecificsForAddress(kAddr1ClientTag);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics1)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics1)),
             kAddr1ClientTag);
 }
 
 TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForCard) {
   AutofillWalletSpecifics specifics2 =
       CreateAutofillWalletSpecificsForCard(kCard1ClientTag);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics2)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics2)),
             kCard1ClientTag);
 }
 
@@ -381,7 +380,7 @@
   AutofillWalletSpecifics specifics3 =
       CreateAutofillWalletSpecificsForPaymentsCustomerData(
           kCustomerDataClientTag);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics3)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics3)),
             kCustomerDataClientTag);
 }
 
@@ -389,7 +388,7 @@
   AutofillWalletSpecifics specifics4 =
       CreateAutofillWalletSpecificsForCreditCardCloudTokenData(
           kCloudTokenDataClientTag);
-  EXPECT_EQ(bridge()->GetStorageKey(*SpecificsToEntity(specifics4)),
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics4)),
             kCloudTokenDataClientTag);
 }
 
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc
index 2f233ce7..31d7284a 100644
--- a/components/autofill/core/common/form_field_data.cc
+++ b/components/autofill/core/common/form_field_data.cc
@@ -232,7 +232,8 @@
 bool FormFieldData::IsTextInputElement() const {
   return form_control_type == "text" || form_control_type == "password" ||
          form_control_type == "search" || form_control_type == "tel" ||
-         form_control_type == "url" || form_control_type == "email";
+         form_control_type == "url" || form_control_type == "email" ||
+         form_control_type == "number";
 }
 
 bool FormFieldData::IsPasswordInputElement() const {
diff --git a/components/autofill/core/common/form_field_data_unittest.cc b/components/autofill/core/common/form_field_data_unittest.cc
index c0a8bc5..48ae891 100644
--- a/components/autofill/core/common/form_field_data_unittest.cc
+++ b/components/autofill/core/common/form_field_data_unittest.cc
@@ -387,12 +387,10 @@
     const char* form_control_type;
     bool expected;
   } test_data[] = {
-      {"text", true},      {"search", true},
-      {"tel", true},       {"url", true},
-      {"email", true},     {"password", true},
-      {"select", false},   {"", false},
-      {"checkbox", false}, {"random_string", false},
-      {"textarea", false},
+      {"text", true},      {"search", true},         {"tel", true},
+      {"url", true},       {"email", true},          {"password", true},
+      {"number", true},    {"select", false},        {"", false},
+      {"checkbox", false}, {"random_string", false}, {"textarea", false},
   };
 
   for (const auto& test_case : test_data) {
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm
index 9f275267..c1bc51a2 100644
--- a/components/autofill/ios/browser/autofill_driver_ios.mm
+++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -8,7 +8,6 @@
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/ios/browser/autofill_driver_ios_bridge.h"
 #include "components/autofill/ios/browser/autofill_driver_ios_webframe.h"
-#import "ios/web/common/origin_util.h"
 #include "ios/web/public/browser_state.h"
 #include "ios/web/public/js_messaging/web_frame_util.h"
 #import "ios/web/public/web_state.h"
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index a89c3bb..337ca824 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.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.
 
-// The history system runs on a background sequence so that potentially slow
+// The history system runs on a background thread so that potentially slow
 // database operations don't delay the browser. This backend processing is
 // represented by HistoryBackend. The HistoryService's job is to dispatch to
 // that thread.
 //
-// Main thread                       backend_task_runner_
+// Main thread                       History thread
 // -----------                       --------------
 // HistoryService <----------------> HistoryBackend
 //                                   -> HistoryDatabase
@@ -71,7 +71,7 @@
 
 // static
 const base::Feature HistoryService::kHistoryServiceUsesTaskScheduler{
-    "HistoryServiceUsesTaskScheduler", base::FEATURE_ENABLED_BY_DEFAULT};
+    "HistoryServiceUsesTaskScheduler", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Sends messages from the backend to us on the main thread. This must be a
 // separate class from the history service so that it can hold a reference to
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
index 88dbf07..b8d30d68 100644
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -468,7 +468,7 @@
 
   // Generic Stuff -------------------------------------------------------------
 
-  // Schedules a HistoryDBTask for running on the history backend. See
+  // Schedules a HistoryDBTask for running on the history backend thread. See
   // HistoryDBTask for details on what this does. Takes ownership of |task|.
   virtual base::CancelableTaskTracker::TaskId ScheduleDBTask(
       const base::Location& from_here,
@@ -493,15 +493,15 @@
 
   // Testing -------------------------------------------------------------------
 
-  // Runs |flushed| after the backend has processed all other pre-existing
-  // tasks.
+  // Runs |flushed| after bouncing off the history thread.
   void FlushForTest(base::OnceClosure flushed);
 
   // Designed for unit tests, this passes the given task on to the history
   // backend to be called once the history backend has terminated. This allows
-  // callers to know when the history backend has been safely deleted and the
-  // database files can be deleted and the next test run.
-
+  // callers to know when the history thread is complete and the database files
+  // can be deleted and the next test run. Otherwise, the history thread may
+  // still be running, causing problems in subsequent tests.
+  //
   // There can be only one closing task, so this will override any previously
   // set task. We will take ownership of the pointer and delete it when done.
   // The task will be run on the calling thread (this function is threadsafe).
@@ -511,9 +511,9 @@
   // into the database. This assumes the URL doesn't exist in the database
   //
   // Calling this function many times may be slow because each call will
-  // post a separate database transaction in a task. If this functionality
-  // is needed for importing many URLs, callers should use AddPagesWithDetails()
-  // instead.
+  // dispatch to the history thread and will be a separate database
+  // transaction. If this functionality is needed for importing many URLs,
+  // callers should use AddPagesWithDetails() instead.
   //
   // Note that this routine (and AddPageWithDetails()) always adds a single
   // visit using the |last_visit| timestamp, and a PageTransition type of LINK,
@@ -594,9 +594,9 @@
   // that is only set by unittests which causes the backend to not init its DB.
   bool Init(bool no_db, const HistoryDatabaseParams& history_database_params);
 
-  // Called by the HistoryURLProvider class to schedule an autocomplete, it will
-  // be called back with the history database so it can query. See
-  // history_url_provider.h for a diagram.
+  // Called by the HistoryURLProvider class to schedule an autocomplete, it
+  // will be called back on the internal history thread with the history
+  // database so it can query. See history_url_provider.h for a diagram.
   void ScheduleAutocomplete(
       base::OnceCallback<void(HistoryBackend*, URLDatabase*)> callback);
 
@@ -834,8 +834,8 @@
   void NotifyProfileError(sql::InitStatus init_status,
                           const std::string& diagnostics);
 
-  // Call to post a given task for running on the history backend sequence with
-  // the specified priority. The task will have ownership taken.
+  // Call to schedule a given task for running on the history thread with the
+  // specified priority. The task will have ownership taken.
   void ScheduleTask(SchedulePriority priority, base::OnceClosure task);
 
   // Called when the favicons for the given page URLs (e.g.
@@ -858,16 +858,17 @@
   // Cleanup() is called.
   scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
 
-  // This class has most of the implementation. You MUST communicate with this
-  // class ONLY through |backend_task_runner_|.
+  // This class has most of the implementation and runs on the 'thread_'.
+  // You MUST communicate with this class ONLY through the thread_'s
+  // task_runner().
   //
   // This pointer will be null once Cleanup() has been called, meaning no
-  // more tasks should be scheduled.
+  // more calls should be made to the history thread.
   scoped_refptr<HistoryBackend> history_backend_;
 
   // A cache of the user-typed URLs kept in memory that is used by the
   // autocomplete system. This will be null until the database has been created
-  // in the backend.
+  // on the background thread.
   // TODO(mrossetti): Consider changing ownership. See http://crbug.com/138321
   std::unique_ptr<InMemoryHistoryBackend> in_memory_backend_;
 
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
index 8254afc..e5b6c1f 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -400,10 +400,9 @@
     return bridge()->GetStorageKeyInternal(url);
   }
 
-  std::unique_ptr<EntityData> SpecificsToEntity(
-      const TypedUrlSpecifics& specifics) {
-    auto data = std::make_unique<EntityData>();
-    *data->specifics.mutable_typed_url() = specifics;
+  EntityData SpecificsToEntity(const TypedUrlSpecifics& specifics) {
+    EntityData data;
+    *data.specifics.mutable_typed_url() = specifics;
     return data;
   }
 
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
index ff93af0..bb38b88f 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -259,12 +259,12 @@
   }
 
   // Creates an EntityData around a copy of the given specifics.
-  std::unique_ptr<syncer::EntityData> SpecificsToEntity(
+  syncer::EntityData SpecificsToEntity(
       const sync_pb::PasswordSpecifics& specifics) {
-    auto data = std::make_unique<syncer::EntityData>();
-    *data->specifics.mutable_password() = specifics;
-    data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
-        syncer::PASSWORDS, bridge()->GetClientTag(*data));
+    syncer::EntityData data;
+    *data.specifics.mutable_password() = specifics;
+    data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+        syncer::PASSWORDS, bridge()->GetClientTag(data));
     return data;
   }
 
@@ -436,7 +436,7 @@
 
   EXPECT_CALL(mock_processor(),
               UntrackEntityForClientTagHash(
-                  SpecificsToEntity(specifics)->client_tag_hash));
+                  SpecificsToEntity(specifics).client_tag_hash));
 
   syncer::EntityChangeList entity_change_list;
   entity_change_list.push_back(syncer::EntityChange::CreateAdd(
@@ -732,7 +732,7 @@
 
   EXPECT_CALL(mock_processor(),
               UntrackEntityForClientTagHash(
-                  SpecificsToEntity(specifics)->client_tag_hash));
+                  SpecificsToEntity(specifics).client_tag_hash));
 
   syncer::EntityChangeList entity_change_list;
   entity_change_list.push_back(syncer::EntityChange::CreateAdd(
diff --git a/components/password_manager/ios/DEPS b/components/password_manager/ios/DEPS
index 729b9e1..ff975cc 100644
--- a/components/password_manager/ios/DEPS
+++ b/components/password_manager/ios/DEPS
@@ -6,4 +6,5 @@
   "+components/security_state/ios",
   "+ios/web/public",
   "+ios/web/common",
+  "+services/network/public/cpp",
 ]
diff --git a/components/password_manager/ios/credential_manager_util.mm b/components/password_manager/ios/credential_manager_util.mm
index 78ce592..66b955b9 100644
--- a/components/password_manager/ios/credential_manager_util.mm
+++ b/components/password_manager/ios/credential_manager_util.mm
@@ -5,8 +5,8 @@
 #include "components/password_manager/ios/credential_manager_util.h"
 
 #include "components/security_state/ios/security_state_utils.h"
-#import "ios/web/common/origin_util.h"
 #import "ios/web/public/web_state.h"
+#include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "url/origin.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -135,7 +135,7 @@
   if (json.GetString(kCredentialIconKey, &iconUrl) && !iconUrl.empty()) {
     credential->icon = GURL(iconUrl);
     if (!credential->icon.is_valid() ||
-        !web::IsOriginSecure(credential->icon)) {
+        !network::IsUrlPotentiallyTrustworthy(credential->icon)) {
       // |iconUrl| is either not a valid URL or not a secure URL.
       if (reason) {
         *reason = "iconURL is either invalid or insecure URL";
@@ -189,8 +189,7 @@
 
   const GURL last_committed_url = web_state->GetLastCommittedURL();
 
-  if (!web::IsOriginSecure(last_committed_url) ||
-      last_committed_url.scheme() == url::kDataScheme) {
+  if (!network::IsUrlPotentiallyTrustworthy(last_committed_url)) {
     return false;
   }
 
diff --git a/components/reading_list/core/reading_list_store_unittest.cc b/components/reading_list/core/reading_list_store_unittest.cc
index 89e581d..8e31def 100644
--- a/components/reading_list/core/reading_list_store_unittest.cc
+++ b/components/reading_list/core/reading_list_store_unittest.cc
@@ -199,8 +199,8 @@
   std::unique_ptr<sync_pb::ReadingListSpecifics> specifics =
       entry.AsReadingListSpecifics();
 
-  auto data = std::make_unique<syncer::EntityData>();
-  *data->specifics.mutable_reading_list() = *specifics;
+  syncer::EntityData data;
+  *data.specifics.mutable_reading_list() = *specifics;
 
   remote_input.push_back(syncer::EntityChange::CreateAdd(
       "http://read.example.com/", std::move(data)));
@@ -223,8 +223,8 @@
   entry.SetRead(true, AdvanceAndGetTime(&clock_));
   std::unique_ptr<sync_pb::ReadingListSpecifics> specifics =
       entry.AsReadingListSpecifics();
-  auto data = std::make_unique<syncer::EntityData>();
-  *data->specifics.mutable_reading_list() = *specifics;
+  syncer::EntityData data;
+  *data.specifics.mutable_reading_list() = *specifics;
 
   syncer::EntityChangeList add_changes;
 
@@ -248,8 +248,8 @@
   new_entry.SetRead(true, AdvanceAndGetTime(&clock_));
   std::unique_ptr<sync_pb::ReadingListSpecifics> specifics =
       new_entry.AsReadingListSpecifics();
-  auto data = std::make_unique<syncer::EntityData>();
-  *data->specifics.mutable_reading_list() = *specifics;
+  syncer::EntityData data;
+  *data.specifics.mutable_reading_list() = *specifics;
 
   EXPECT_CALL(processor_, Put("http://unread.example.com/", _, _));
 
@@ -277,8 +277,8 @@
 
   std::unique_ptr<sync_pb::ReadingListSpecifics> specifics =
       old_entry.AsReadingListSpecifics();
-  auto data = std::make_unique<syncer::EntityData>();
-  *data->specifics.mutable_reading_list() = *specifics;
+  syncer::EntityData data;
+  *data.specifics.mutable_reading_list() = *specifics;
 
   EXPECT_CALL(processor_, Put("http://unread.example.com/", _, _));
 
diff --git a/components/security_state/ios/DEPS b/components/security_state/ios/DEPS
index 7bbff89..f68780e 100644
--- a/components/security_state/ios/DEPS
+++ b/components/security_state/ios/DEPS
@@ -3,4 +3,5 @@
   "+components/security_state/core",
   "+ios/web/common",
   "+ios/web/public",
+  "+services/network/public/cpp",
 ]
diff --git a/components/security_state/ios/insecure_input_tab_helper.mm b/components/security_state/ios/insecure_input_tab_helper.mm
index d8cb5bb..c3b048a 100644
--- a/components/security_state/ios/insecure_input_tab_helper.mm
+++ b/components/security_state/ios/insecure_input_tab_helper.mm
@@ -12,12 +12,12 @@
 #include "components/autofill/ios/form_util/form_activity_params.h"
 #include "components/autofill/ios/form_util/form_activity_tab_helper.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
-#import "ios/web/common/origin_util.h"
 #import "ios/web/public/navigation/navigation_context.h"
 #import "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #import "ios/web/public/web_state.h"
 #import "ios/web/public/web_state_user_data.h"
+#include "services/network/public/cpp/is_potentially_trustworthy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -65,7 +65,8 @@
 }
 
 void InsecureInputTabHelper::DidEditFieldInInsecureContext() {
-  DCHECK(!web::IsOriginSecure(web_state_->GetLastCommittedURL()));
+  DCHECK(
+      !network::IsUrlPotentiallyTrustworthy(web_state_->GetLastCommittedURL()));
 
   security_state::SSLStatusInputEventData* input_events =
       GetOrCreateSSLStatusInputEventData(web_state_);
@@ -93,7 +94,7 @@
     const autofill::FormActivityParams& params) {
   DCHECK_EQ(web_state_, web_state);
   if (params.type == "input" &&
-      !web::IsOriginSecure(web_state->GetLastCommittedURL())) {
+      !network::IsUrlPotentiallyTrustworthy(web_state->GetLastCommittedURL())) {
     DidEditFieldInInsecureContext();
   }
 }
@@ -104,7 +105,7 @@
   DCHECK_EQ(web_state_, web_state);
   // Check if the navigation should clear insecure input event data (i.e., not a
   // same-document navigation).
-  if (!web::IsOriginSecure(web_state->GetLastCommittedURL()) &&
+  if (!network::IsUrlPotentiallyTrustworthy(web_state->GetLastCommittedURL()) &&
       navigation_context->HasCommitted() &&
       !navigation_context->IsSameDocument()) {
     security_state::SSLStatusInputEventData* input_events =
diff --git a/components/security_state/ios/security_state_utils.mm b/components/security_state/ios/security_state_utils.mm
index 6550da7..5978b40 100644
--- a/components/security_state/ios/security_state_utils.mm
+++ b/components/security_state/ios/security_state_utils.mm
@@ -8,7 +8,6 @@
 
 #include "components/security_state/core/security_state.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
-#import "ios/web/common/origin_util.h"
 #include "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/security/security_style.h"
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc
index 0261a61..9ab9917 100644
--- a/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc
+++ b/components/send_tab_to_self/send_tab_to_self_bridge_unittest.cc
@@ -132,15 +132,13 @@
     ON_CALL(mock_processor_, IsTrackingMetadata()).WillByDefault(Return(false));
   }
 
-  std::unique_ptr<syncer::EntityData> MakeEntityData(
-      const SendTabToSelfEntry& entry) {
+  syncer::EntityData MakeEntityData(const SendTabToSelfEntry& entry) {
     SendTabToSelfLocal specifics = entry.AsLocalProto();
 
-    auto entity_data = std::make_unique<syncer::EntityData>();
+    syncer::EntityData entity_data;
 
-    *(entity_data->specifics.mutable_send_tab_to_self()) =
-        specifics.specifics();
-    entity_data->name = entry.GetURL().spec();
+    *entity_data.specifics.mutable_send_tab_to_self() = specifics.specifics();
+    entity_data.name = entry.GetURL().spec();
     return entity_data;
   }
 
@@ -151,10 +149,10 @@
       const std::vector<sync_pb::SendTabToSelfSpecifics>& specifics_list) {
     syncer::EntityChangeList changes;
     for (const auto& specifics : specifics_list) {
-      auto entity_data = std::make_unique<syncer::EntityData>();
+      syncer::EntityData entity_data;
 
-      *(entity_data->specifics.mutable_send_tab_to_self()) = specifics;
-      entity_data->name = specifics.url();
+      *entity_data.specifics.mutable_send_tab_to_self() = specifics;
+      entity_data.name = specifics.url();
 
       changes.push_back(syncer::EntityChange::CreateAdd(
           specifics.guid(), std::move(entity_data)));
diff --git a/components/sync/driver/file_based_trusted_vault_client.cc b/components/sync/driver/file_based_trusted_vault_client.cc
index ca8ece85..3c2e98b 100644
--- a/components/sync/driver/file_based_trusted_vault_client.cc
+++ b/components/sync/driver/file_based_trusted_vault_client.cc
@@ -148,6 +148,13 @@
   observer_list_.Notify();
 }
 
+void FileBasedTrustedVaultClient::MarkKeysAsStale(
+    const std::string& gaia_id,
+    base::OnceCallback<void(bool)> cb) {
+  // Not really supported and not useful for this particular implementation.
+  std::move(cb).Run(false);
+}
+
 void FileBasedTrustedVaultClient::WaitForFlushForTesting(
     base::OnceClosure cb) const {
   backend_task_runner_->PostTaskAndReply(FROM_HERE, base::DoNothing(),
diff --git a/components/sync/driver/file_based_trusted_vault_client.h b/components/sync/driver/file_based_trusted_vault_client.h
index 9581eeb..e8318b6b 100644
--- a/components/sync/driver/file_based_trusted_vault_client.h
+++ b/components/sync/driver/file_based_trusted_vault_client.h
@@ -37,6 +37,8 @@
       override;
   void StoreKeys(const std::string& gaia_id,
                  const std::vector<std::vector<uint8_t>>& keys) override;
+  void MarkKeysAsStale(const std::string& gaia_id,
+                       base::OnceCallback<void(bool)> cb) override;
 
   // Runs |cb| when all requests have completed.
   void WaitForFlushForTesting(base::OnceClosure cb) const;
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 1b6ba53..b466d03 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -1061,7 +1061,7 @@
       // (but not all). Care must be taken however for scenarios like custom
       // passphrase being set.
       sync_prefs_.ClearDirectoryConsistencyPreferences();
-      startup_controller_->TryStart(IsSetupInProgress());
+      startup_controller_->TryStart(/*force_immediate=*/true);
       break;
     case UNKNOWN_ACTION:
       NOTREACHED();
@@ -1299,7 +1299,7 @@
     // TODO(crbug.com/856179): Evaluate whether we can get away without a full
     // restart (i.e. just reconfigure plus whatever cleanup is necessary). See
     // also similar comment in OnSyncRequestedPrefChange().
-    startup_controller_->TryStart(/*force_immediate=*/false);
+    startup_controller_->TryStart(/*force_immediate=*/true);
   }
 }
 
@@ -1538,7 +1538,7 @@
   } else {
     // Sync is no longer disabled by policy. Try starting it up if appropriate.
     DCHECK(!engine_);
-    startup_controller_->TryStart(IsSetupInProgress());
+    startup_controller_->TryStart(/*force_immediate=*/true);
   }
 }
 
@@ -1575,6 +1575,11 @@
     // restart (i.e. just reconfigure plus whatever cleanup is necessary).
     // Especially in the CLEAR_DATA case, StopImpl does a lot of cleanup that
     // might still be required.
+    // TODO(crbug.com/1035874): There's no real need to delay the startup here,
+    // i.e. it should be fine to set force_immediate to true. However currently
+    // some tests depend on the startup *not* happening immediately (because
+    // they want to check that Sync (the feature) got disabled, which is hard to
+    // do if the engine starts up again immediately).
     startup_controller_->TryStart(/*force_immediate=*/false);
   }
 }
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc
index 834ab34..4c188e6 100644
--- a/components/sync/driver/sync_service_crypto.cc
+++ b/components/sync/driver/sync_service_crypto.cc
@@ -48,6 +48,11 @@
     // Never invoked by SyncServiceCrypto.
     NOTREACHED();
   }
+
+  void MarkKeysAsStale(const std::string& gaia_id,
+                       base::OnceCallback<void(bool)> cb) override {
+    std::move(cb).Run(false);
+  }
 };
 
 // A SyncEncryptionHandler::Observer implementation that simply posts all calls
@@ -578,11 +583,11 @@
 
   trusted_vault_client_->FetchKeys(
       state_.account_info.gaia,
-      base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysFetched,
+      base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysFetchedFromClient,
                      weak_factory_.GetWeakPtr()));
 }
 
-void SyncServiceCrypto::TrustedVaultKeysFetched(
+void SyncServiceCrypto::TrustedVaultKeysFetchedFromClient(
     const std::vector<std::vector<uint8_t>>& keys) {
   if (state_.required_user_action !=
           RequiredUserAction::kFetchingTrustedVaultKeys &&
@@ -593,6 +598,14 @@
 
   DCHECK(state_.engine);
 
+  if (keys.empty()) {
+    // Nothing to do if no keys have been fetched from the client (e.g. user
+    // action is required for fetching additional keys). Let's avoid unnecessary
+    // steps like marking keys as stale.
+    FetchTrustedVaultKeysCompletedButInsufficient();
+    return;
+  }
+
   state_.engine->AddTrustedVaultDecryptionKeys(
       keys, base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysAdded,
                            weak_factory_.GetWeakPtr()));
@@ -606,6 +619,35 @@
     return;
   }
 
+  // Reaching this codepath indicates OnTrustedVaultKeyAccepted() was not
+  // triggered, so the fetched trusted vault keys were insufficient. Let the
+  // trusted vault client know.
+  trusted_vault_client_->MarkKeysAsStale(
+      state_.account_info.gaia,
+      base::BindOnce(&SyncServiceCrypto::TrustedVaultKeysMarkedAsStale,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void SyncServiceCrypto::TrustedVaultKeysMarkedAsStale(bool result) {
+  if (state_.required_user_action !=
+          RequiredUserAction::kFetchingTrustedVaultKeys &&
+      state_.required_user_action !=
+          RequiredUserAction::kTrustedVaultKeyRequiredButFetching) {
+    return;
+  }
+
+  // TODO(crbug.com/1012659): Based on |result|, start a second FetchKeys()
+  // pass.
+
+  FetchTrustedVaultKeysCompletedButInsufficient();
+}
+
+void SyncServiceCrypto::FetchTrustedVaultKeysCompletedButInsufficient() {
+  DCHECK(state_.required_user_action ==
+             RequiredUserAction::kFetchingTrustedVaultKeys ||
+         state_.required_user_action ==
+             RequiredUserAction::kTrustedVaultKeyRequiredButFetching);
+
   // If FetchKeys() was intended to be called during an already existing ongoing
   // FetchKeys(), it needs to be invoked now that it's possible.
   if (state_.deferred_trusted_vault_fetch_keys_pending) {
@@ -614,9 +656,11 @@
   }
 
   // Reaching this codepath indicates OnTrustedVaultKeyAccepted() was not
-  // triggered, so reconfigure without the encrypted types (excluded implicitly
-  // via the failed datatypes handler).
+  // triggered, so the fetched trusted vault keys were insufficient.
   state_.required_user_action = RequiredUserAction::kTrustedVaultKeyRequired;
+
+  // Reconfigure without the encrypted types (excluded implicitly via the failed
+  // datatypes handler).
   reconfigure_.Run(CONFIGURE_REASON_CRYPTO);
 }
 
diff --git a/components/sync/driver/sync_service_crypto.h b/components/sync/driver/sync_service_crypto.h
index 788b75b..a00a26b 100644
--- a/components/sync/driver/sync_service_crypto.h
+++ b/components/sync/driver/sync_service_crypto.h
@@ -110,8 +110,11 @@
 
   // Called at various stages of asynchronously fetching and processing trusted
   // vault encryption keys.
-  void TrustedVaultKeysFetched(const std::vector<std::vector<uint8_t>>& keys);
+  void TrustedVaultKeysFetchedFromClient(
+      const std::vector<std::vector<uint8_t>>& keys);
   void TrustedVaultKeysAdded();
+  void TrustedVaultKeysMarkedAsStale(bool result);
+  void FetchTrustedVaultKeysCompletedButInsufficient();
 
   // Calls SyncServiceBase::NotifyObservers(). Never null.
   const base::RepeatingClosure notify_observers_;
diff --git a/components/sync/driver/sync_service_crypto_unittest.cc b/components/sync/driver/sync_service_crypto_unittest.cc
index 24fee3f..667c262 100644
--- a/components/sync/driver/sync_service_crypto_unittest.cc
+++ b/components/sync/driver/sync_service_crypto_unittest.cc
@@ -68,6 +68,10 @@
   // Exposes the total number of calls to FetchKeys().
   int fetch_count() const { return fetch_count_; }
 
+  // Returns whether MarkKeysAsStale() was called since the last call to
+  // FetchKeys().
+  bool keys_marked_as_stale() const { return keys_marked_as_stale_; }
+
   // Mimics the completion of the next (FIFO) FetchKeys() request.
   bool CompleteFetchKeysRequest() {
     if (pending_responses_.empty()) {
@@ -91,6 +95,7 @@
       base::OnceCallback<void(const std::vector<std::vector<uint8_t>>&)> cb)
       override {
     ++fetch_count_;
+    keys_marked_as_stale_ = false;
     pending_responses_.push_back(
         base::BindOnce(std::move(cb), gaia_id_to_keys_[gaia_id]));
   }
@@ -101,10 +106,17 @@
     observer_list_.Notify();
   }
 
+  void MarkKeysAsStale(const std::string& gaia_id,
+                       base::OnceCallback<void(bool)> cb) override {
+    keys_marked_as_stale_ = true;
+    std::move(cb).Run(false);
+  }
+
  private:
   std::map<std::string, std::vector<std::vector<uint8_t>>> gaia_id_to_keys_;
   CallbackList observer_list_;
   int fetch_count_ = 0;
+  bool keys_marked_as_stale_ = false;
   std::list<base::OnceClosure> pending_responses_;
 };
 
@@ -209,6 +221,7 @@
   crypto_.OnTrustedVaultKeyAccepted();
   std::move(add_keys_cb).Run();
   EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired());
+  EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale());
 }
 
 TEST_F(SyncServiceCryptoTest,
@@ -248,6 +261,34 @@
   crypto_.OnTrustedVaultKeyAccepted();
   std::move(add_keys_cb).Run();
   EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired());
+  EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale());
+}
+
+TEST_F(SyncServiceCryptoTest,
+       ShouldReadNoTrustedVaultKeysFromClientAfterInitialization) {
+  const CoreAccountInfo kSyncingAccount =
+      MakeAccountInfoWithGaia("syncingaccount");
+
+  EXPECT_CALL(reconfigure_cb_, Run(_)).Times(0);
+  EXPECT_CALL(engine_, AddTrustedVaultDecryptionKeys(_, _)).Times(0);
+
+  ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired());
+
+  // Mimic the engine determining that trusted vault keys are required.
+  crypto_.SetSyncEngine(kSyncingAccount, &engine_);
+  ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(0));
+
+  crypto_.OnTrustedVaultKeyRequired();
+
+  // While there is an ongoing fetch, there should be no user action required.
+  ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(1));
+  ASSERT_FALSE(crypto_.IsTrustedVaultKeyRequired());
+
+  // Mimic completion of the fetch, which should lead to a reconfiguration.
+  EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO));
+  ASSERT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest());
+  EXPECT_TRUE(crypto_.IsTrustedVaultKeyRequired());
+  EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale());
 }
 
 TEST_F(SyncServiceCryptoTest, ShouldReadInvalidTrustedVaultKeysFromClient) {
@@ -284,6 +325,7 @@
   EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO));
   std::move(add_keys_cb).Run();
   EXPECT_TRUE(crypto_.IsTrustedVaultKeyRequired());
+  EXPECT_TRUE(trusted_vault_client_.keys_marked_as_stale());
 }
 
 // Similar to ShouldReadInvalidTrustedVaultKeysFromClient: the vault
@@ -318,6 +360,7 @@
   ASSERT_THAT(trusted_vault_client_.fetch_count(), Eq(1));
   ASSERT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest());
   ASSERT_TRUE(crypto_.IsTrustedVaultKeyRequired());
+  ASSERT_TRUE(trusted_vault_client_.keys_marked_as_stale());
 
   // Mimic keys being added to the vault, which triggers a notification to
   // observers (namely |crypto_|), leading to a second fetch.
@@ -326,6 +369,7 @@
   EXPECT_CALL(reconfigure_cb_, Run(CONFIGURE_REASON_CRYPTO));
   EXPECT_TRUE(trusted_vault_client_.CompleteFetchKeysRequest());
   EXPECT_FALSE(crypto_.IsTrustedVaultKeyRequired());
+  EXPECT_FALSE(trusted_vault_client_.keys_marked_as_stale());
 }
 
 // Same as above but the new keys become available during an ongoing FetchKeys()
diff --git a/components/sync/driver/trusted_vault_client.h b/components/sync/driver/trusted_vault_client.h
index 9bc379b2..42e07492 100644
--- a/components/sync/driver/trusted_vault_client.h
+++ b/components/sync/driver/trusted_vault_client.h
@@ -41,6 +41,16 @@
       base::OnceCallback<void(const std::vector<std::vector<uint8_t>>&)>
           cb) = 0;
 
+  // Invoked when the result of FetchKeys() contains keys that cannot decrypt
+  // the pending cryptographer (Nigori) keys, which should only be possible if
+  // the provided keys are not up-to-date. |cb| is run upon completion and
+  // returns false if the call did not make any difference (e.g. the operation
+  // is unsupported) or true if some change may have occurred (which indicates a
+  // second FetchKeys() attempt is worth). Concurrent calls to MarkKeysAsStale()
+  // must not be issued since implementations may not support them.
+  virtual void MarkKeysAsStale(const std::string& gaia_id,
+                               base::OnceCallback<void(bool)> cb) = 0;
+
   // Allows implementations to store encryption keys fetched by other means such
   // as Web interactions. Implementations are free to completely ignore these
   // keys, so callers may not assume that later calls to FetchKeys() would
diff --git a/components/sync/engine/non_blocking_sync_common.h b/components/sync/engine/non_blocking_sync_common.h
index 82044a01..89ab448 100644
--- a/components/sync/engine/non_blocking_sync_common.h
+++ b/components/sync/engine/non_blocking_sync_common.h
@@ -62,20 +62,22 @@
 
 struct UpdateResponseData {
   UpdateResponseData();
+  UpdateResponseData(UpdateResponseData&&) = default;
+  UpdateResponseData& operator=(UpdateResponseData&&) = default;
   ~UpdateResponseData();
 
-  std::unique_ptr<EntityData> entity;
+  UpdateResponseData(const UpdateResponseData&) = delete;
+  UpdateResponseData& operator=(const UpdateResponseData&) = delete;
+
+  EntityData entity;
 
   int64_t response_version = 0;
   std::string encryption_key_name;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(UpdateResponseData);
 };
 
 using CommitRequestDataList = std::vector<std::unique_ptr<CommitRequestData>>;
 using CommitResponseDataList = std::vector<CommitResponseData>;
-using UpdateResponseDataList = std::vector<std::unique_ptr<UpdateResponseData>>;
+using UpdateResponseDataList = std::vector<UpdateResponseData>;
 
 // Returns the estimate of dynamically allocated memory in bytes.
 size_t EstimateMemoryUsage(const CommitRequestData& value);
diff --git a/components/sync/engine_impl/model_type_worker.cc b/components/sync/engine_impl/model_type_worker.cc
index 3e2b759..383f60d 100644
--- a/components/sync/engine_impl/model_type_worker.cc
+++ b/components/sync/engine_impl/model_type_worker.cc
@@ -183,9 +183,9 @@
       }
     }
 
-    auto response_data = std::make_unique<UpdateResponseData>();
+    UpdateResponseData response_data;
     switch (PopulateUpdateResponseData(cryptographer_.get(), type_,
-                                       *update_entity, response_data.get())) {
+                                       *update_entity, &response_data)) {
       case SUCCESS:
         pending_updates_.push_back(std::move(response_data));
         break;
@@ -212,7 +212,7 @@
     ModelType model_type,
     const sync_pb::SyncEntity& update_entity,
     UpdateResponseData* response_data) {
-  auto data = std::make_unique<syncer::EntityData>();
+  syncer::EntityData data;
 
   // Deleted entities must use the default instance of EntitySpecifics in
   // order for EntityData to correctly reflect that they are deleted.
@@ -233,8 +233,7 @@
     if (!cryptographer->CanDecrypt(specifics.password().encrypted())) {
       return DECRYPTION_PENDING;
     }
-    if (!DecryptPasswordSpecifics(*cryptographer, specifics,
-                                  &data->specifics)) {
+    if (!DecryptPasswordSpecifics(*cryptographer, specifics, &data.specifics)) {
       return FAILED_TO_DECRYPT;
     }
     response_data->encryption_key_name =
@@ -249,41 +248,41 @@
       return DECRYPTION_PENDING;
     }
     // Encrypted and we know the key.
-    if (!DecryptSpecifics(*cryptographer, specifics, &data->specifics)) {
+    if (!DecryptSpecifics(*cryptographer, specifics, &data.specifics)) {
       return FAILED_TO_DECRYPT;
     }
     response_data->encryption_key_name = specifics.encrypted().key_name();
     specifics_were_encrypted = true;
   } else {
     // No encryption.
-    data->specifics = specifics;
+    data.specifics = specifics;
   }
 
   response_data->response_version = update_entity.version();
   // Prepare the message for the model thread.
-  data->id = update_entity.id_string();
-  data->client_tag_hash =
+  data.id = update_entity.id_string();
+  data.client_tag_hash =
       ClientTagHash::FromHashed(update_entity.client_defined_unique_tag());
-  data->creation_time = ProtoTimeToTime(update_entity.ctime());
-  data->modification_time = ProtoTimeToTime(update_entity.mtime());
-  data->name = update_entity.name();
-  data->is_folder = update_entity.folder();
-  data->parent_id = update_entity.parent_id_string();
-  data->server_defined_unique_tag = update_entity.server_defined_unique_tag();
+  data.creation_time = ProtoTimeToTime(update_entity.ctime());
+  data.modification_time = ProtoTimeToTime(update_entity.mtime());
+  data.name = update_entity.name();
+  data.is_folder = update_entity.folder();
+  data.parent_id = update_entity.parent_id_string();
+  data.server_defined_unique_tag = update_entity.server_defined_unique_tag();
 
   // Populate |originator_cache_guid| and |originator_client_item_id|. This is
   // currently relevant only for bookmarks.
-  data->originator_cache_guid = update_entity.originator_cache_guid();
-  data->originator_client_item_id = update_entity.originator_client_item_id();
+  data.originator_cache_guid = update_entity.originator_cache_guid();
+  data.originator_client_item_id = update_entity.originator_client_item_id();
 
   // Adapt the update for compatibility.
   if (model_type == BOOKMARKS) {
-    AdaptUniquePositionForBookmark(update_entity, data.get());
-    AdaptTitleForBookmark(update_entity, &data->specifics,
+    AdaptUniquePositionForBookmark(update_entity, &data);
+    AdaptTitleForBookmark(update_entity, &data.specifics,
                           specifics_were_encrypted);
-    AdaptGuidForBookmark(update_entity, &data->specifics);
+    AdaptGuidForBookmark(update_entity, &data.specifics);
   } else if (model_type == AUTOFILL_WALLET_DATA) {
-    AdaptClientTagForWalletData(data.get());
+    AdaptClientTagForWalletData(&data);
   }
 
   response_data->entity = std::move(data);
@@ -473,9 +472,9 @@
        it != entries_pending_decryption_.end();) {
     const sync_pb::SyncEntity& encrypted_update = it->second;
 
-    auto response_data = std::make_unique<UpdateResponseData>();
+    UpdateResponseData response_data;
     switch (PopulateUpdateResponseData(cryptographer_.get(), type_,
-                                       encrypted_update, response_data.get())) {
+                                       encrypted_update, &response_data)) {
       case SUCCESS:
         pending_updates_.push_back(std::move(response_data));
         it = entries_pending_decryption_.erase(it);
@@ -500,15 +499,14 @@
   pending_updates_.reserve(candidates.size());
 
   std::map<std::string, size_t> id_to_index;
-  for (std::unique_ptr<UpdateResponseData>& candidate : candidates) {
-    DCHECK(candidate);
-    if (candidate->entity->id.empty()) {
+  for (UpdateResponseData& candidate : candidates) {
+    if (candidate.entity.id.empty()) {
       continue;
     }
     // Try to insert. If we already saw an item with the same server id,
     // this will fail but give us its iterator.
     auto it_and_success =
-        id_to_index.emplace(candidate->entity->id, pending_updates_.size());
+        id_to_index.emplace(candidate.entity.id, pending_updates_.size());
     if (it_and_success.second) {
       // New server id, append at the end. Note that we already inserted
       // the correct index (|pending_updates_.size()|) above.
@@ -527,17 +525,16 @@
   pending_updates_.reserve(candidates.size());
 
   std::map<ClientTagHash, size_t> tag_to_index;
-  for (std::unique_ptr<UpdateResponseData>& candidate : candidates) {
-    DCHECK(candidate);
+  for (UpdateResponseData& candidate : candidates) {
     // Items with empty client tag hash just get passed through.
-    if (candidate->entity->client_tag_hash.value().empty()) {
+    if (candidate.entity.client_tag_hash.value().empty()) {
       pending_updates_.push_back(std::move(candidate));
       continue;
     }
     // Try to insert. If we already saw an item with the same client tag hash,
     // this will fail but give us its iterator.
-    auto it_and_success = tag_to_index.emplace(
-        candidate->entity->client_tag_hash, pending_updates_.size());
+    auto it_and_success = tag_to_index.emplace(candidate.entity.client_tag_hash,
+                                               pending_updates_.size());
     if (it_and_success.second) {
       // New client tag hash, append at the end. Note that we already inserted
       // the correct index (|pending_updates_.size()|) above.
@@ -556,18 +553,17 @@
   pending_updates_.reserve(candidates.size());
 
   std::map<std::string, size_t> id_to_index;
-  for (std::unique_ptr<UpdateResponseData>& candidate : candidates) {
-    DCHECK(candidate);
+  for (UpdateResponseData& candidate : candidates) {
     // Items with empty item ID just get passed through (which is the case for
     // all datatypes except bookmarks).
-    if (candidate->entity->originator_client_item_id.empty()) {
+    if (candidate.entity.originator_client_item_id.empty()) {
       pending_updates_.push_back(std::move(candidate));
       continue;
     }
     // Try to insert. If we already saw an item with the same originator item
     // ID, this will fail but give us its iterator.
     auto it_and_success = id_to_index.emplace(
-        candidate->entity->originator_client_item_id, pending_updates_.size());
+        candidate.entity.originator_client_item_id, pending_updates_.size());
     if (it_and_success.second) {
       // New item ID, append at the end. Note that we already inserted the
       // correct index (|pending_updates_.size()|) above.
diff --git a/components/sync/engine_impl/model_type_worker_unittest.cc b/components/sync/engine_impl/model_type_worker_unittest.cc
index 7cc859c08..3150c26 100644
--- a/components/sync/engine_impl/model_type_worker_unittest.cc
+++ b/components/sync/engine_impl/model_type_worker_unittest.cc
@@ -727,7 +727,7 @@
 
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash1));
   const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1);
-  const EntityData& entity = *update.entity;
+  const EntityData& entity = update.entity;
 
   EXPECT_FALSE(entity.id.empty());
   EXPECT_EQ(tag_hash, entity.client_tag_hash);
@@ -757,11 +757,11 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(3u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash);
   ASSERT_TRUE(result[1]);
-  EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity.client_tag_hash);
   ASSERT_TRUE(result[2]);
-  EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity.client_tag_hash);
 }
 
 TEST_F(ModelTypeWorkerTest, ReceiveUpdates_DuplicateHashWithinPartialUpdate) {
@@ -778,8 +778,8 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(1u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash);
-  EXPECT_EQ(kValue2, result[0]->entity->specifics.preference().value());
+  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash);
+  EXPECT_EQ(kValue2, result[0]->entity.specifics.preference().value());
 }
 
 TEST_F(ModelTypeWorkerTest, ReceiveUpdates_DuplicateHashAcrossPartialUpdates) {
@@ -797,8 +797,8 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(1u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash);
-  EXPECT_EQ(kValue2, result[0]->entity->specifics.preference().value());
+  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash);
+  EXPECT_EQ(kValue2, result[0]->entity.specifics.preference().value());
 }
 
 TEST_F(ModelTypeWorkerTest,
@@ -829,9 +829,9 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(2u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(entity1.id_string(), result[0]->entity->id);
+  EXPECT_EQ(entity1.id_string(), result[0]->entity.id);
   ASSERT_TRUE(result[1]);
-  EXPECT_EQ(entity2.id_string(), result[1]->entity->id);
+  EXPECT_EQ(entity2.id_string(), result[1]->entity.id);
 }
 
 TEST_F(ModelTypeWorkerTest, ReceiveUpdates_MultipleDuplicateHashes) {
@@ -856,12 +856,12 @@
   ASSERT_TRUE(result[0]);
   ASSERT_TRUE(result[1]);
   ASSERT_TRUE(result[2]);
-  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity->client_tag_hash);
-  EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity->client_tag_hash);
-  EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity->client_tag_hash);
-  EXPECT_EQ(kValue1, result[0]->entity->specifics.preference().value());
-  EXPECT_EQ(kValue2, result[1]->entity->specifics.preference().value());
-  EXPECT_EQ(kValue3, result[2]->entity->specifics.preference().value());
+  EXPECT_EQ(GenerateTagHash(kTag1), result[0]->entity.client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag2), result[1]->entity.client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag3), result[2]->entity.client_tag_hash);
+  EXPECT_EQ(kValue1, result[0]->entity.specifics.preference().value());
+  EXPECT_EQ(kValue2, result[1]->entity.specifics.preference().value());
+  EXPECT_EQ(kValue3, result[2]->entity.specifics.preference().value());
 }
 
 // Covers the scenario where two updates have the same client tag hash but
@@ -893,7 +893,7 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(1u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(entity2.id_string(), result[0]->entity->id);
+  EXPECT_EQ(entity2.id_string(), result[0]->entity.id);
 }
 
 // Covers the scenario where two updates have the same originator client item ID
@@ -931,7 +931,7 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(1u, result.size());
   ASSERT_TRUE(result[0]);
-  EXPECT_EQ(kURL2, result[0]->entity->specifics.bookmark().url());
+  EXPECT_EQ(kURL2, result[0]->entity.specifics.bookmark().url());
 }
 
 // Test that an update download coming in multiple parts gets accumulated into
@@ -952,9 +952,9 @@
       processor()->GetNthUpdateResponse(0);
   ASSERT_EQ(2U, updates.size());
   ASSERT_TRUE(updates[0]);
-  EXPECT_EQ(GenerateTagHash(kTag1), updates[0]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag1), updates[0]->entity.client_tag_hash);
   ASSERT_TRUE(updates[1]);
-  EXPECT_EQ(GenerateTagHash(kTag2), updates[1]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag2), updates[1]->entity.client_tag_hash);
 
   // A subsequent update doesn't pass the same entities again.
   TriggerUpdateFromServer(10, kTag3, kValue3);
@@ -962,7 +962,7 @@
   updates = processor()->GetNthUpdateResponse(1);
   ASSERT_EQ(1U, updates.size());
   ASSERT_TRUE(updates[0]);
-  EXPECT_EQ(GenerateTagHash(kTag3), updates[0]->entity->client_tag_hash);
+  EXPECT_EQ(GenerateTagHash(kTag3), updates[0]->entity.client_tag_hash);
 }
 
 // Test that updates with no entities behave correctly.
@@ -1109,8 +1109,8 @@
   // Test some basic properties regarding the update.
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash1));
   const UpdateResponseData& update1 = processor()->GetUpdateResponse(kHash1);
-  EXPECT_EQ(kTag1, update1.entity->specifics.preference().name());
-  EXPECT_EQ(kValue1, update1.entity->specifics.preference().value());
+  EXPECT_EQ(kTag1, update1.entity.specifics.preference().name());
+  EXPECT_EQ(kValue1, update1.entity.specifics.preference().value());
   EXPECT_TRUE(update1.encryption_key_name.empty());
 
   // Set received updates to be encrypted using the new nigori.
@@ -1122,8 +1122,8 @@
   // Test its basic features and the value of encryption_key_name.
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash2));
   const UpdateResponseData& update2 = processor()->GetUpdateResponse(kHash2);
-  EXPECT_EQ(kTag2, update2.entity->specifics.preference().name());
-  EXPECT_EQ(kValue2, update2.entity->specifics.preference().value());
+  EXPECT_EQ(kTag2, update2.entity.specifics.preference().name());
+  EXPECT_EQ(kValue2, update2.entity.specifics.preference().value());
   EXPECT_FALSE(update2.encryption_key_name.empty());
 }
 
@@ -1249,8 +1249,8 @@
   EXPECT_EQ(1U, processor()->GetNumUpdateResponses());
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash1));
   const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1);
-  EXPECT_EQ(kTag1, update.entity->specifics.preference().name());
-  EXPECT_EQ(kValue1, update.entity->specifics.preference().value());
+  EXPECT_EQ(kTag1, update.entity.specifics.preference().name());
+  EXPECT_EQ(kValue1, update.entity.specifics.preference().value());
   EXPECT_EQ(GetLocalCryptographerKeyName(), update.encryption_key_name);
 }
 
@@ -1383,7 +1383,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, PREFERENCES, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_FALSE(data.id.empty());
   EXPECT_FALSE(data.parent_id.empty());
   EXPECT_FALSE(data.is_folder);
@@ -1417,7 +1417,7 @@
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
 
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   // A tombstone should remain a tombstone after populating the response data.
   EXPECT_TRUE(data.is_deleted());
 }
@@ -1440,7 +1440,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_TRUE(
       syncer::UniquePosition::FromProto(data.unique_position).IsValid());
 
@@ -1468,7 +1468,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_TRUE(
       syncer::UniquePosition::FromProto(data.unique_position).IsValid());
 
@@ -1496,7 +1496,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_TRUE(
       syncer::UniquePosition::FromProto(data.unique_position).IsValid());
   histogram_tester.ExpectUniqueSample(
@@ -1525,7 +1525,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_FALSE(
       syncer::UniquePosition::FromProto(data.unique_position).IsValid());
   histogram_tester.ExpectUniqueSample("Sync.Entities.PositioningScheme",
@@ -1549,7 +1549,7 @@
   EXPECT_EQ(ModelTypeWorker::SUCCESS,
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, PREFERENCES, entity, &response_data));
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
   EXPECT_FALSE(
       syncer::UniquePosition::FromProto(data.unique_position).IsValid());
   histogram_tester.ExpectTotalCount("Sync.Entities.PositioningScheme",
@@ -1576,7 +1576,7 @@
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
 
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
 
   EXPECT_EQ(kGuid1, data.specifics.bookmark().guid());
   EXPECT_EQ(kGuid2, data.originator_client_item_id);
@@ -1601,7 +1601,7 @@
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
 
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
 
   EXPECT_EQ(kGuid1, data.originator_client_item_id);
   EXPECT_EQ(kGuid1, data.specifics.bookmark().guid());
@@ -1627,7 +1627,7 @@
             ModelTypeWorker::PopulateUpdateResponseData(
                 &cryptographer, BOOKMARKS, entity, &response_data));
 
-  const EntityData& data = *response_data.entity;
+  const EntityData& data = response_data.entity;
 
   EXPECT_EQ(kInvalidOCII, data.originator_client_item_id);
   EXPECT_TRUE(data.specifics.bookmark().guid().empty());
@@ -1650,7 +1650,7 @@
                 &cryptographer, AUTOFILL_WALLET_DATA, entity, &response_data));
 
   // The client tag hash gets filled in by the worker.
-  EXPECT_FALSE(response_data.entity->client_tag_hash.value().empty());
+  EXPECT_FALSE(response_data.entity.client_tag_hash.value().empty());
 }
 
 class GetLocalChangesRequestTest : public testing::Test {
@@ -1818,11 +1818,11 @@
   // Test its basic features and the value of encryption_key_name.
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash1));
   const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1);
-  EXPECT_FALSE(update.entity->specifics.password().has_encrypted());
-  EXPECT_FALSE(update.entity->specifics.has_encrypted());
+  EXPECT_FALSE(update.entity.specifics.password().has_encrypted());
+  EXPECT_FALSE(update.entity.specifics.has_encrypted());
   ASSERT_TRUE(
-      update.entity->specifics.password().has_client_only_encrypted_data());
-  EXPECT_EQ(kPassword, update.entity->specifics.password()
+      update.entity.specifics.password().has_client_only_encrypted_data());
+  EXPECT_EQ(kPassword, update.entity.specifics.password()
                            .client_only_encrypted_data()
                            .password_value());
 }
@@ -1895,11 +1895,11 @@
   ASSERT_TRUE(processor()->HasUpdateResponse(kHash1));
   const UpdateResponseData& update = processor()->GetUpdateResponse(kHash1);
   // Password should now be decrypted and sent to the processor.
-  EXPECT_TRUE(update.entity->specifics.has_password());
-  EXPECT_FALSE(update.entity->specifics.password().has_encrypted());
+  EXPECT_TRUE(update.entity.specifics.has_password());
+  EXPECT_FALSE(update.entity.specifics.password().has_encrypted());
   ASSERT_TRUE(
-      update.entity->specifics.password().has_client_only_encrypted_data());
-  EXPECT_EQ(kPassword, update.entity->specifics.password()
+      update.entity.specifics.password().has_client_only_encrypted_data());
+  EXPECT_EQ(kPassword, update.entity.specifics.password()
                            .client_only_encrypted_data()
                            .password_value());
 }
@@ -1985,12 +1985,12 @@
   EXPECT_EQ(kGuid1, processor()
                         ->GetNthUpdateResponse(1)
                         .at(0)
-                        ->entity->originator_client_item_id);
+                        ->entity.originator_client_item_id);
 
   EXPECT_EQ(kGuid1, processor()
                         ->GetNthUpdateResponse(1)
                         .at(0)
-                        ->entity->specifics.bookmark()
+                        ->entity.specifics.bookmark()
                         .guid());
 }
 
@@ -2034,12 +2034,12 @@
   EXPECT_EQ(kInvalidOCII, processor()
                               ->GetNthUpdateResponse(1)
                               .at(0)
-                              ->entity->originator_client_item_id);
+                              ->entity.originator_client_item_id);
 
   EXPECT_EQ("", processor()
                     ->GetNthUpdateResponse(1)
                     .at(0)
-                    ->entity->specifics.bookmark()
+                    ->entity.specifics.bookmark()
                     .guid());
 }
 
@@ -2075,12 +2075,12 @@
   EXPECT_EQ(kGuid1, processor()
                         ->GetNthUpdateResponse(0)
                         .at(0)
-                        ->entity->originator_client_item_id);
+                        ->entity.originator_client_item_id);
 
   EXPECT_EQ(kGuid1, processor()
                         ->GetNthUpdateResponse(0)
                         .at(0)
-                        ->entity->specifics.bookmark()
+                        ->entity.specifics.bookmark()
                         .guid());
 }
 
@@ -2117,12 +2117,12 @@
   EXPECT_EQ(kInvalidOCII, processor()
                               ->GetNthUpdateResponse(0)
                               .at(0)
-                              ->entity->originator_client_item_id);
+                              ->entity.originator_client_item_id);
 
   EXPECT_TRUE(processor()
                   ->GetNthUpdateResponse(0)
                   .at(0)
-                  ->entity->specifics.bookmark()
+                  ->entity.specifics.bookmark()
                   .guid()
                   .empty());
 }
diff --git a/components/sync/engine_impl/uss_migrator_unittest.cc b/components/sync/engine_impl/uss_migrator_unittest.cc
index 70d0561..ce9a443 100644
--- a/components/sync/engine_impl/uss_migrator_unittest.cc
+++ b/components/sync/engine_impl/uss_migrator_unittest.cc
@@ -135,7 +135,7 @@
   const UpdateResponseData* update =
       std::move(processor()->GetNthUpdateResponse(0).at(0));
   ASSERT_TRUE(update);
-  const EntityData& entity = *update->entity;
+  const EntityData& entity = update->entity;
 
   EXPECT_FALSE(entity.id.empty());
   EXPECT_EQ(GenerateTagHash(kTag1), entity.client_tag_hash);
@@ -167,11 +167,11 @@
   std::vector<const UpdateResponseData*> updates =
       processor()->GetNthUpdateResponse(0);
   ASSERT_TRUE(updates.at(0));
-  EXPECT_EQ(kTag1, updates.at(0)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag1, updates.at(0)->entity.specifics.preference().name());
   ASSERT_TRUE(updates.at(1));
-  EXPECT_EQ(kTag2, updates.at(1)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag2, updates.at(1)->entity.specifics.preference().name());
   ASSERT_TRUE(updates.at(2));
-  EXPECT_EQ(kTag3, updates.at(2)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag3, updates.at(2)->entity.specifics.preference().name());
 
   const sync_pb::ModelTypeState& state = processor()->GetNthUpdateState(0);
   EXPECT_EQ(kToken1, state.progress_marker().token());
@@ -201,11 +201,11 @@
   std::vector<const UpdateResponseData*> updates =
       processor()->GetNthUpdateResponse(0);
   ASSERT_TRUE(updates.at(0));
-  EXPECT_EQ(kTag1, updates.at(0)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag1, updates.at(0)->entity.specifics.preference().name());
   ASSERT_TRUE(updates.at(1));
-  EXPECT_EQ(kTag2, updates.at(1)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag2, updates.at(1)->entity.specifics.preference().name());
   ASSERT_TRUE(updates.at(2));
-  EXPECT_EQ(kTag3, updates.at(2)->entity->specifics.preference().name());
+  EXPECT_EQ(kTag3, updates.at(2)->entity.specifics.preference().name());
 
   const sync_pb::ModelTypeState& state = processor()->GetNthUpdateState(0);
   EXPECT_EQ(kToken1, state.progress_marker().token());
diff --git a/components/sync/model/entity_change.cc b/components/sync/model/entity_change.cc
index b7726d3..95f26381 100644
--- a/components/sync/model/entity_change.cc
+++ b/components/sync/model/entity_change.cc
@@ -13,7 +13,7 @@
 // static
 std::unique_ptr<EntityChange> EntityChange::CreateAdd(
     const std::string& storage_key,
-    std::unique_ptr<EntityData> data) {
+    EntityData data) {
   return base::WrapUnique(
       new EntityChange(storage_key, ACTION_ADD, std::move(data)));
 }
@@ -21,7 +21,7 @@
 // static
 std::unique_ptr<EntityChange> EntityChange::CreateUpdate(
     const std::string& storage_key,
-    std::unique_ptr<EntityData> data) {
+    EntityData data) {
   return base::WrapUnique(
       new EntityChange(storage_key, ACTION_UPDATE, std::move(data)));
 }
@@ -30,12 +30,12 @@
 std::unique_ptr<EntityChange> EntityChange::CreateDelete(
     const std::string& storage_key) {
   return base::WrapUnique(
-      new EntityChange(storage_key, ACTION_DELETE, nullptr));
+      new EntityChange(storage_key, ACTION_DELETE, EntityData()));
 }
 
 EntityChange::EntityChange(const std::string& storage_key,
                            ChangeType type,
-                           std::unique_ptr<EntityData> data)
+                           EntityData data)
     : storage_key_(storage_key), type_(type), data_(std::move(data)) {}
 
 EntityChange::~EntityChange() {}
diff --git a/components/sync/model/entity_change.h b/components/sync/model/entity_change.h
index 01ec2893..be421fd 100644
--- a/components/sync/model/entity_change.h
+++ b/components/sync/model/entity_change.h
@@ -18,12 +18,11 @@
  public:
   enum ChangeType { ACTION_ADD, ACTION_UPDATE, ACTION_DELETE };
 
-  static std::unique_ptr<EntityChange> CreateAdd(
-      const std::string& storage_key,
-      std::unique_ptr<EntityData> data);
+  static std::unique_ptr<EntityChange> CreateAdd(const std::string& storage_key,
+                                                 EntityData data);
   static std::unique_ptr<EntityChange> CreateUpdate(
       const std::string& storage_key,
-      std::unique_ptr<EntityData> data);
+      EntityData data);
   static std::unique_ptr<EntityChange> CreateDelete(
       const std::string& storage_key);
 
@@ -31,16 +30,16 @@
 
   std::string storage_key() const { return storage_key_; }
   ChangeType type() const { return type_; }
-  const EntityData& data() const { return *data_; }
+  const EntityData& data() const { return data_; }
 
  private:
   EntityChange(const std::string& storage_key,
                ChangeType type,
-               std::unique_ptr<EntityData> data);
+               EntityData data);
 
   std::string storage_key_;
   ChangeType type_;
-  std::unique_ptr<EntityData> data_;
+  EntityData data_;
 
   DISALLOW_COPY_AND_ASSIGN(EntityChange);
 };
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc
index 49f8284c..ad89860 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor.cc
+++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -765,14 +765,13 @@
   model_type_state_ = model_type_state;
   metadata_changes->UpdateModelTypeState(model_type_state_);
 
-  for (const std::unique_ptr<syncer::UpdateResponseData>& update : updates) {
-    DCHECK(update);
-    const ClientTagHash& client_tag_hash = update->entity->client_tag_hash;
+  for (syncer::UpdateResponseData& update : updates) {
+    const ClientTagHash& client_tag_hash = update.entity.client_tag_hash;
     if (client_tag_hash.value().empty()) {
       // Ignore updates missing a client tag hash (e.g. permanent nodes).
       continue;
     }
-    if (update->entity->is_deleted()) {
+    if (update.entity.is_deleted()) {
       DLOG(WARNING) << "Ignoring tombstone found during initial update: "
                     << "client_tag_hash = " << client_tag_hash << " for "
                     << ModelTypeToString(type_);
@@ -780,7 +779,7 @@
     }
     if (bridge_->SupportsGetClientTag() &&
         client_tag_hash != ClientTagHash::FromUnhashed(
-                               type_, bridge_->GetClientTag(*update->entity))) {
+                               type_, bridge_->GetClientTag(update.entity))) {
       DLOG(WARNING) << "Received unexpected client tag hash: "
                     << client_tag_hash << " for " << ModelTypeToString(type_);
       continue;
@@ -795,11 +794,11 @@
                   << " for " << ModelTypeToString(type_);
     }
 #endif  // DCHECK_IS_ON()
-    ProcessorEntity* entity = CreateEntity(*update->entity);
-    entity->RecordAcceptedUpdate(*update);
+    ProcessorEntity* entity = CreateEntity(update.entity);
+    entity->RecordAcceptedUpdate(update);
     const std::string& storage_key = entity->storage_key();
     entity_data.push_back(
-        EntityChange::CreateAdd(storage_key, std::move(update->entity)));
+        EntityChange::CreateAdd(storage_key, std::move(update.entity)));
     if (!storage_key.empty())
       metadata_changes->UpdateMetadata(storage_key, entity->metadata());
   }
diff --git a/components/sync/model_impl/client_tag_based_remote_update_handler.cc b/components/sync/model_impl/client_tag_based_remote_update_handler.cc
index 19c9830..ef4338d 100644
--- a/components/sync/model_impl/client_tag_based_remote_update_handler.cc
+++ b/components/sync/model_impl/client_tag_based_remote_update_handler.cc
@@ -74,8 +74,7 @@
   // re-encryption phase at the end.
   std::unordered_set<std::string> already_updated;
 
-  for (std::unique_ptr<syncer::UpdateResponseData>& update : updates) {
-    DCHECK(update);
+  for (syncer::UpdateResponseData& update : updates) {
     std::string storage_key_to_clear;
     ProcessorEntity* entity = ProcessUpdate(std::move(update), &entity_changes,
                                             &storage_key_to_clear);
@@ -138,10 +137,10 @@
 }
 
 ProcessorEntity* ClientTagBasedRemoteUpdateHandler::ProcessUpdate(
-    std::unique_ptr<UpdateResponseData> update,
+    UpdateResponseData update,
     EntityChangeList* entity_changes,
     std::string* storage_key_to_clear) {
-  const EntityData& data = *update->entity;
+  const EntityData& data = update.entity;
   const ClientTagHash& client_tag_hash = data.client_tag_hash;
 
   // Filter out updates without a client tag hash (including permanent nodes,
@@ -171,17 +170,17 @@
   }
 
   if (entity) {
-    entity->RecordEntityUpdateLatency(update->response_version, type_);
+    entity->RecordEntityUpdateLatency(update.response_version, type_);
   }
 
-  if (entity && entity->UpdateIsReflection(update->response_version)) {
+  if (entity && entity->UpdateIsReflection(update.response_version)) {
     // Seen this update before; just ignore it.
     return nullptr;
   }
 
   // Cache update encryption key name in case |update| will be moved away into
   // ResolveConflict().
-  const std::string update_encryption_key_name = update->encryption_key_name;
+  const std::string update_encryption_key_name = update.encryption_key_name;
   ConflictResolution resolution_type = ConflictResolution::kTypeSize;
   if (entity && entity->IsUnsynced()) {
     // Handle conflict resolution.
@@ -202,13 +201,13 @@
     } else if (!entity->MatchesData(data)) {
       change_type = EntityChange::ACTION_UPDATE;
     }
-    entity->RecordAcceptedUpdate(*update);
+    entity->RecordAcceptedUpdate(update);
     // Inform the bridge about the changes if needed.
     if (change_type) {
       switch (change_type.value()) {
         case EntityChange::ACTION_ADD:
           entity_changes->push_back(EntityChange::CreateAdd(
-              entity->storage_key(), std::move(update->entity)));
+              entity->storage_key(), std::move(update.entity)));
           break;
         case EntityChange::ACTION_DELETE:
           // The entity was deleted; inform the bridge. Note that the local data
@@ -220,7 +219,7 @@
         case EntityChange::ACTION_UPDATE:
           // Specifics have changed, so update the bridge.
           entity_changes->push_back(EntityChange::CreateUpdate(
-              entity->storage_key(), std::move(update->entity)));
+              entity->storage_key(), std::move(update.entity)));
           break;
       }
     }
@@ -262,11 +261,11 @@
 }
 
 ConflictResolution ClientTagBasedRemoteUpdateHandler::ResolveConflict(
-    std::unique_ptr<UpdateResponseData> update,
+    UpdateResponseData update,
     ProcessorEntity* entity,
     EntityChangeList* changes,
     std::string* storage_key_to_clear) {
-  const EntityData& remote_data = *update->entity;
+  const EntityData& remote_data = update.entity;
 
   ConflictResolution resolution_type = ConflictResolution::kTypeSize;
 
@@ -296,27 +295,27 @@
   switch (resolution_type) {
     case ConflictResolution::kChangesMatch:
       // Record the update and squash the pending commit.
-      entity->RecordForcedUpdate(*update);
+      entity->RecordForcedUpdate(update);
       break;
     case ConflictResolution::kUseLocal:
     case ConflictResolution::kIgnoreRemoteEncryption:
       // Record that we received the update from the server but leave the
       // pending commit intact.
-      entity->RecordIgnoredUpdate(*update);
+      entity->RecordIgnoredUpdate(update);
       break;
     case ConflictResolution::kUseRemote:
     case ConflictResolution::kIgnoreLocalEncryption:
       // Update client data to match server.
-      if (update->entity->is_deleted()) {
+      if (update.entity.is_deleted()) {
         DCHECK(!entity->metadata().is_deleted());
         // Squash the pending commit.
-        entity->RecordForcedUpdate(*update);
+        entity->RecordForcedUpdate(update);
         changes->push_back(EntityChange::CreateDelete(entity->storage_key()));
       } else if (!entity->metadata().is_deleted()) {
         // Squash the pending commit.
-        entity->RecordForcedUpdate(*update);
+        entity->RecordForcedUpdate(update);
         changes->push_back(EntityChange::CreateUpdate(
-            entity->storage_key(), std::move(update->entity)));
+            entity->storage_key(), std::move(update.entity)));
       } else {
         // Remote undeletion. This could imply a new storage key for some
         // bridges, so we may need to wait until UpdateStorageKey() is called.
@@ -325,9 +324,9 @@
           entity->ClearStorageKey();
         }
         // Squash the pending commit.
-        entity->RecordForcedUpdate(*update);
+        entity->RecordForcedUpdate(update);
         changes->push_back(EntityChange::CreateAdd(entity->storage_key(),
-                                                   std::move(update->entity)));
+                                                   std::move(update.entity)));
       }
       break;
     case ConflictResolution::kUseNewDEPRECATED:
diff --git a/components/sync/model_impl/client_tag_based_remote_update_handler.h b/components/sync/model_impl/client_tag_based_remote_update_handler.h
index 58bcf8d..86f2e97 100644
--- a/components/sync/model_impl/client_tag_based_remote_update_handler.h
+++ b/components/sync/model_impl/client_tag_based_remote_update_handler.h
@@ -59,7 +59,7 @@
   // |storage_key_to_clear| must not be null and allows the implementation to
   // indicate that a certain storage key is now obsolete and should be cleared,
   // which is leveraged in certain conflict resolution scenarios.
-  ProcessorEntity* ProcessUpdate(std::unique_ptr<UpdateResponseData> update,
+  ProcessorEntity* ProcessUpdate(UpdateResponseData update,
                                  EntityChangeList* entity_changes,
                                  std::string* storage_key_to_clear);
 
@@ -69,7 +69,7 @@
       MetadataChangeList* metadata_changes);
 
   // Resolve a conflict between |update| and the pending commit in |entity|.
-  ConflictResolution ResolveConflict(std::unique_ptr<UpdateResponseData> update,
+  ConflictResolution ResolveConflict(UpdateResponseData update,
                                      ProcessorEntity* entity,
                                      EntityChangeList* changes,
                                      std::string* storage_key_to_clear);
diff --git a/components/sync/model_impl/processor_entity.cc b/components/sync/model_impl/processor_entity.cc
index dd36b8e..2cefabd 100644
--- a/components/sync/model_impl/processor_entity.cc
+++ b/components/sync/model_impl/processor_entity.cc
@@ -179,8 +179,8 @@
 
 void ProcessorEntity::RecordIgnoredUpdate(const UpdateResponseData& update) {
   DCHECK(metadata_.server_id().empty() ||
-         metadata_.server_id() == update.entity->id);
-  metadata_.set_server_id(update.entity->id);
+         metadata_.server_id() == update.entity.id);
+  metadata_.set_server_id(update.entity.id);
   metadata_.set_server_version(update.response_version);
   // Either these already matched, acked was just bumped to squash a pending
   // commit and this should follow, or the pending commit needs to be requeued.
@@ -196,10 +196,10 @@
 void ProcessorEntity::RecordAcceptedUpdate(const UpdateResponseData& update) {
   DCHECK(!IsUnsynced());
   RecordIgnoredUpdate(update);
-  metadata_.set_is_deleted(update.entity->is_deleted());
+  metadata_.set_is_deleted(update.entity.is_deleted());
   metadata_.set_modification_time(
-      TimeToProtoTime(update.entity->modification_time));
-  UpdateSpecificsHash(update.entity->specifics);
+      TimeToProtoTime(update.entity.modification_time));
+  UpdateSpecificsHash(update.entity.specifics);
 }
 
 void ProcessorEntity::RecordForcedUpdate(const UpdateResponseData& update) {
diff --git a/components/sync/model_impl/processor_entity_unittest.cc b/components/sync/model_impl/processor_entity_unittest.cc
index 810dae10..e5f6d40 100644
--- a/components/sync/model_impl/processor_entity_unittest.cc
+++ b/components/sync/model_impl/processor_entity_unittest.cc
@@ -47,38 +47,36 @@
   return entity_data;
 }
 
-std::unique_ptr<UpdateResponseData> GenerateUpdate(
-    const ProcessorEntity& entity,
-    const ClientTagHash& hash,
-    const std::string& id,
-    const std::string& name,
-    const std::string& value,
-    const base::Time& mtime,
-    int64_t version) {
+UpdateResponseData GenerateUpdate(const ProcessorEntity& entity,
+                                  const ClientTagHash& hash,
+                                  const std::string& id,
+                                  const std::string& name,
+                                  const std::string& value,
+                                  const base::Time& mtime,
+                                  int64_t version) {
   std::unique_ptr<EntityData> data = GenerateEntityData(hash, name, value);
   data->id = id;
   data->modification_time = mtime;
-  auto update = std::make_unique<UpdateResponseData>();
-  update->entity = std::move(data);
-  update->response_version = version;
+  UpdateResponseData update;
+  update.entity = std::move(*data);
+  update.response_version = version;
   return update;
 }
 
-std::unique_ptr<UpdateResponseData> GenerateTombstone(
-    const ProcessorEntity& entity,
-    const ClientTagHash& hash,
-    const std::string& id,
-    const std::string& name,
-    const base::Time& mtime,
-    int64_t version) {
+UpdateResponseData GenerateTombstone(const ProcessorEntity& entity,
+                                     const ClientTagHash& hash,
+                                     const std::string& id,
+                                     const std::string& name,
+                                     const base::Time& mtime,
+                                     int64_t version) {
   std::unique_ptr<EntityData> data = std::make_unique<EntityData>();
   data->client_tag_hash = hash;
   data->name = name;
   data->id = id;
   data->modification_time = mtime;
-  auto update = std::make_unique<UpdateResponseData>();
-  update->entity = std::move(data);
-  update->response_version = version;
+  UpdateResponseData update;
+  update.entity = std::move(*data);
+  update.response_version = version;
   return update;
 }
 
@@ -121,9 +119,9 @@
 
   std::unique_ptr<ProcessorEntity> CreateSynced() {
     std::unique_ptr<ProcessorEntity> entity = CreateNew();
-    std::unique_ptr<UpdateResponseData> update =
+    UpdateResponseData update =
         GenerateUpdate(*entity, kHash, kId, kName, kValue1, ctime_, 1);
-    entity->RecordAcceptedUpdate(*update);
+    entity->RecordAcceptedUpdate(update);
     DCHECK(!entity->IsUnsynced());
     return entity;
   }
@@ -238,9 +236,9 @@
   std::unique_ptr<ProcessorEntity> entity = CreateNew();
 
   const base::Time mtime = base::Time::Now();
-  std::unique_ptr<UpdateResponseData> update =
+  UpdateResponseData update =
       GenerateUpdate(*entity, kHash, kId, kName, kValue1, mtime, 10);
-  entity->RecordAcceptedUpdate(*update);
+  entity->RecordAcceptedUpdate(update);
 
   EXPECT_EQ(kId, entity->metadata().server_id());
   EXPECT_FALSE(entity->metadata().is_deleted());
@@ -269,9 +267,9 @@
   EXPECT_EQ("", entity->storage_key());
 
   const base::Time mtime = base::Time::Now();
-  std::unique_ptr<UpdateResponseData> update =
+  UpdateResponseData update =
       GenerateUpdate(*entity, kHash, kId, kName, kValue1, mtime, 10);
-  entity->RecordAcceptedUpdate(*update);
+  entity->RecordAcceptedUpdate(update);
   entity->SetStorageKey(kKey);
   EXPECT_EQ(kKey, entity->storage_key());
 }
@@ -281,9 +279,9 @@
   std::unique_ptr<ProcessorEntity> entity = CreateNew();
 
   const base::Time mtime = base::Time::Now();
-  std::unique_ptr<UpdateResponseData> tombstone =
+  UpdateResponseData tombstone =
       GenerateTombstone(*entity, kHash, kId, kName, mtime, 1);
-  entity->RecordAcceptedUpdate(*tombstone);
+  entity->RecordAcceptedUpdate(tombstone);
 
   EXPECT_EQ(kId, entity->metadata().server_id());
   EXPECT_TRUE(entity->metadata().is_deleted());
@@ -309,9 +307,9 @@
   std::unique_ptr<ProcessorEntity> entity = CreateSynced();
   // A deletion update one version later.
   const base::Time mtime = base::Time::Now();
-  std::unique_ptr<UpdateResponseData> tombstone =
+  UpdateResponseData tombstone =
       GenerateTombstone(*entity, kHash, kId, kName, mtime, 2);
-  entity->RecordAcceptedUpdate(*tombstone);
+  entity->RecordAcceptedUpdate(tombstone);
 
   EXPECT_TRUE(entity->metadata().is_deleted());
   EXPECT_EQ(0, entity->metadata().sequence_number());
@@ -577,9 +575,9 @@
 
   // Before anything gets committed, we receive a remote tombstone, but local
   // would usually win so the remote update is ignored.
-  std::unique_ptr<UpdateResponseData> tombstone =
+  UpdateResponseData tombstone =
       GenerateTombstone(*entity, kHash, kId, kName, base::Time::Now(), 2);
-  entity->RecordIgnoredUpdate(*tombstone);
+  entity->RecordIgnoredUpdate(tombstone);
 
   EXPECT_EQ(kId, entity->metadata().server_id());
   EXPECT_TRUE(entity->IsUnsynced());
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc
index 0633602..982eba90 100644
--- a/components/sync/nigori/nigori_model_type_processor.cc
+++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -132,12 +132,12 @@
     if (updates.empty()) {
       error = bridge_->MergeSyncData(base::nullopt);
     } else {
-      DCHECK(!updates[0]->entity->is_deleted());
+      DCHECK(!updates[0].entity.is_deleted());
       entity_ = ProcessorEntity::CreateNew(
           kNigoriStorageKey, ClientTagHash::FromHashed(kRawNigoriClientTagHash),
-          updates[0]->entity->id, updates[0]->entity->creation_time);
-      entity_->RecordAcceptedUpdate(*updates[0]);
-      error = bridge_->MergeSyncData(std::move(*updates[0]->entity));
+          updates[0].entity.id, updates[0].entity.creation_time);
+      entity_->RecordAcceptedUpdate(updates[0]);
+      error = bridge_->MergeSyncData(std::move(updates[0].entity));
     }
     if (error) {
       ReportError(*error);
@@ -153,9 +153,9 @@
   DCHECK(entity_);
   // We assume the bridge will issue errors in case of deletions. Therefore, we
   // are adding the following DCHECK to simplify the code.
-  DCHECK(!updates[0]->entity->is_deleted());
+  DCHECK(!updates[0].entity.is_deleted());
 
-  if (entity_->UpdateIsReflection(updates[0]->response_version)) {
+  if (entity_->UpdateIsReflection(updates[0].response_version)) {
     // Seen this update before; just ignore it.
     bridge_->ApplySyncChanges(/*data=*/base::nullopt);
     return;
@@ -164,18 +164,18 @@
   if (entity_->IsUnsynced()) {
     // Remote update always win in case of conflict, because bridge takes care
     // of reapplying pending local changes after processing the remote update.
-    entity_->RecordForcedUpdate(*updates[0]);
-    error = bridge_->ApplySyncChanges(std::move(*updates[0]->entity));
+    entity_->RecordForcedUpdate(updates[0]);
+    error = bridge_->ApplySyncChanges(std::move(updates[0].entity));
     UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
                               ConflictResolution::kUseRemote,
                               ConflictResolution::kTypeSize);
     UMA_HISTOGRAM_ENUMERATION("Sync.ResolveSimpleConflict",
                               ConflictResolver::NIGORI_MERGE,
                               ConflictResolver::CONFLICT_RESOLUTION_SIZE);
-  } else if (!entity_->MatchesData(*updates[0]->entity)) {
+  } else if (!entity_->MatchesData(updates[0].entity)) {
     // Inform the bridge of the new or updated data.
-    entity_->RecordAcceptedUpdate(*updates[0]);
-    error = bridge_->ApplySyncChanges(std::move(*updates[0]->entity));
+    entity_->RecordAcceptedUpdate(updates[0]);
+    error = bridge_->ApplySyncChanges(std::move(updates[0].entity));
   }
 
   if (error) {
diff --git a/components/sync/nigori/nigori_model_type_processor_unittest.cc b/components/sync/nigori/nigori_model_type_processor_unittest.cc
index 46a0995..8bd7033 100644
--- a/components/sync/nigori/nigori_model_type_processor_unittest.cc
+++ b/components/sync/nigori/nigori_model_type_processor_unittest.cc
@@ -53,21 +53,21 @@
 
 // Creates a dummy Nigori UpdateResponseData that has the keystore decryptor
 // token key name set.
-std::unique_ptr<syncer::UpdateResponseData> CreateDummyNigoriUpdateResponseData(
+syncer::UpdateResponseData CreateDummyNigoriUpdateResponseData(
     const std::string keystore_decryptor_token_key_name,
     int response_version) {
-  auto entity_data = std::make_unique<syncer::EntityData>();
-  entity_data->is_folder = true;
-  entity_data->id = kNigoriServerId;
+  syncer::EntityData entity_data;
+  entity_data.is_folder = true;
+  entity_data.id = kNigoriServerId;
   sync_pb::NigoriSpecifics* nigori_specifics =
-      entity_data->specifics.mutable_nigori();
+      entity_data.specifics.mutable_nigori();
   nigori_specifics->mutable_keystore_decryptor_token()->set_key_name(
       keystore_decryptor_token_key_name);
-  entity_data->name = kNigoriNonUniqueName;
+  entity_data.name = kNigoriNonUniqueName;
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(entity_data);
-  response_data->response_version = response_version;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(entity_data);
+  response_data.response_version = response_version;
   return response_data;
 }
 
diff --git a/components/sync/test/engine/mock_model_type_processor.cc b/components/sync/test/engine/mock_model_type_processor.cc
index b8e133b..03e5606 100644
--- a/components/sync/test/engine/mock_model_type_processor.cc
+++ b/components/sync/test/engine/mock_model_type_processor.cc
@@ -137,9 +137,8 @@
 MockModelTypeProcessor::GetNthUpdateResponse(size_t n) const {
   DCHECK_LT(n, GetNumUpdateResponses());
   std::vector<const UpdateResponseData*> nth_update_responses;
-  for (const std::unique_ptr<UpdateResponseData>& response :
-       received_update_responses_[n]) {
-    nth_update_responses.push_back(response.get());
+  for (const UpdateResponseData& response : received_update_responses_[n]) {
+    nth_update_responses.push_back(&response);
   }
   return nth_update_responses;
 }
@@ -236,12 +235,12 @@
     UpdateResponseDataList response_list) {
   type_states_received_on_update_.push_back(type_state);
   for (auto it = response_list.begin(); it != response_list.end(); ++it) {
-    const ClientTagHash& client_tag_hash = (*it)->entity->client_tag_hash;
+    const ClientTagHash& client_tag_hash = it->entity.client_tag_hash;
     // Server wins.  Set the model's base version.
-    SetBaseVersion(client_tag_hash, (*it)->response_version);
-    SetServerAssignedId(client_tag_hash, (*it)->entity->id);
+    SetBaseVersion(client_tag_hash, it->response_version);
+    SetServerAssignedId(client_tag_hash, it->entity.id);
 
-    update_response_items_.insert(std::make_pair(client_tag_hash, it->get()));
+    update_response_items_.insert(std::make_pair(client_tag_hash, &(*it)));
   }
   received_update_responses_.push_back(std::move(response_list));
 }
diff --git a/components/sync/test/engine/mock_model_type_worker.cc b/components/sync/test/engine/mock_model_type_worker.cc
index a36e332..eed5c2f5 100644
--- a/components/sync/test/engine/mock_model_type_worker.cc
+++ b/components/sync/test/engine/mock_model_type_worker.cc
@@ -151,8 +151,7 @@
   processor_->OnUpdateReceived(model_type_state_, std::move(updates));
 }
 
-std::unique_ptr<syncer::UpdateResponseData>
-MockModelTypeWorker::GenerateUpdateData(
+syncer::UpdateResponseData MockModelTypeWorker::GenerateUpdateData(
     const ClientTagHash& tag_hash,
     const sync_pb::EntitySpecifics& specifics,
     int64_t version_offset,
@@ -164,51 +163,50 @@
     SetServerVersion(tag_hash, version);
   }
 
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = GenerateId(tag_hash);
-  data->client_tag_hash = tag_hash;
-  data->specifics = specifics;
+  syncer::EntityData data;
+  data.id = GenerateId(tag_hash);
+  data.client_tag_hash = tag_hash;
+  data.specifics = specifics;
   // These elements should have no effect on behavior, but we set them anyway
   // so we can test they are properly copied around the system if we want to.
-  data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
-  data->modification_time =
-      data->creation_time + base::TimeDelta::FromSeconds(version);
-  data->name = data->specifics.has_encrypted()
-                   ? "encrypted"
-                   : data->specifics.preference().name();
+  data.creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
+  data.modification_time =
+      data.creation_time + base::TimeDelta::FromSeconds(version);
+  data.name = data.specifics.has_encrypted()
+                  ? "encrypted"
+                  : data.specifics.preference().name();
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
-  response_data->response_version = version;
-  response_data->encryption_key_name = ekn;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
+  response_data.response_version = version;
+  response_data.encryption_key_name = ekn;
 
   return response_data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData>
-MockModelTypeWorker::GenerateUpdateData(
+syncer::UpdateResponseData MockModelTypeWorker::GenerateUpdateData(
     const ClientTagHash& tag_hash,
     const sync_pb::EntitySpecifics& specifics) {
   return GenerateUpdateData(tag_hash, specifics, 1,
                             model_type_state_.encryption_key_name());
 }
 
-std::unique_ptr<syncer::UpdateResponseData>
-MockModelTypeWorker::GenerateTypeRootUpdateData(const ModelType& model_type) {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = syncer::ModelTypeToRootTag(model_type);
-  data->parent_id = "r";
-  data->server_defined_unique_tag = syncer::ModelTypeToRootTag(model_type);
-  syncer::AddDefaultFieldValue(model_type, &data->specifics);
+syncer::UpdateResponseData MockModelTypeWorker::GenerateTypeRootUpdateData(
+    const ModelType& model_type) {
+  syncer::EntityData data;
+  data.id = syncer::ModelTypeToRootTag(model_type);
+  data.parent_id = "r";
+  data.server_defined_unique_tag = syncer::ModelTypeToRootTag(model_type);
+  syncer::AddDefaultFieldValue(model_type, &data.specifics);
   // These elements should have no effect on behavior, but we set them anyway
   // so we can test they are properly copied around the system if we want to.
-  data->creation_time = base::Time::UnixEpoch();
-  data->modification_time = base::Time::UnixEpoch();
+  data.creation_time = base::Time::UnixEpoch();
+  data.modification_time = base::Time::UnixEpoch();
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   return response_data;
 }
 
@@ -217,20 +215,20 @@
   int64_t version = old_version + 1;
   SetServerVersion(tag_hash, version);
 
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = GenerateId(tag_hash);
-  data->client_tag_hash = tag_hash;
+  syncer::EntityData data;
+  data.id = GenerateId(tag_hash);
+  data.client_tag_hash = tag_hash;
   // These elements should have no effect on behavior, but we set them anyway
   // so we can test they are properly copied around the system if we want to.
-  data->creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
-  data->modification_time =
-      data->creation_time + base::TimeDelta::FromSeconds(version);
-  data->name = "Name Non Unique";
+  data.creation_time = base::Time::UnixEpoch() + base::TimeDelta::FromDays(1);
+  data.modification_time =
+      data.creation_time + base::TimeDelta::FromSeconds(version);
+  data.name = "Name Non Unique";
 
-  auto response_data = std::make_unique<UpdateResponseData>();
-  response_data->entity = std::move(data);
-  response_data->response_version = version;
-  response_data->encryption_key_name = model_type_state_.encryption_key_name();
+  UpdateResponseData response_data;
+  response_data.entity = std::move(data);
+  response_data.response_version = version;
+  response_data.encryption_key_name = model_type_state_.encryption_key_name();
 
   UpdateResponseDataList list;
   list.push_back(std::move(response_data));
diff --git a/components/sync/test/engine/mock_model_type_worker.h b/components/sync/test/engine/mock_model_type_worker.h
index bc3faff..19df06c3 100644
--- a/components/sync/test/engine/mock_model_type_worker.h
+++ b/components/sync/test/engine/mock_model_type_worker.h
@@ -88,7 +88,7 @@
   // the same version) or new updates.
   //
   // |ekn| is the encryption key name this item will fake having.
-  std::unique_ptr<syncer::UpdateResponseData> GenerateUpdateData(
+  syncer::UpdateResponseData GenerateUpdateData(
       const ClientTagHash& tag_hash,
       const sync_pb::EntitySpecifics& specifics,
       int64_t version_offset,
@@ -96,13 +96,13 @@
 
   // Mostly same as GenerateUpdateData above, but set 1 as |version_offset|, and
   // use model_type_state_.encryption_key_name() as |ekn|.
-  std::unique_ptr<syncer::UpdateResponseData> GenerateUpdateData(
+  syncer::UpdateResponseData GenerateUpdateData(
       const ClientTagHash& tag_hash,
       const sync_pb::EntitySpecifics& specifics);
 
   // Returns an UpdateResponseData representing an update received from
   // the server for a type root node.
-  std::unique_ptr<syncer::UpdateResponseData> GenerateTypeRootUpdateData(
+  syncer::UpdateResponseData GenerateTypeRootUpdateData(
       const ModelType& model_type);
 
   // Triggers a server-side deletion of the entity with |tag_hash|; updates
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc
index fc0e358..0c57036e 100644
--- a/components/sync_bookmarks/bookmark_model_merger.cc
+++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -55,9 +55,8 @@
 const char kMobileBookmarksTag[] = "synced_bookmarks";
 const char kOtherBookmarksTag[] = "other_bookmarks";
 
-using UpdatesPerParentId = std::unordered_map<base::StringPiece,
-                                              syncer::UpdateResponseDataList,
-                                              base::StringPieceHash>;
+using UpdatesPerParentId =
+    std::unordered_map<std::string, syncer::UpdateResponseDataList>;
 
 // Gets the bookmark node corresponding to a permanent folder identified by
 // |server_defined_unique_tag|. |bookmark_model| must not be null.
@@ -125,31 +124,25 @@
   std::set<std::string> known_guids;
   // In a first pass we process |originator_client_item_id| which is more
   // authoritative and cannot run into duplicates.
-  for (const std::unique_ptr<UpdateResponseData>& update : *updates) {
-    DCHECK(update);
-    DCHECK(update->entity);
-
+  for (const UpdateResponseData& update : *updates) {
     // |originator_client_item_id| is empty for permanent nodes.
-    if (update->entity->is_deleted() ||
-        update->entity->originator_client_item_id.empty()) {
+    if (update.entity.is_deleted() ||
+        update.entity.originator_client_item_id.empty()) {
       continue;
     }
 
     bool success =
-        known_guids.insert(update->entity->originator_client_item_id).second;
+        known_guids.insert(update.entity.originator_client_item_id).second;
     DCHECK(success);
   }
 
   // In a second pass, detect if GUIDs in specifics conflict with each other or
   // with |originator_client_item_id| values processed earlier.
-  for (std::unique_ptr<UpdateResponseData>& update : *updates) {
-    DCHECK(update);
-    DCHECK(update->entity);
-
+  for (UpdateResponseData& update : *updates) {
     const std::string& guid_in_specifics =
-        update->entity->specifics.bookmark().guid();
+        update.entity.specifics.bookmark().guid();
     if (guid_in_specifics.empty() ||
-        guid_in_specifics == update->entity->originator_client_item_id) {
+        guid_in_specifics == update.entity.originator_client_item_id) {
       continue;
     }
 
@@ -158,7 +151,7 @@
       // This GUID conflicts with another one, so let's ignore it for the
       // purpose of merging. This mimics the data produced by old clients,
       // without the GUID being populated.
-      update->entity->specifics.mutable_bookmark()->clear_guid();
+      update.entity.specifics.mutable_bookmark()->clear_guid();
     }
   }
 }
@@ -169,11 +162,8 @@
     UpdateResponseDataList* updates) {
   UpdatesPerParentId updates_per_parent_id;
 
-  for (std::unique_ptr<UpdateResponseData>& update : *updates) {
-    DCHECK(update);
-    DCHECK(update->entity);
-
-    const EntityData& update_entity = *update->entity;
+  for (UpdateResponseData& update : *updates) {
+    const EntityData& update_entity = update.entity;
     if (update_entity.is_deleted()) {
       continue;
     }
@@ -246,23 +236,19 @@
 // static
 BookmarkModelMerger::RemoteTreeNode
 BookmarkModelMerger::RemoteTreeNode::BuildTree(
-    std::unique_ptr<UpdateResponseData> update,
+    UpdateResponseData update,
     UpdatesPerParentId* updates_per_parent_id) {
   DCHECK(updates_per_parent_id);
-  DCHECK(update);
-  DCHECK(update->entity);
 
   RemoteTreeNode node;
   node.update_ = std::move(update);
 
   // Populate descendants recursively.
-  for (std::unique_ptr<UpdateResponseData>& child_update :
+  for (UpdateResponseData& child_update :
        (*updates_per_parent_id)[node.entity().id]) {
-    DCHECK(child_update);
-    DCHECK(child_update->entity);
-    DCHECK_EQ(child_update->entity->parent_id, node.entity().id);
-    DCHECK(IsValidBookmarkSpecifics(child_update->entity->specifics.bookmark(),
-                                    child_update->entity->is_folder));
+    DCHECK_EQ(child_update.entity.parent_id, node.entity().id);
+    DCHECK(IsValidBookmarkSpecifics(child_update.entity.specifics.bookmark(),
+                                    child_update.entity.is_folder));
 
     node.children_.push_back(
         BuildTree(std::move(child_update), updates_per_parent_id));
@@ -335,14 +321,14 @@
 
   // Construct one tree per permanent entity.
   RemoteForest update_forest;
-  for (std::unique_ptr<UpdateResponseData>& update : updates) {
-    if (!update || update->entity->server_defined_unique_tag.empty()) {
+  for (UpdateResponseData& update : updates) {
+    if (update.entity.server_defined_unique_tag.empty()) {
       continue;
     }
 
     // Make a copy of the string to avoid relying on argument evaluation order.
     const std::string server_defined_unique_tag =
-        update->entity->server_defined_unique_tag;
+        update.entity.server_defined_unique_tag;
 
     update_forest.emplace(
         server_defined_unique_tag,
@@ -361,6 +347,10 @@
     bookmarks::BookmarkModel* bookmark_model) {
   DCHECK(bookmark_model);
 
+  if (!base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
+    return {};
+  }
+
   // Build a temporary lookup table for remote GUIDs.
   std::unordered_map<std::string, const RemoteTreeNode*>
       guid_to_remote_node_map;
@@ -398,14 +388,9 @@
 
     if (node->is_folder() != remote_entity.is_folder ||
         (node->is_url() &&
-         node->url() != remote_entity.specifics.bookmark().url()) ||
-        !base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
+         node->url() != remote_entity.specifics.bookmark().url())) {
       // If local node and its remote node match are conflicting in node type or
-      // URL, replace local GUID with a random GUID. The logic is applied
-      // unconditionally if kMergeBookmarksUsingGUIDs is disabled, since no
-      // GUID-based matches take place and GUIDs need to be reassigned to avoid
-      // collisions (they will be reassigned once again if there is a semantic
-      // match).
+      // URL, replace local GUID with a random GUID.
       // TODO(crbug.com/978430): Local GUIDs should also be reassigned if they
       // match a remote originator_client_item_id.
       ReplaceBookmarkNodeGUID(node, base::GenerateGUID(), bookmark_model);
@@ -608,12 +593,10 @@
   const bookmarks::BookmarkNode* node = parent->children()[index].get();
   DCHECK(!FindMatchingRemoteNodeByGUID(node));
   DCHECK(base::IsValidGUID(node->guid()));
-
-  // The node's GUID cannot run into collisions because
-  // FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if
-  // they won't actually be merged with the remote bookmark with the same GUID
-  // (e.g. incompatible types).
-  const std::string sync_id = node->guid();
+  const std::string sync_id =
+      base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)
+          ? node->guid()
+          : base::GenerateGUID();
   const int64_t server_version = syncer::kUncommittedVersion;
   const base::Time creation_time = base::Time::Now();
   const std::string& suffix = syncer::GenerateSyncableBookmarkHash(
diff --git a/components/sync_bookmarks/bookmark_model_merger.h b/components/sync_bookmarks/bookmark_model_merger.h
index bf0783ec..9758ee9 100644
--- a/components/sync_bookmarks/bookmark_model_merger.h
+++ b/components/sync_bookmarks/bookmark_model_merger.h
@@ -54,9 +54,7 @@
   class RemoteTreeNode final {
    private:
     using UpdatesPerParentId =
-        std::unordered_map<base::StringPiece,
-                           syncer::UpdateResponseDataList,
-                           base::StringPieceHash>;
+        std::unordered_map<std::string, syncer::UpdateResponseDataList>;
 
    public:
     // Constructs a tree given |update| as root and recursively all descendants
@@ -65,9 +63,8 @@
     // |*updates_per_parent_id| must represent valid updates. Updates
     // corresponding from descendant nodes are moved away from
     // |*updates_per_parent_id|.
-    static RemoteTreeNode BuildTree(
-        std::unique_ptr<syncer::UpdateResponseData> update,
-        UpdatesPerParentId* updates_per_parent_id);
+    static RemoteTreeNode BuildTree(syncer::UpdateResponseData update,
+                                    UpdatesPerParentId* updates_per_parent_id);
 
     ~RemoteTreeNode();
 
@@ -75,8 +72,8 @@
     RemoteTreeNode(RemoteTreeNode&&);
     RemoteTreeNode& operator=(RemoteTreeNode&&);
 
-    const syncer::EntityData& entity() const { return *update_->entity; }
-    int64_t response_version() const { return update_->response_version; }
+    const syncer::EntityData& entity() const { return update_.entity; }
+    int64_t response_version() const { return update_.response_version; }
 
     // Direct children nodes, sorted by ascending unique position. These are
     // guaranteed to be valid updates (e.g. IsValidBookmarkSpecifics()).
@@ -94,7 +91,7 @@
 
     RemoteTreeNode();
 
-    std::unique_ptr<syncer::UpdateResponseData> update_;
+    syncer::UpdateResponseData update_;
     std::vector<RemoteTreeNode> children_;
   };
 
diff --git a/components/sync_bookmarks/bookmark_model_merger_unittest.cc b/components/sync_bookmarks/bookmark_model_merger_unittest.cc
index cba854b..2edf63b 100644
--- a/components/sync_bookmarks/bookmark_model_merger_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_merger_unittest.cc
@@ -50,7 +50,7 @@
   return arg[0].get() == expected_raw_ptr0 && arg[1].get() == expected_raw_ptr1;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const std::string& server_id,
     const std::string& parent_id,
     const std::string& title,
@@ -63,39 +63,39 @@
   if (!guid)
     guid = base::GenerateGUID();
 
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = server_id;
-  data->originator_client_item_id = *guid;
-  data->parent_id = parent_id;
-  data->unique_position = unique_position.ToProto();
+  syncer::EntityData data;
+  data.id = server_id;
+  data.originator_client_item_id = *guid;
+  data.parent_id = parent_id;
+  data.unique_position = unique_position.ToProto();
 
   sync_pb::BookmarkSpecifics* bookmark_specifics =
-      data->specifics.mutable_bookmark();
+      data.specifics.mutable_bookmark();
   bookmark_specifics->set_guid(*guid);
   bookmark_specifics->set_title(title);
   bookmark_specifics->set_url(url);
   bookmark_specifics->set_icon_url(icon_url);
   bookmark_specifics->set_favicon(icon_data);
 
-  data->is_folder = is_folder;
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  data.is_folder = is_folder;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   return response_data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreateBookmarkBarNodeUpdateData() {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = kBookmarkBarId;
-  data->server_defined_unique_tag = kBookmarkBarTag;
+syncer::UpdateResponseData CreateBookmarkBarNodeUpdateData() {
+  syncer::EntityData data;
+  data.id = kBookmarkBarId;
+  data.server_defined_unique_tag = kBookmarkBarTag;
 
-  data->specifics.mutable_bookmark();
+  data.specifics.mutable_bookmark();
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   return response_data;
 }
 
@@ -1309,7 +1309,7 @@
 
   // |originator_client_item_id| cannot itself be duplicated because
   // ModelTypeWorker guarantees otherwise.
-  updates.back()->entity->originator_client_item_id = base::GenerateGUID();
+  updates.back().entity.originator_client_item_id = base::GenerateGUID();
 
   std::unique_ptr<SyncedBookmarkTracker> tracker =
       Merge(std::move(updates), bookmark_model.get());
@@ -1380,7 +1380,7 @@
 
   // |originator_client_item_id| cannot itself be duplicated because
   // ModelTypeWorker guarantees otherwise.
-  updates.back()->entity->originator_client_item_id = base::GenerateGUID();
+  updates.back().entity.originator_client_item_id = base::GenerateGUID();
 
   std::unique_ptr<SyncedBookmarkTracker> tracker =
       Merge(std::move(updates), bookmark_model.get());
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc
index aa6e3a4..f063fb1 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -96,10 +96,10 @@
   // Assign a temp server id for the entity. Will be overriden by the actual
   // server id upon receiving commit response.
   DCHECK(base::IsValidGUID(node->guid()));
-
-  // Local bookmark creations should have used a random GUID so it's safe to
-  // use it as originator client item ID, without the risk for collision.
-  const std::string sync_id = node->guid();
+  const std::string sync_id =
+      base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)
+          ? node->guid()
+          : base::GenerateGUID();
   const int64_t server_version = syncer::kUncommittedVersion;
   const base::Time creation_time = base::Time::Now();
   const sync_pb::UniquePosition unique_position =
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
index 4184ac9..a186cb00 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
@@ -134,8 +134,10 @@
       bookmark_tracker()->GetEntitiesWithLocalChanges(kMaxEntries);
   ASSERT_THAT(local_changes.size(), 1U);
   EXPECT_THAT(local_changes[0]->bookmark_node(), Eq(bookmark_node));
-  EXPECT_THAT(local_changes[0]->metadata()->server_id(),
-              Eq(bookmark_node->guid()));
+  if (base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
+    EXPECT_THAT(local_changes[0]->metadata()->server_id(),
+                Eq(bookmark_node->guid()));
+  }
 }
 
 TEST_F(BookmarkModelObserverImplTest,
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
index 90940c5..e8aebfc7 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -50,34 +50,34 @@
   std::string server_tag;
 };
 
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const BookmarkInfo& bookmark_info,
     const syncer::UniquePosition& unique_position,
     int response_version,
     const std::string& guid) {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = bookmark_info.server_id;
-  data->parent_id = bookmark_info.parent_id;
-  data->server_defined_unique_tag = bookmark_info.server_tag;
-  data->unique_position = unique_position.ToProto();
+  syncer::EntityData data;
+  data.id = bookmark_info.server_id;
+  data.parent_id = bookmark_info.parent_id;
+  data.server_defined_unique_tag = bookmark_info.server_tag;
+  data.unique_position = unique_position.ToProto();
 
   sync_pb::BookmarkSpecifics* bookmark_specifics =
-      data->specifics.mutable_bookmark();
+      data.specifics.mutable_bookmark();
   bookmark_specifics->set_guid(guid);
   bookmark_specifics->set_title(bookmark_info.title);
   if (bookmark_info.url.empty()) {
-    data->is_folder = true;
+    data.is_folder = true;
   } else {
     bookmark_specifics->set_url(bookmark_info.url);
   }
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
-  response_data->response_version = response_version;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
+  response_data.response_version = response_version;
   return response_data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const BookmarkInfo& bookmark_info,
     const syncer::UniquePosition& unique_position,
     int response_version) {
@@ -305,7 +305,7 @@
       CreateUpdateResponseData({kNodeId, kTitle, kUrl, kBookmarkBarId,
                                 /*server_tag=*/std::string()},
                                kRandomPosition, /*response_version=*/1));
-  updates[0]->response_version++;
+  updates[0].response_version++;
 
   EXPECT_CALL(*schedule_save_closure(), Run());
   processor()->OnUpdateReceived(CreateDummyModelTypeState(),
@@ -499,14 +499,13 @@
 
   // Push an update that is encrypted with the new encryption key.
   const std::string kNodeId = "node_id";
-  std::unique_ptr<syncer::UpdateResponseData> response_data =
-      CreateUpdateResponseData(
-          {kNodeId, "title", "http://www.url.com", /*parent_id=*/kBookmarkBarId,
-           /*server_tag=*/std::string()},
-          syncer::UniquePosition::InitialPosition(
-              syncer::UniquePosition::RandomSuffix()),
-          /*response_version=*/0);
-  response_data->encryption_key_name = kEncryptionKeyName;
+  syncer::UpdateResponseData response_data = CreateUpdateResponseData(
+      {kNodeId, "title", "http://www.url.com", /*parent_id=*/kBookmarkBarId,
+       /*server_tag=*/std::string()},
+      syncer::UniquePosition::InitialPosition(
+          syncer::UniquePosition::RandomSuffix()),
+      /*response_version=*/0);
+  response_data.encryption_key_name = kEncryptionKeyName;
 
   syncer::UpdateResponseDataList updates;
   updates.push_back(std::move(response_data));
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
index c3127571..55fb8b6 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -108,7 +108,7 @@
     bookmarks::BookmarkModel* model,
     SyncedBookmarkTracker* tracker,
     favicon::FaviconService* favicon_service) {
-  const syncer::EntityData& update_entity = *update.entity;
+  const syncer::EntityData& update_entity = update.entity;
   DCHECK(!update_entity.is_deleted());
   DCHECK(tracked_entity);
   DCHECK(new_parent_tracked_entity);
@@ -184,7 +184,7 @@
   std::unordered_set<std::string> entities_with_up_to_date_encryption;
 
   for (const syncer::UpdateResponseData* update : ReorderUpdates(&updates)) {
-    const syncer::EntityData& update_entity = *update->entity;
+    const syncer::EntityData& update_entity = update->entity;
     // Only non deletions and non premanent node should have valid specifics and
     // unique positions.
     if (!update_entity.is_deleted() &&
@@ -368,9 +368,8 @@
       parent_to_children;
 
   // Add only non-deletions to |id_to_updates|.
-  for (const std::unique_ptr<syncer::UpdateResponseData>& update : *updates) {
-    DCHECK(update);
-    const syncer::EntityData& update_entity = *update->entity;
+  for (const syncer::UpdateResponseData& update : *updates) {
+    const syncer::EntityData& update_entity = update.entity;
     // Ignore updates to root nodes.
     if (update_entity.parent_id == "0") {
       continue;
@@ -378,13 +377,13 @@
     if (update_entity.is_deleted()) {
       continue;
     }
-    id_to_updates[update_entity.id] = update.get();
+    id_to_updates[update_entity.id] = &update;
   }
   // Iterate over |id_to_updates| and construct |roots| and
   // |parent_to_children|.
   for (const std::pair<base::StringPiece, const syncer::UpdateResponseData*>&
            pair : id_to_updates) {
-    const syncer::EntityData& update_entity = *pair.second->entity;
+    const syncer::EntityData& update_entity = pair.second->entity;
     parent_to_children[update_entity.parent_id].push_back(update_entity.id);
     // If this entity's parent has no pending update, add it to |roots|.
     if (id_to_updates.count(update_entity.parent_id) == 0) {
@@ -401,16 +400,15 @@
 
   int root_node_updates_count = 0;
   // Add deletions.
-  for (const std::unique_ptr<syncer::UpdateResponseData>& update : *updates) {
-    DCHECK(update);
-    const syncer::EntityData& update_entity = *update->entity;
+  for (const syncer::UpdateResponseData& update : *updates) {
+    const syncer::EntityData& update_entity = update.entity;
     // Ignore updates to root nodes.
     if (update_entity.parent_id == "0") {
       root_node_updates_count++;
       continue;
     }
     if (update_entity.is_deleted()) {
-      ordered_updates.push_back(update.get());
+      ordered_updates.push_back(&update);
     }
   }
   // All non root updates should have been included in |ordered_updates|.
@@ -420,7 +418,7 @@
 
 bool BookmarkRemoteUpdatesHandler::ProcessCreate(
     const syncer::UpdateResponseData& update) {
-  const syncer::EntityData& update_entity = *update.entity;
+  const syncer::EntityData& update_entity = update.entity;
   DCHECK(!update_entity.is_deleted());
   if (!update_entity.server_defined_unique_tag.empty()) {
     DLOG(ERROR)
@@ -437,7 +435,11 @@
   // not populate GUID field and if the originator_client_item_id is not of
   // valid GUID format to replace it, the field is left blank.
   if (!base::IsValidGUID(update_entity.specifics.bookmark().guid())) {
-    update.entity->specifics.mutable_bookmark()->set_guid(base::GenerateGUID());
+    // TODO(crbug.com/978430): Seems that's not the correct place for making any
+    // changes to |update|, need a proper place for generating GUID.
+    const_cast<syncer::UpdateResponseData&>(update)
+        .entity.specifics.mutable_bookmark()
+        ->set_guid(base::GenerateGUID());
   }
 
   const bookmarks::BookmarkNode* parent_node = GetParentNode(update_entity);
@@ -473,7 +475,7 @@
 void BookmarkRemoteUpdatesHandler::ProcessUpdate(
     const syncer::UpdateResponseData& update,
     const SyncedBookmarkTracker::Entity* tracked_entity) {
-  const syncer::EntityData& update_entity = *update.entity;
+  const syncer::EntityData& update_entity = update.entity;
   // Can only update existing nodes.
   DCHECK(tracked_entity);
   DCHECK_EQ(tracked_entity,
@@ -552,7 +554,7 @@
 void BookmarkRemoteUpdatesHandler::ProcessConflict(
     const syncer::UpdateResponseData& update,
     const SyncedBookmarkTracker::Entity* tracked_entity) {
-  const syncer::EntityData& update_entity = *update.entity;
+  const syncer::EntityData& update_entity = update.entity;
   // TODO(crbug.com/516866): Handle the case of conflict as a result of
   // re-encryption request.
 
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc
index 32d29a8c..1510aab 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc
@@ -47,7 +47,7 @@
 const char kOtherBookmarksId[] = "other_bookmarks_id";
 const char kOtherBookmarksTag[] = "other_bookmarks";
 
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const std::string& server_id,
     const std::string& parent_id,
     const std::string& guid,
@@ -55,28 +55,28 @@
     bool is_deletion,
     int version,
     const syncer::UniquePosition& unique_position) {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = server_id;
-  data->parent_id = parent_id;
-  data->unique_position = unique_position.ToProto();
+  syncer::EntityData data;
+  data.id = server_id;
+  data.parent_id = parent_id;
+  data.unique_position = unique_position.ToProto();
 
   // EntityData would be considered a deletion if its specifics hasn't been set.
   if (!is_deletion) {
     sync_pb::BookmarkSpecifics* bookmark_specifics =
-        data->specifics.mutable_bookmark();
+        data.specifics.mutable_bookmark();
     bookmark_specifics->set_guid(guid);
     bookmark_specifics->set_title(title);
   }
-  data->is_folder = true;
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
-  response_data->response_version = version;
+  data.is_folder = true;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
+  response_data.response_version = version;
   return response_data;
 }
 
 // Overload that assigns a random GUID. Should only be used when GUID is not
 // relevant.
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const std::string& server_id,
     const std::string& parent_id,
     const std::string& title,
@@ -89,7 +89,7 @@
 
 // Overload that assign a random position. Should only be used when position
 // is not relevant.
-std::unique_ptr<syncer::UpdateResponseData> CreateUpdateResponseData(
+syncer::UpdateResponseData CreateUpdateResponseData(
     const std::string& server_id,
     const std::string& parent_id,
     bool is_deletion,
@@ -100,36 +100,36 @@
                                       syncer::UniquePosition::RandomSuffix()));
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreateBookmarkRootUpdateData() {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = syncer::ModelTypeToRootTag(syncer::BOOKMARKS);
-  data->parent_id = kRootParentId;
-  data->server_defined_unique_tag =
+syncer::UpdateResponseData CreateBookmarkRootUpdateData() {
+  syncer::EntityData data;
+  data.id = syncer::ModelTypeToRootTag(syncer::BOOKMARKS);
+  data.parent_id = kRootParentId;
+  data.server_defined_unique_tag =
       syncer::ModelTypeToRootTag(syncer::BOOKMARKS);
 
-  data->specifics.mutable_bookmark();
+  data.specifics.mutable_bookmark();
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   return response_data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreatePermanentFolderUpdateData(
+syncer::UpdateResponseData CreatePermanentFolderUpdateData(
     const std::string& id,
     const std::string& tag) {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = id;
-  data->parent_id = "root_id";
-  data->server_defined_unique_tag = tag;
+  syncer::EntityData data;
+  data.id = id;
+  data.parent_id = "root_id";
+  data.server_defined_unique_tag = tag;
 
-  data->specifics.mutable_bookmark();
+  data.specifics.mutable_bookmark();
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   return response_data;
 }
 
@@ -246,12 +246,12 @@
   // This is test is over verifying since the order requirements are
   // within subtrees only. (e.g it doesn't matter whether node1 comes before or
   // after node4). However, it's implemented this way for simplicity.
-  EXPECT_THAT(ordered_updates[0]->entity->id, Eq(ids[4]));
-  EXPECT_THAT(ordered_updates[1]->entity->id, Eq(ids[5]));
-  EXPECT_THAT(ordered_updates[2]->entity->id, Eq(ids[0]));
-  EXPECT_THAT(ordered_updates[3]->entity->id, Eq(ids[1]));
-  EXPECT_THAT(ordered_updates[4]->entity->id, Eq(ids[2]));
-  EXPECT_THAT(ordered_updates[5]->entity->id, Eq(ids[6]));
+  EXPECT_THAT(ordered_updates[0]->entity.id, Eq(ids[4]));
+  EXPECT_THAT(ordered_updates[1]->entity.id, Eq(ids[5]));
+  EXPECT_THAT(ordered_updates[2]->entity.id, Eq(ids[0]));
+  EXPECT_THAT(ordered_updates[3]->entity.id, Eq(ids[1]));
+  EXPECT_THAT(ordered_updates[4]->entity.id, Eq(ids[2]));
+  EXPECT_THAT(ordered_updates[5]->entity.id, Eq(ids[6]));
 }
 
 TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest,
@@ -720,25 +720,25 @@
   const GURL kIconUrl("http://www.icon-url.com");
 
   syncer::UpdateResponseDataList updates;
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = "server_id";
-  data->parent_id = kBookmarkBarId;
-  data->unique_position = syncer::UniquePosition::InitialPosition(
-                              syncer::UniquePosition::RandomSuffix())
-                              .ToProto();
+  syncer::EntityData data;
+  data.id = "server_id";
+  data.parent_id = kBookmarkBarId;
+  data.unique_position = syncer::UniquePosition::InitialPosition(
+                             syncer::UniquePosition::RandomSuffix())
+                             .ToProto();
   sync_pb::BookmarkSpecifics* bookmark_specifics =
-      data->specifics.mutable_bookmark();
+      data.specifics.mutable_bookmark();
   bookmark_specifics->set_guid(base::GenerateGUID());
   // Use the server id as the title for simplicity.
   bookmark_specifics->set_title(kTitle);
   bookmark_specifics->set_url(kUrl.spec());
   bookmark_specifics->set_icon_url(kIconUrl.spec());
   bookmark_specifics->set_favicon("PNG");
-  data->is_folder = false;
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  data.is_folder = false;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
 
   updates.push_back(std::move(response_data));
 
@@ -759,23 +759,23 @@
   const GURL kUrl("http://www.url.com");
 
   syncer::UpdateResponseDataList updates;
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = "server_id";
-  data->parent_id = kBookmarkBarId;
-  data->unique_position = syncer::UniquePosition::InitialPosition(
-                              syncer::UniquePosition::RandomSuffix())
-                              .ToProto();
+  syncer::EntityData data;
+  data.id = "server_id";
+  data.parent_id = kBookmarkBarId;
+  data.unique_position = syncer::UniquePosition::InitialPosition(
+                             syncer::UniquePosition::RandomSuffix())
+                             .ToProto();
   sync_pb::BookmarkSpecifics* bookmark_specifics =
-      data->specifics.mutable_bookmark();
+      data.specifics.mutable_bookmark();
   bookmark_specifics->set_guid(base::GenerateGUID());
   // Use the server id as the title for simplicity.
   bookmark_specifics->set_title(kTitle);
   bookmark_specifics->set_url(kUrl.spec());
-  data->is_folder = false;
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  data.is_folder = false;
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
 
   updates.push_back(std::move(response_data));
 
@@ -833,21 +833,21 @@
 
   // Now receive an update with the actual server id.
   syncer::UpdateResponseDataList updates;
-  auto data = std::make_unique<syncer::EntityData>();
-  data->id = kSyncId;
-  data->originator_cache_guid = kCacheGuid;
-  data->originator_client_item_id = kOriginatorClientItemId;
+  syncer::EntityData data;
+  data.id = kSyncId;
+  data.originator_cache_guid = kCacheGuid;
+  data.originator_client_item_id = kOriginatorClientItemId;
   // Set the other required fields.
-  data->unique_position = syncer::UniquePosition::InitialPosition(
-                              syncer::UniquePosition::RandomSuffix())
-                              .ToProto();
-  data->specifics = specifics;
-  data->is_folder = true;
+  data.unique_position = syncer::UniquePosition::InitialPosition(
+                             syncer::UniquePosition::RandomSuffix())
+                             .ToProto();
+  data.specifics = specifics;
+  data.is_folder = true;
 
-  auto response_data = std::make_unique<syncer::UpdateResponseData>();
-  response_data->entity = std::move(data);
+  syncer::UpdateResponseData response_data;
+  response_data.entity = std::move(data);
   // Similar to what's done in the loopback_server.
-  response_data->response_version = 0;
+  response_data.response_version = 0;
   updates.push_back(std::move(response_data));
 
   testing::NiceMock<favicon::MockFaviconService> favicon_service;
@@ -880,11 +880,11 @@
 
   const std::string kId0 = "id0";
   syncer::UpdateResponseDataList updates;
-  std::unique_ptr<syncer::UpdateResponseData> response_data =
+  syncer::UpdateResponseData response_data =
       CreateUpdateResponseData(/*server_id=*/kId0,
                                /*parent_id=*/kBookmarkBarId,
                                /*is_deletion=*/false);
-  response_data->encryption_key_name = "out_of_date_encryption_key_name";
+  response_data.encryption_key_name = "out_of_date_encryption_key_name";
   updates.push_back(std::move(response_data));
 
   BookmarkRemoteUpdatesHandler updates_handler(bookmark_model.get(),
@@ -933,11 +933,11 @@
   const std::string kId = "id";
   const std::string kTitle = "title";
   syncer::UpdateResponseDataList updates;
-  std::unique_ptr<syncer::UpdateResponseData> response_data =
+  syncer::UpdateResponseData response_data =
       CreateUpdateResponseData(/*server_id=*/kId,
                                /*parent_id=*/kBookmarkBarId,
                                /*is_deletion=*/false);
-  response_data->encryption_key_name = "encryption_key_name";
+  response_data.encryption_key_name = "encryption_key_name";
   updates.push_back(std::move(response_data));
 
   BookmarkRemoteUpdatesHandler updates_handler(bookmark_model.get(),
@@ -961,14 +961,14 @@
   // Push a remote deletion for the same entity with an out of date encryption
   // key name.
   updates.clear();
-  std::unique_ptr<syncer::UpdateResponseData> response_data2 =
+  syncer::UpdateResponseData response_data2 =
       CreateUpdateResponseData(/*server_id=*/kId,
                                /*parent_id=*/kBookmarkBarId,
                                /*is_deletion=*/true);
-  response_data2->encryption_key_name = "out_of_date_encryption_key_name";
+  response_data2.encryption_key_name = "out_of_date_encryption_key_name";
   // Increment the server version to make sure the update isn't discarded as
   // reflection.
-  response_data2->response_version++;
+  response_data2.response_version++;
   updates.push_back(std::move(response_data2));
 
   base::HistogramTester histogram_tester;
@@ -996,14 +996,14 @@
   EXPECT_THAT(tracker()->GetEntityForSyncId(kId0)->IsUnsynced(), Eq(false));
 
   // Push another update to for the same entity.
-  std::unique_ptr<syncer::UpdateResponseData> response_data =
+  syncer::UpdateResponseData response_data =
       CreateUpdateResponseData(/*server_id=*/kId0,
                                /*parent_id=*/kBookmarkBarId,
                                /*is_deletion=*/false);
 
   // Increment the server version to make sure the update isn't discarded as
   // reflection.
-  response_data->response_version++;
+  response_data.response_version++;
   syncer::UpdateResponseDataList new_updates;
   new_updates.push_back(std::move(response_data));
   updates_handler()->Process(new_updates,
diff --git a/components/sync_device_info/device_info_sync_bridge_unittest.cc b/components/sync_device_info/device_info_sync_bridge_unittest.cc
index f967316..28c55766 100644
--- a/components/sync_device_info/device_info_sync_bridge_unittest.cc
+++ b/components/sync_device_info/device_info_sync_bridge_unittest.cc
@@ -253,10 +253,9 @@
 }
 
 // Creates an EntityData around a copy of the given specifics.
-std::unique_ptr<EntityData> SpecificsToEntity(
-    const DeviceInfoSpecifics& specifics) {
-  auto data = std::make_unique<EntityData>();
-  *data->specifics.mutable_device_info() = specifics;
+EntityData SpecificsToEntity(const DeviceInfoSpecifics& specifics) {
+  EntityData data;
+  *data.specifics.mutable_device_info() = specifics;
   return data;
 }
 
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc
index fa5198e..aa6305b0 100644
--- a/components/sync_sessions/session_sync_bridge_unittest.cc
+++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -78,22 +78,21 @@
                                                    result_listener);
 }
 
-std::unique_ptr<syncer::EntityData> SpecificsToEntity(
-    const sync_pb::SessionSpecifics& specifics,
-    base::Time mtime = base::Time::Now()) {
-  auto data = std::make_unique<syncer::EntityData>();
-  data->client_tag_hash = syncer::ClientTagHash::FromUnhashed(
+syncer::EntityData SpecificsToEntity(const sync_pb::SessionSpecifics& specifics,
+                                     base::Time mtime = base::Time::Now()) {
+  syncer::EntityData data;
+  data.client_tag_hash = syncer::ClientTagHash::FromUnhashed(
       syncer::SESSIONS, SessionStore::GetClientTag(specifics));
-  *data->specifics.mutable_session() = specifics;
-  data->modification_time = mtime;
+  *data.specifics.mutable_session() = specifics;
+  data.modification_time = mtime;
   return data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> SpecificsToUpdateResponse(
+syncer::UpdateResponseData SpecificsToUpdateResponse(
     const sync_pb::SessionSpecifics& specifics,
     base::Time mtime = base::Time::Now()) {
-  auto data = std::make_unique<syncer::UpdateResponseData>();
-  data->entity = SpecificsToEntity(specifics, mtime);
+  syncer::UpdateResponseData data;
+  data.entity = SpecificsToEntity(specifics, mtime);
   return data;
 }
 
@@ -106,16 +105,15 @@
   return storage_key_to_data;
 }
 
-std::unique_ptr<syncer::UpdateResponseData> CreateTombstone(
-    const std::string& client_tag) {
-  auto tombstone = std::make_unique<syncer::EntityData>();
+syncer::UpdateResponseData CreateTombstone(const std::string& client_tag) {
+  syncer::EntityData tombstone;
 
-  tombstone->client_tag_hash =
+  tombstone.client_tag_hash =
       syncer::ClientTagHash::FromUnhashed(syncer::SESSIONS, client_tag);
 
-  auto data = std::make_unique<syncer::UpdateResponseData>();
-  data->entity = std::move(tombstone);
-  data->response_version = 2;
+  syncer::UpdateResponseData data;
+  data.entity = std::move(tombstone);
+  data.response_version = 2;
   return data;
 }
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 0b91939b..c4bc9e5d 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1671,6 +1671,8 @@
     "service_worker/service_worker_new_script_loader.h",
     "service_worker/service_worker_object_host.cc",
     "service_worker/service_worker_object_host.h",
+    "service_worker/service_worker_offline_capability_checker.cc",
+    "service_worker/service_worker_offline_capability_checker.h",
     "service_worker/service_worker_ping_controller.cc",
     "service_worker/service_worker_ping_controller.h",
     "service_worker/service_worker_process_manager.cc",
diff --git a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
index 0af085f..c425175b 100644
--- a/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.cc
@@ -17,6 +17,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/socket_permission_request.h"
@@ -134,11 +135,12 @@
     return PP_ERROR_NOACCESS;
   }
 
-  RenderProcessHost* render_process_host =
-      RenderProcessHost::FromID(render_process_id_);
-  if (!render_process_host)
+  RenderFrameHost* render_frame_host =
+      RenderFrameHost::FromID(render_process_id_, render_frame_id_);
+  if (!render_frame_host)
     return PP_ERROR_FAILED;
-  auto* storage_partition = render_process_host->GetStoragePartition();
+  auto* storage_partition =
+      render_frame_host->GetProcess()->GetStoragePartition();
 
   // Grab a reference to this class to ensure that it's fully alive if a
   // connection error occurs (i.e. ref count is higher than 0 and there's no
@@ -150,10 +152,9 @@
       network::mojom::ResolveHostParameters::New();
   PrepareRequestInfo(hint, parameters.get());
 
-  // TODO(mmenke): Pass in correct NetworkIsolationKey.
   storage_partition->GetNetworkContext()->ResolveHost(
       net::HostPortPair(host_port.host, host_port.port),
-      net::NetworkIsolationKey::Todo(), std::move(parameters),
+      render_frame_host->GetNetworkIsolationKey(), std::move(parameters),
       receiver_.BindNewPipeAndPassRemote());
   receiver_.set_disconnect_handler(
       base::BindOnce(&PepperHostResolverMessageFilter::OnComplete,
diff --git a/content/browser/scheduler/responsiveness/jank_monitor.cc b/content/browser/scheduler/responsiveness/jank_monitor.cc
index 8e69441a..46a470a 100644
--- a/content/browser/scheduler/responsiveness/jank_monitor.cc
+++ b/content/browser/scheduler/responsiveness/jank_monitor.cc
@@ -290,14 +290,14 @@
 
   base::AutoLock lock(lock_);
   if (LIKELY(task_execution_metadata_.empty() ||
-             (now - task_execution_metadata_.front().execution_start_time) <
+             (now - task_execution_metadata_.back().execution_start_time) <
                  jank_threshold)) {
     // Most tasks are unlikely to be janky.
     return base::nullopt;
   }
 
   // Mark that the target thread is janky and notify the monitor thread.
-  return task_execution_metadata_.front().identifier;
+  return task_execution_metadata_.back().identifier;
 }
 
 void JankMonitor::ThreadExecutionState::WillRunTaskOrEvent(
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
index 4f393b0..5511f0b 100644
--- a/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
+++ b/content/browser/scheduler/responsiveness/jank_monitor_unittest.cc
@@ -224,6 +224,78 @@
   VALIDATE_TEST_OBSERVER_CALLS();
 }
 
+// Test that the jank monitor shouldn't report a jank if a nested runloop is
+// responsive.
+TEST_F(JankMonitorTest, ReentrantResponsive) {
+  auto enclosing_task = [&]() {
+    // Run 5 responsive tasks in the inner runloop.
+    for (int i  = 0; i < 5; i++) {
+      auto nested_responsive_task = [&]() {
+        task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+
+        // The callback shouldn't be called. |expected_jank_started_| and
+        // |expected_jank_stopped_| should be 0.
+        VALIDATE_TEST_OBSERVER_CALLS();
+      };
+      base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                     base::BindLambdaForTesting(nested_responsive_task));
+      // Spin a nested run loop to run |nested_responsive_task|.
+      base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
+    }
+  };
+
+  base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                 base::BindLambdaForTesting(enclosing_task));
+  task_environment_.RunUntilIdle();
+  // |expected_jank_started_| and |expected_jank_stopped_| should be 0 even if
+  // the enclosing task runs much longer than the jank threshold.
+  VALIDATE_TEST_OBSERVER_CALLS();
+}
+
+// Test that the jank monitor reports only the janky task running in the nested
+// runloop. The enclosing task shouldn't be reported even if its total duration
+// is longer than the jank threshold.
+TEST_F(JankMonitorTest, JankNestedRunLoop) {
+  auto enclosing_task = [&]() {
+    // Run 1 responsive tasks in the inner runloop.
+    auto nested_responsive_task = [&]() {
+      task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(999));
+
+      // The callback shouldn't be called. |expected_jank_started_| should be 0.
+      VALIDATE_TEST_OBSERVER_CALLS();
+    };
+    base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                   base::BindLambdaForTesting(nested_responsive_task));
+    // Spin a nested run loop to run |nested_responsive_task|.
+    base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
+
+    // Then run 1 responsive tasks in the inner runloop.
+    auto nested_janky_task = [&]() {
+      task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1500));
+
+      // We should detect one jank.
+      expected_jank_started_++;
+      // The callback shouldn't be called. |expected_jank_started_| should be 0.
+      VALIDATE_TEST_OBSERVER_CALLS();
+    };
+    base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                   base::BindLambdaForTesting(nested_janky_task));
+    // Spin a nested run loop to run |nested_responsive_task|.
+    base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
+
+    task_environment_.RunUntilIdle();
+    expected_jank_stopped_++;
+    // The callback shouldn't be called. |expected_jank_started_| should be 1.
+    VALIDATE_TEST_OBSERVER_CALLS();
+  };
+
+  base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                 base::BindLambdaForTesting(enclosing_task));
+  task_environment_.RunUntilIdle();
+  // |expected_jank_started_| and |expected_jank_stopped_| should still be 1.
+  VALIDATE_TEST_OBSERVER_CALLS();
+}
+
 // Test monitor with overlapping janks on both threads. Only the jank started
 // first should be reported.
 TEST_F(JankMonitorTest, JankUIAndIOThread) {
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index c3f15d8..c185867 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -28,6 +28,7 @@
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_info.h"
 #include "content/browser/service_worker/service_worker_job_coordinator.h"
+#include "content/browser/service_worker/service_worker_offline_capability_checker.h"
 #include "content/browser/service_worker/service_worker_process_manager.h"
 #include "content/browser/service_worker/service_worker_register_job.h"
 #include "content/browser/service_worker/service_worker_registration.h"
@@ -730,6 +731,23 @@
                           AsWeakPtr(), std::move(callback)));
 }
 
+void ServiceWorkerContextCore::CheckOfflineCapability(
+    const GURL& url,
+    ServiceWorkerContext::CheckOfflineCapabilityCallback callback) {
+  auto checker = std::make_unique<ServiceWorkerOfflineCapabilityChecker>(url);
+  ServiceWorkerOfflineCapabilityChecker* checker_rawptr = checker.get();
+  checker_rawptr->Start(
+      storage(),
+      // Bind unique_ptr to the |callback| so that
+      // ServiceWorkerOfflineCapabilityChecker outlives |callback| and is surely
+      // freed when |callback| is called.
+      base::BindOnce(
+          [](std::unique_ptr<ServiceWorkerOfflineCapabilityChecker> checker,
+             ServiceWorkerContext::CheckOfflineCapabilityCallback callback,
+             OfflineCapability result) { std::move(callback).Run(result); },
+          std::move(checker), std::move(callback)));
+}
+
 void ServiceWorkerContextCore::UpdateVersionFailureCount(
     int64_t version_id,
     blink::ServiceWorkerStatusCode status) {
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index c62ed58..e4d57444 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -273,6 +273,13 @@
       const GURL& url,
       const ServiceWorkerContext::CheckHasServiceWorkerCallback callback);
 
+  // Returns OfflineCapability of the service worker matching |url|.
+  // See ServiceWorkerContext::CheckOfflineCapability for more
+  // details.
+  void CheckOfflineCapability(
+      const GURL& url,
+      const ServiceWorkerContext::CheckOfflineCapabilityCallback callback);
+
   void UpdateVersionFailureCount(int64_t version_id,
                                  blink::ServiceWorkerStatusCode status);
   // Returns the count of consecutive start worker failures for the given
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index 4dbda3c..aff5d08 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -638,6 +638,28 @@
                      this, std::move(callback)));
 }
 
+void ServiceWorkerContextWrapper::CheckOfflineCapability(
+    const GURL& url,
+    CheckOfflineCapabilityCallback callback) {
+  if (!BrowserThread::CurrentlyOn(GetCoreThreadId())) {
+    base::PostTask(
+        FROM_HERE, {GetCoreThreadId()},
+        base::BindOnce(&ServiceWorkerContextWrapper::CheckOfflineCapability,
+                       this, url, std::move(callback)));
+    return;
+  }
+  if (!context_core_) {
+    base::PostTask(
+        FROM_HERE, {BrowserThread::UI},
+        base::BindOnce(std::move(callback), OfflineCapability::kUnsupported));
+    return;
+  }
+  context()->CheckOfflineCapability(
+      net::SimplifyUrlForRequest(url),
+      base::BindOnce(&ServiceWorkerContextWrapper::DidCheckOfflineCapability,
+                     this, std::move(callback)));
+}
+
 void ServiceWorkerContextWrapper::ClearAllServiceWorkersForTest(
     base::OnceClosure callback) {
   if (!BrowserThread::CurrentlyOn(GetCoreThreadId())) {
@@ -1651,6 +1673,14 @@
                  base::BindOnce(std::move(callback), capability));
 }
 
+void ServiceWorkerContextWrapper::DidCheckOfflineCapability(
+    CheckOfflineCapabilityCallback callback,
+    OfflineCapability capability) {
+  DCHECK_CURRENTLY_ON(GetCoreThreadId());
+  base::PostTask(FROM_HERE, {BrowserThread::UI},
+                 base::BindOnce(std::move(callback), capability));
+}
+
 void ServiceWorkerContextWrapper::DidFindRegistrationForUpdate(
     blink::ServiceWorkerStatusCode status,
     scoped_refptr<ServiceWorkerRegistration> registration) {
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index e07510a..e40bc6fe 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -159,6 +159,9 @@
   void PerformStorageCleanup(base::OnceClosure callback) override;
   void CheckHasServiceWorker(const GURL& url,
                              CheckHasServiceWorkerCallback callback) override;
+  void CheckOfflineCapability(const GURL& url,
+                              CheckOfflineCapabilityCallback callback) override;
+
   void ClearAllServiceWorkersForTest(base::OnceClosure callback) override;
   void StartWorkerForScope(const GURL& scope,
                            StartWorkerCallback info_callback,
@@ -388,6 +391,8 @@
 
   void DidCheckHasServiceWorker(CheckHasServiceWorkerCallback callback,
                                 content::ServiceWorkerCapability status);
+  void DidCheckOfflineCapability(CheckOfflineCapabilityCallback callback,
+                                 content::OfflineCapability status);
 
   void DidFindRegistrationForUpdate(
       blink::ServiceWorkerStatusCode status,
diff --git a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
index 0bf613c2..edce4d3 100644
--- a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
+++ b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
@@ -263,6 +263,32 @@
     test_helper.CheckResult();
   }
 
+  void CheckOfflineCapabilityOnCoreThread(
+      const std::string& path,
+      ServiceWorkerContext::CheckOfflineCapabilityCallback callback) {
+    wrapper()->CheckOfflineCapability(embedded_test_server()->GetURL(path),
+                                      std::move(callback));
+  }
+
+  OfflineCapability CheckOfflineCapability(const std::string& path) {
+    base::RunLoop fetch_run_loop;
+    base::Optional<OfflineCapability> out_offline_capability;
+    RunOrPostTaskOnThread(
+        FROM_HERE, ServiceWorkerContext::GetCoreThreadId(),
+        base::BindOnce(&ServiceWorkerOfflineCapabilityCheckBrowserTest::
+                           CheckOfflineCapabilityOnCoreThread,
+                       base::Unretained(this), path,
+                       base::BindLambdaForTesting(
+                           [&out_offline_capability, &fetch_run_loop](
+                               OfflineCapability offline_capability) {
+                             out_offline_capability = offline_capability;
+                             fetch_run_loop.Quit();
+                           })));
+    fetch_run_loop.Run();
+    DCHECK(out_offline_capability.has_value());
+    return *out_offline_capability;
+  }
+
  protected:
   // Expected results which are used in the tests.
   const FetchEventTestHelper::ExpectedResult kNetworkCompleted =
@@ -582,4 +608,80 @@
         kNetworkCompleted}});
 }
 
+// Sites without a service worker are identified as having no offline capability
+// support.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest,
+                       CheckOfflineCapabilityForNoServiceWorker) {
+  // We don't install ServiceWorker in this test.
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/empty.html"));
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/not_found.html"));
+}
+
+// Sites with a no-fetch-handler service worker are identified as having no
+// offline capability support.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest,
+                       CheckOfflineCapabilityForNoFetchHandler) {
+  EXPECT_TRUE(NavigateToURL(shell(),
+                            embedded_test_server()->GetURL(
+                                "/service_worker/create_service_worker.html")));
+  // Install ServiceWorker which does not have any event handler.
+  EXPECT_EQ("DONE", EvalJs(shell(), "register('empty.js')"));
+
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/empty.html"));
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/not_found.html"));
+}
+
+// Sites with a service worker are identified as supporting offline capability
+// only when it returns a valid response in the offline mode.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest,
+                       CheckOfflineCapability) {
+  EXPECT_TRUE(NavigateToURL(shell(),
+                            embedded_test_server()->GetURL(
+                                "/service_worker/create_service_worker.html")));
+  EXPECT_EQ("DONE", EvalJs(shell(), "register('maybe_offline_support.js')"));
+
+  // At this point, a service worker's status is ACTIVATED because
+  // register() awaits navigator.serviceWorker.ready promise.
+
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/out_of_scope.html"));
+
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/out_of_scope.html?offline"));
+
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/empty.html"));
+
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/empty.html?fetch"));
+
+  EXPECT_EQ(OfflineCapability::kSupported,
+            CheckOfflineCapability("/service_worker/empty.html?offline"));
+
+  EXPECT_EQ(
+      OfflineCapability::kSupported,
+      CheckOfflineCapability("/service_worker/empty.html?fetch_or_offline"));
+}
+
+// Sites with a service worker which is not activated yet are identified as
+// having no offline capability support.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerOfflineCapabilityCheckBrowserTest,
+                       CheckOfflineCapabilityForInstallingServiceWorker) {
+  EXPECT_TRUE(NavigateToURL(shell(),
+                            embedded_test_server()->GetURL(
+                                "/service_worker/create_service_worker.html")));
+  // Appends |pendingInstallEvent| URL param to prevent a service worker from
+  // being activated.
+  EXPECT_EQ("DONE",
+            EvalJs(shell(),
+                   "registerWithoutAwaitingReady('maybe_offline_support.js?"
+                   "pendingInstallEvent')"));
+  EXPECT_EQ(OfflineCapability::kUnsupported,
+            CheckOfflineCapability("/service_worker/empty.html?offline"));
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.cc b/content/browser/service_worker/service_worker_offline_capability_checker.cc
new file mode 100644
index 0000000..958a1e8
--- /dev/null
+++ b/content/browser/service_worker/service_worker_offline_capability_checker.cc
@@ -0,0 +1,120 @@
+// Copyright 2020 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 "content/browser/service_worker/service_worker_offline_capability_checker.h"
+
+#include "base/bind.h"
+#include "base/guid.h"
+#include "content/browser/service_worker/service_worker_context_core.h"
+#include "content/browser/service_worker/service_worker_registration.h"
+#include "content/browser/service_worker/service_worker_version.h"
+#include "content/browser/storage_partition_impl.h"
+#include "url/gurl.h"
+
+namespace content {
+
+ServiceWorkerOfflineCapabilityChecker::ServiceWorkerOfflineCapabilityChecker(
+    const GURL& url)
+    : url_(url) {
+  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+}
+
+ServiceWorkerOfflineCapabilityChecker::
+    ~ServiceWorkerOfflineCapabilityChecker() = default;
+
+void ServiceWorkerOfflineCapabilityChecker::Start(
+    ServiceWorkerStorage* storage,
+    ServiceWorkerContext::CheckOfflineCapabilityCallback callback) {
+  callback_ = std::move(callback);
+  storage->FindRegistrationForClientUrl(
+      url_, base::BindOnce(
+                &ServiceWorkerOfflineCapabilityChecker::DidFindRegistration,
+                // We can use base::Unretained(this) because |this| is expected
+                // to be alive until the |callback_| is called.
+                base::Unretained(this)));
+}
+
+void ServiceWorkerOfflineCapabilityChecker::DidFindRegistration(
+    blink::ServiceWorkerStatusCode status,
+    scoped_refptr<ServiceWorkerRegistration> registration) {
+  if (status != blink::ServiceWorkerStatusCode::kOk) {
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+    return;
+  }
+
+  if (registration->is_uninstalling() || registration->is_uninstalled()) {
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+    return;
+  }
+
+  scoped_refptr<ServiceWorkerVersion> preferred_version =
+      registration->active_version();
+  if (!preferred_version) {
+    preferred_version = registration->waiting_version();
+  }
+  if (!preferred_version) {
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+    return;
+  }
+
+  ServiceWorkerVersion::FetchHandlerExistence existence =
+      preferred_version->fetch_handler_existence();
+
+  DCHECK_NE(existence, ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN);
+
+  if (existence != ServiceWorkerVersion::FetchHandlerExistence::EXISTS) {
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+    return;
+  }
+
+  if (preferred_version->status() != ServiceWorkerVersion::Status::ACTIVATING &&
+      preferred_version->status() != ServiceWorkerVersion::Status::ACTIVATED) {
+    // ServiceWorkerFetchDispatcher assumes that the version's status is
+    // ACTIVATING or ACTIVATED. If the version's status is other one, we return
+    // kUnsupported, without waiting its status becoming ACTIVATING because that
+    // is not always guaranteed.
+    // TODO(hayato): We can do a bit better, such as 1) trigger the activation
+    // and wait, or 2) return a value to indicate the service worker is
+    // installed but not yet activated.
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+    return;
+  }
+
+  auto request = blink::mojom::FetchAPIRequest::New();
+  request->url = url_;
+  request->method = "GET";
+  request->is_main_resource_load = true;
+
+  fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>(
+      std::move(request), ResourceType::kMainFrame,
+      base::GenerateGUID() /* client_id */, std::move(preferred_version),
+      base::DoNothing() /* prepare callback */,
+      base::BindOnce(&ServiceWorkerOfflineCapabilityChecker::OnFetchResult,
+                     base::Unretained(this)),
+      /*is_offline_capability_check=*/true);
+  fetch_dispatcher_->Run();
+}
+
+void ServiceWorkerOfflineCapabilityChecker::OnFetchResult(
+    blink::ServiceWorkerStatusCode status,
+    ServiceWorkerFetchDispatcher::FetchEventResult result,
+    blink::mojom::FetchAPIResponsePtr response,
+    blink::mojom::ServiceWorkerStreamHandlePtr /* stream */,
+    blink::mojom::ServiceWorkerFetchEventTimingPtr /* timing */,
+    scoped_refptr<ServiceWorkerVersion>) {
+  if (status == blink::ServiceWorkerStatusCode::kOk &&
+      result == ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse &&
+      // TODO(hayato): Investigate whether any 2xx should be accepted or not.
+      response->status_code == 200) {
+    std::move(callback_).Run(OfflineCapability::kSupported);
+  } else {
+    // TODO(hayato): At present, we return kUnsupported even if the detection
+    // failed due to internal errors (disk fialures, timeout, etc). In the
+    // future, we might want to return another enum value so that the callside
+    // can know whether internal errors happened or not.
+    std::move(callback_).Run(OfflineCapability::kUnsupported);
+  }
+}
+
+}  // namespace content
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.h b/content/browser/service_worker/service_worker_offline_capability_checker.h
new file mode 100644
index 0000000..a3286ce
--- /dev/null
+++ b/content/browser/service_worker/service_worker_offline_capability_checker.h
@@ -0,0 +1,67 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_
+#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
+#include "content/public/browser/service_worker_context.h"
+#include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
+
+class GURL;
+
+namespace content {
+
+class ServiceWorkerRegistration;
+class ServiceWorkerStorage;
+class ServiceWorkerVersion;
+
+// Utility class used to check a service worker's offline capability.
+// Tracking bug is crbug.com/965802.
+//
+// |this| must outlive |callback_|.
+class ServiceWorkerOfflineCapabilityChecker {
+ public:
+  explicit ServiceWorkerOfflineCapabilityChecker(const GURL& url);
+  ~ServiceWorkerOfflineCapabilityChecker();
+
+  ServiceWorkerOfflineCapabilityChecker(
+      const ServiceWorkerOfflineCapabilityChecker&) = delete;
+  ServiceWorkerOfflineCapabilityChecker& operator=(
+      const ServiceWorkerOfflineCapabilityChecker&) = delete;
+
+  ServiceWorkerOfflineCapabilityChecker(
+      const ServiceWorkerOfflineCapabilityChecker&&) = delete;
+  ServiceWorkerOfflineCapabilityChecker& operator=(
+      const ServiceWorkerOfflineCapabilityChecker&&) = delete;
+
+  // It's the caller's responsibility to make sure that |this| outlives
+  // |callback|.
+  void Start(ServiceWorkerStorage* storage,
+             ServiceWorkerContext::CheckOfflineCapabilityCallback callback);
+
+ private:
+  void DidFindRegistration(
+      blink::ServiceWorkerStatusCode status,
+      scoped_refptr<ServiceWorkerRegistration> registration);
+
+  void OnFetchResult(
+      blink::ServiceWorkerStatusCode actual_status,
+      ServiceWorkerFetchDispatcher::FetchEventResult actual_result,
+      blink::mojom::FetchAPIResponsePtr actual_response,
+      blink::mojom::ServiceWorkerStreamHandlePtr /* stream */,
+      blink::mojom::ServiceWorkerFetchEventTimingPtr /* timing */,
+      scoped_refptr<ServiceWorkerVersion> worker);
+
+  const GURL url_;
+  ServiceWorkerContext::CheckOfflineCapabilityCallback callback_;
+  std::unique_ptr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_OFFLINE_CAPABILITY_CHECKER_H_
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 9896820b..a3cf15c 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -7140,7 +7140,9 @@
     // X-Frame-Options and CSP frame-ancestors behave differently. XFO commits
     // an error page, while CSP commits a "data:," URL.
     // TODO(https://crbug.com/870815): Use an error page for both.
-    if (test.use_error_page) {
+    if (test.use_error_page ||
+        base::FeatureList::IsEnabled(
+            network::features::kOutOfBlinkFrameAncestors)) {
       EXPECT_FALSE(load_observer.last_navigation_succeeded());
       EXPECT_EQ(net::ERR_BLOCKED_BY_RESPONSE,
                 load_observer.last_net_error_code());
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc
index df50aa84..bd64fae 100644
--- a/content/browser/speech/speech_recognizer_impl.cc
+++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -230,7 +230,8 @@
 
 void SpeechRecognizerImpl::AbortRecognition() {
   base::PostTask(FROM_HERE, {BrowserThread::IO},
-                 base::BindOnce(&SpeechRecognizerImpl::DispatchEvent, this,
+                 base::BindOnce(&SpeechRecognizerImpl::DispatchEvent,
+                                weak_ptr_factory_.GetWeakPtr(),
                                 FSMEventArgs(EVENT_ABORT)));
 }
 
diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc
index 5214880..df50d37 100644
--- a/content/browser/tracing/tracing_ui.cc
+++ b/content/browser/tracing/tracing_ui.cc
@@ -15,6 +15,7 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/format_macros.h"
 #include "base/json/json_reader.h"
@@ -69,8 +70,7 @@
 }
 
 void OnRecordingEnabledAck(WebUIDataSource::GotDataCallback callback) {
-  std::move(callback).Run(
-      scoped_refptr<base::RefCountedMemory>(new base::RefCountedString()));
+  std::move(callback).Run(base::MakeRefCounted<base::RefCountedString>());
 }
 
 void OnTraceBufferUsageResult(WebUIDataSource::GotDataCallback callback,
@@ -103,25 +103,25 @@
 }
 
 bool OnBeginJSONRequest(const std::string& path,
-                        WebUIDataSource::GotDataCallback* callback) {
+                        WebUIDataSource::GotDataCallback callback) {
   if (path == "json/categories") {
     return TracingController::GetInstance()->GetCategories(
-        base::BindOnce(OnGotCategories, std::move(*callback)));
+        base::BindOnce(OnGotCategories, std::move(callback)));
   }
 
   const char kBeginRecordingPath[] = "json/begin_recording?";
   if (base::StartsWith(path, kBeginRecordingPath,
                        base::CompareCase::SENSITIVE)) {
     std::string data = path.substr(strlen(kBeginRecordingPath));
-    return BeginRecording(data, std::move(*callback));
+    return BeginRecording(data, std::move(callback));
   }
   if (path == "json/get_buffer_percent_full") {
     return TracingController::GetInstance()->GetTraceBufferUsage(
-        base::BindOnce(OnTraceBufferUsageResult, std::move(*callback)));
+        base::BindOnce(OnTraceBufferUsageResult, std::move(callback)));
   }
   if (path == "json/get_buffer_status") {
     return TracingController::GetInstance()->GetTraceBufferUsage(
-        base::BindOnce(OnTraceBufferStatusResult, std::move(*callback)));
+        base::BindOnce(OnTraceBufferStatusResult, std::move(callback)));
   }
   if (path == "json/end_recording_compressed") {
     if (!TracingController::GetInstance()->IsTracing())
@@ -129,7 +129,7 @@
     scoped_refptr<TracingController::TraceDataEndpoint> data_endpoint =
         TracingControllerImpl::CreateCompressedStringEndpoint(
             TracingControllerImpl::CreateCallbackEndpoint(base::BindOnce(
-                TracingCallbackWrapperBase64, std::move(*callback))),
+                TracingCallbackWrapperBase64, std::move(callback))),
             false /* compress_with_background_priority */);
     return TracingController::GetInstance()->StopTracing(data_endpoint);
   }
@@ -145,11 +145,16 @@
 void OnTracingRequest(const std::string& path,
                       WebUIDataSource::GotDataCallback callback) {
   DCHECK(OnShouldHandleRequest(path));
-  if (!OnBeginJSONRequest(path, &callback)) {
-    // OnBeginJSONRequest only consumes |callback| if it returns true.
-    DCHECK(callback);
+  // OnBeginJSONRequest() only runs |callback| if it returns true. But it needs
+  // to take ownership of |callback| even though it won't call |callback|
+  // sometimes, as it binds |callback| into other callbacks before it makes that
+  // decision. So we must give it one copy and keep one ourselves.
+  auto repeating_callback =
+      base::AdaptCallbackForRepeating(std::move(callback));
+  if (!OnBeginJSONRequest(path, repeating_callback)) {
     std::string error("##ERROR##");
-    std::move(callback).Run(base::RefCountedString::TakeString(&error));
+    std::move(repeating_callback)
+        .Run(base::RefCountedString::TakeString(&error));
   }
 }
 
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc
index a5ade7e..209ba74 100644
--- a/content/browser/web_contents/web_contents_view_aura_unittest.cc
+++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -315,13 +315,7 @@
 
 #if defined(OS_WIN)
 
-// Flaky crash on ASan: http://crbug.com/1020136
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_DragDropVirtualFiles DISABLED_DragDropVirtualFiles
-#else
-#define MAYBE_DragDropVirtualFiles DragDropVirtualFiles
-#endif
-TEST_F(WebContentsViewAuraTest, MAYBE_DragDropVirtualFiles) {
+TEST_F(WebContentsViewAuraTest, DragDropVirtualFiles) {
   WebContentsViewAura* view = GetView();
   auto data = std::make_unique<ui::OSExchangeData>();
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
index b389035..8215543 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
@@ -393,7 +393,7 @@
                                 bindToCaller, bindAsExternalService, false /* useStrongBinding */);
             } else if (ChildProcessConnection.supportVariableConnections()) {
                 connectionAllocator = ChildConnectionAllocator.createVariableSize(context,
-                        LauncherThread.getHandler(), packageName,
+                        LauncherThread.getHandler(), freeSlotRunnable, packageName,
                         ChildProcessCreationParamsImpl.getSandboxedServicesName(), bindToCaller,
                         bindAsExternalService, false /* useStrongBinding */);
             } else {
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h
index 60035aa8..1544a2f 100644
--- a/content/public/browser/service_worker_context.h
+++ b/content/public/browser/service_worker_context.h
@@ -35,6 +35,11 @@
   SERVICE_WORKER_WITH_FETCH_HANDLER,
 };
 
+enum class OfflineCapability {
+  kUnsupported,
+  kSupported,
+};
+
 // Used for UMA. Append only.
 enum class StartServiceWorkerForNavigationHintResult {
   // The service worker started successfully.
@@ -68,6 +73,9 @@
   using CheckHasServiceWorkerCallback =
       base::OnceCallback<void(ServiceWorkerCapability capability)>;
 
+  using CheckOfflineCapabilityCallback =
+      base::OnceCallback<void(OfflineCapability capability)>;
+
   using CountExternalRequestsCallback =
       base::OnceCallback<void(size_t external_request_count)>;
 
@@ -175,6 +183,19 @@
       const GURL& url,
       CheckHasServiceWorkerCallback callback) = 0;
 
+  // Simulates a navigation request in the offline state and dispatches a fetch
+  // event. Returns OfflineCapability::kSupported if the response's status code
+  // is 200.
+  //
+  // This function can be called from any thread, but the callback will always
+  // be called on the UI thread.
+  //
+  // TODO(hayato): Re-visit to integrate this function with
+  // |ServiceWorkerContext::CheckHasServiceWorker|.
+  virtual void CheckOfflineCapability(
+      const GURL& url,
+      CheckOfflineCapabilityCallback callback) = 0;
+
   // Stops all running service workers and unregisters all service worker
   // registrations. This method is used in web tests to make sure that the
   // existing service worker will not affect the succeeding tests.
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 0a9eca17..1f1186c 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -788,8 +788,9 @@
          rule.resolver_type !=
              net::RuleBasedHostResolverProc::Rule::kResolverTypeIPLiteral) ||
         rule.address_family != net::AddressFamily::ADDRESS_FAMILY_UNSPECIFIED ||
-        !!rule.latency_ms)
+        !!rule.latency_ms) {
       continue;
+    }
     network::mojom::RulePtr mojo_rule = network::mojom::Rule::New();
     if (rule.resolver_type ==
         net::RuleBasedHostResolverProc::Rule::kResolverTypeSystem) {
@@ -803,6 +804,8 @@
     }
     mojo_rule->host_pattern = rule.host_pattern;
     mojo_rule->replacement = rule.replacement;
+    mojo_rule->host_resolver_flags = rule.host_resolver_flags;
+    mojo_rule->canonical_name = rule.canonical_name;
     mojo_rules.push_back(std::move(mojo_rule));
   }
 
diff --git a/content/public/test/fake_service_worker_context.cc b/content/public/test/fake_service_worker_context.cc
index ab62c2be3..4a21d33 100644
--- a/content/public/test/fake_service_worker_context.cc
+++ b/content/public/test/fake_service_worker_context.cc
@@ -72,6 +72,11 @@
     CheckHasServiceWorkerCallback callback) {
   NOTREACHED();
 }
+void FakeServiceWorkerContext::CheckOfflineCapability(
+    const GURL& url,
+    const ServiceWorkerContext::CheckOfflineCapabilityCallback callback) {
+  NOTREACHED();
+}
 void FakeServiceWorkerContext::ClearAllServiceWorkersForTest(
     base::OnceClosure) {
   NOTREACHED();
diff --git a/content/public/test/fake_service_worker_context.h b/content/public/test/fake_service_worker_context.h
index 9fdfdf72..5af8077 100644
--- a/content/public/test/fake_service_worker_context.h
+++ b/content/public/test/fake_service_worker_context.h
@@ -53,6 +53,10 @@
   void PerformStorageCleanup(base::OnceClosure callback) override;
   void CheckHasServiceWorker(const GURL& url,
                              CheckHasServiceWorkerCallback callback) override;
+  void CheckOfflineCapability(
+      const GURL& url,
+      const ServiceWorkerContext::CheckOfflineCapabilityCallback callback)
+      override;
   void ClearAllServiceWorkersForTest(base::OnceClosure) override;
   void StartWorkerForScope(
       const GURL& scope,
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc
index 96a42fd..680eeda0 100644
--- a/content/public/test/network_service_test_helper.cc
+++ b/content/public/test/network_service_test_helper.cc
@@ -21,6 +21,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/test_host_resolver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "net/base/ip_address.h"
 #include "net/cert/mock_cert_verifier.h"
 #include "net/cert/test_root_certs.h"
 #include "net/dns/mock_host_resolver.h"
@@ -115,15 +116,21 @@
         case network::mojom::ResolverType::kResolverTypeFailTimeout:
           host_resolver->AddSimulatedTimeoutFailure(rule->host_pattern);
           break;
-        case network::mojom::ResolverType::kResolverTypeIPLiteral:
-          host_resolver->AddIPLiteralRule(rule->host_pattern, rule->replacement,
-                                          std::string());
+        case network::mojom::ResolverType::kResolverTypeIPLiteral: {
+          net::IPAddress ip_address;
+          DCHECK(ip_address.AssignFromIPLiteral(rule->replacement));
+          host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement,
+                                          rule->host_resolver_flags,
+                                          rule->canonical_name);
           break;
+        }
         case network::mojom::ResolverType::kResolverTypeDirectLookup:
           host_resolver->AllowDirectLookup(rule->host_pattern);
           break;
         default:
-          host_resolver->AddRule(rule->host_pattern, rule->replacement);
+          host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement,
+                                          rule->host_resolver_flags,
+                                          rule->canonical_name);
           break;
       }
     }
diff --git a/content/test/data/service_worker/create_service_worker.html b/content/test/data/service_worker/create_service_worker.html
index 2d47c2a..10f550a7 100644
--- a/content/test/data/service_worker/create_service_worker.html
+++ b/content/test/data/service_worker/create_service_worker.html
@@ -12,6 +12,17 @@
   }
 }
 
+async function registerWithoutAwaitingReady(worker_url, scope) {
+  try {
+    const init = scope ? {scope} : {};
+    await navigator.serviceWorker.register(worker_url, init);
+    // Don't await for navigator.serviceWorker.ready.
+    return 'DONE';
+  } catch (error) {
+    return `${error}`;
+  }
+}
+
 async function update(scope) {
   try {
     const registration =
diff --git a/content/test/data/service_worker/maybe_offline_support.js b/content/test/data/service_worker/maybe_offline_support.js
index ec825ee1..b04d302 100644
--- a/content/test/data/service_worker/maybe_offline_support.js
+++ b/content/test/data/service_worker/maybe_offline_support.js
@@ -10,6 +10,14 @@
   });
 }
 
+const scriptUrlParams = new URL(self.serviceWorker.scriptURL).searchParams;
+if (scriptUrlParams.has('pendingInstallEvent')) {
+  // Prevents this SW from being activated.
+  self.addEventListener('install', e => {
+    e.waitUntil(new Promise(resolve => {}));
+  });
+}
+
 self.addEventListener("fetch", event => {
   const param = new URL(event.request.url).searchParams;
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index cd8ac015..7178258 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -199,6 +199,9 @@
 # Produces blank images on Intel HD 630 w/ Mesa 19.0.2
 crbug.com/976861 [ linux intel-0x5912 ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ]
 
+# Flakes regularly on Mac.
+crbug.com/1040202 [ mac ] Pixel_CSSFilterEffects_NoOverlays [ Failure ]
+
 # Skip swap chain tests on non-Windows
 [ android ] Pixel_CanvasLowLatency2DSwapChain [ Skip ]
 [ android ] Pixel_CanvasLowLatencyWebGLSwapChain [ Skip ]
diff --git a/docs/speed/benchmark/harnesses/blink_perf.md b/docs/speed/benchmark/harnesses/blink_perf.md
index 6aca9ff..54f2d87 100644
--- a/docs/speed/benchmark/harnesses/blink_perf.md
+++ b/docs/speed/benchmark/harnesses/blink_perf.md
@@ -147,6 +147,25 @@
 
 [simple-blob-measure-async.html](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/test_data/simple-blob-measure-async.html)
 
+
+### Service Worker Perf Tests
+You can also run perf tests in service workers. You need to trigger the test
+with `PerfTestRunner.startMeasureValuesInWorker()` in a page. Within the `run`
+method provided to this function, you can initialize a worker and ask the
+worker to run the workload by using `measureRunsPerSecond()` defined in
+[worker-test-helper.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/resources/worker-test-helper.js).
+
+`measureRunsPerSecond()` returns a promise which resolves to the test result.
+The worker should send the result back to the page, and the page records the
+result by `PerfTestRunner.recordResultFromWorker()`. After the result is
+recorded, the test finishes.
+
+Here is an example for testing Cache Storage API of service workers:
+
+[cache-open-add-delete-10K-service-worker.html](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K-service-worker.html)
+
+[cache-open-add-delete-10K-service-worker.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js)
+
 ## Canvas Tests
 
 The sub-framework [canvas_runner.js](https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/perf_tests/canvas/resources/canvas_runner.js) is used for
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 9d5229fb..bb7e8dc 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1489,6 +1489,7 @@
   WEBCAMPRIVATE_SET_HOME = 1426,
   INPUTMETHODPRIVATE_RESET = 1427,
   PRINTING_GETPRINTERINFO = 1428,
+  AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED = 1429,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index 505affa4..f269259 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -106,12 +106,6 @@
                              base::TimeDelta::FromSeconds(1),
                              kGpuChannelHostMaxWaitTime, 50);
 
-  // Histogram to measure how long the browser UI thread spends blocked.
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-      "GPU.GPUChannelHostWaitTime.MicroSeconds", wait_duration,
-      base::TimeDelta::FromMicroseconds(10), base::TimeDelta::FromSeconds(10),
-      50);
-
   // Continue waiting for the event if not signaled
   if (!signaled)
     pending_sync.done_event->Wait();
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star
index a69dd66..da083493 100644
--- a/infra/config/buckets/try.star
+++ b/infra/config/buckets/try.star
@@ -184,7 +184,6 @@
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
-    tryjob = tryjob(),
 )
 
 android_builder(
diff --git a/infra/config/consoles/chromium.android.star b/infra/config/consoles/chromium.android.star
index d27286d..ddf15887 100644
--- a/infra/config/consoles/chromium.android.star
+++ b/infra/config/consoles/chromium.android.star
@@ -188,7 +188,7 @@
         ),
         luci.console_view_entry(
             builder = 'ci/android-pie-arm64-rel',
-            category = 'on_cq',
+            category = 'on_cq|future',
             short_name = 'P',
         ),
     ],
diff --git a/infra/config/dev/buckets/ci.star b/infra/config/dev/buckets/ci.star
index 960b682b..44fe000 100644
--- a/infra/config/dev/buckets/ci.star
+++ b/infra/config/dev/buckets/ci.star
@@ -61,10 +61,6 @@
 )
 
 ci_builder(
-    name = 'ChromeOS Swarm',
-)
-
-ci_builder(
     name = 'Linux Swarm',
 )
 
diff --git a/infra/config/dev/consoles/chromium.swarm.star b/infra/config/dev/consoles/chromium.swarm.star
index 61f27ed2..e75f2a6 100644
--- a/infra/config/dev/consoles/chromium.swarm.star
+++ b/infra/config/dev/consoles/chromium.swarm.star
@@ -5,7 +5,6 @@
     entries = [
         luci.console_view_entry(builder = 'ci/Android N5 Swarm'),
         luci.console_view_entry(builder = 'ci/Android N5X Swarm'),
-        luci.console_view_entry(builder = 'ci/ChromeOS Swarm'),
         luci.console_view_entry(builder = 'ci/Linux Swarm'),
         luci.console_view_entry(builder = 'ci/Mac Swarm'),
         luci.console_view_entry(builder = 'ci/Windows Swarm'),
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index 61dc987..94cda54 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -89,6 +89,7 @@
       >
       builders: <
         name: "chromium/try/android-pie-arm64-rel"
+        includable_only: true
       >
       builders: <
         name: "chromium/try/android-pie-x86-fyi-rel"
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index 01bfded..9748939 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -19,8 +19,6 @@
 
 * [android-marshmallow-arm64-rel](https://ci.chromium.org/p/chromium/builders/try/android-marshmallow-arm64-rel) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android-marshmallow-arm64-rel)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android-marshmallow-arm64-rel))
 
-* [android-pie-arm64-rel](https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android-pie-arm64-rel)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android-pie-arm64-rel))
-
 * [android_compile_dbg](https://ci.chromium.org/p/chromium/builders/try/android_compile_dbg) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android_compile_dbg)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android_compile_dbg))
 
 * [android_cronet](https://ci.chromium.org/p/chromium/builders/try/android_cronet) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+android_cronet)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+android_cronet))
diff --git a/infra/config/generated/cr-buildbucket-dev.cfg b/infra/config/generated/cr-buildbucket-dev.cfg
index d41cbcf..27acbff 100644
--- a/infra/config/generated/cr-buildbucket-dev.cfg
+++ b/infra/config/generated/cr-buildbucket-dev.cfg
@@ -55,22 +55,6 @@
       service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
     >
     builders: <
-      name: "ChromeOS Swarm"
-      swarming_host: "chromium-swarm-dev.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      recipe: <
-        name: "swarming/staging"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "mastername:\"chromium.swarm\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
       name: "Linux Swarm"
       swarming_host: "chromium-swarm-dev.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo-dev.cfg b/infra/config/generated/luci-milo-dev.cfg
index d805e00..907d3aa 100644
--- a/infra/config/generated/luci-milo-dev.cfg
+++ b/infra/config/generated/luci-milo-dev.cfg
@@ -17,9 +17,6 @@
     name: "buildbucket/luci.chromium.ci/Android N5X Swarm"
   >
   builders: <
-    name: "buildbucket/luci.chromium.ci/ChromeOS Swarm"
-  >
-  builders: <
     name: "buildbucket/luci.chromium.ci/Linux Swarm"
   >
   builders: <
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index f0586ba..7bfaab8 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -812,7 +812,7 @@
   >
   builders: <
     name: "buildbucket/luci.chromium.ci/android-pie-arm64-rel"
-    category: "on_cq"
+    category: "on_cq|future"
     short_name: "P"
   >
   header: <
diff --git a/infra/config/generated/luci-scheduler-dev.cfg b/infra/config/generated/luci-scheduler-dev.cfg
index b60efc6..f99c0aca 100644
--- a/infra/config/generated/luci-scheduler-dev.cfg
+++ b/infra/config/generated/luci-scheduler-dev.cfg
@@ -23,15 +23,6 @@
   >
 >
 job: <
-  id: "ChromeOS Swarm"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket-dev.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "ChromeOS Swarm"
-  >
->
-job: <
   id: "Linux Swarm"
   acl_sets: "ci"
   buildbucket: <
@@ -73,7 +64,6 @@
   acl_sets: "ci"
   triggers: "Android N5 Swarm"
   triggers: "Android N5X Swarm"
-  triggers: "ChromeOS Swarm"
   triggers: "Linux Swarm"
   triggers: "Mac Swarm"
   triggers: "Windows Swarm"
diff --git a/ios/chrome/browser/browsing_data/browsing_data_features.cc b/ios/chrome/browser/browsing_data/browsing_data_features.cc
index cc8a4a3..fe238c0 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_features.cc
+++ b/ios/chrome/browser/browsing_data/browsing_data_features.cc
@@ -4,12 +4,5 @@
 
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 
-const base::Feature kNewClearBrowsingDataUI{"NewClearBrowsingDataUI",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kWebClearBrowsingData{"WebClearBrowsingData",
                                           base::FEATURE_ENABLED_BY_DEFAULT};
-
-bool IsNewClearBrowsingDataUIEnabled() {
-  return base::FeatureList::IsEnabled(kNewClearBrowsingDataUI);
-}
diff --git a/ios/chrome/browser/browsing_data/browsing_data_features.h b/ios/chrome/browser/browsing_data/browsing_data_features.h
index 64d9bd7..8dbd9f4 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_features.h
+++ b/ios/chrome/browser/browsing_data/browsing_data_features.h
@@ -7,14 +7,8 @@
 
 #include "base/feature_list.h"
 
-// Feature flag to enable new Clear Browsing Data UI.
-extern const base::Feature kNewClearBrowsingDataUI;
-
 // Feature to use the clear browsing data from web instead of the one from
 // chrome.
 extern const base::Feature kWebClearBrowsingData;
 
-// Whether the new Clear Browsing Data UI is enabled.
-bool IsNewClearBrowsingDataUIEnabled();
-
 #endif  // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_FEATURES_H_
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index d25ffbac..9faa2c49 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -314,10 +314,6 @@
      flag_descriptions::kAutofillIOSDelayBetweenFieldsName,
      flag_descriptions::kAutofillIOSDelayBetweenFieldsDescription,
      flags_ui::kOsIos, MULTI_VALUE_TYPE(kAutofillIOSDelayBetweenFieldsChoices)},
-    {"new-clear-browsing-data-ui",
-     flag_descriptions::kNewClearBrowsingDataUIName,
-     flag_descriptions::kNewClearBrowsingDataUIDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kNewClearBrowsingDataUI)},
     {"autofill-show-all-profiles-on-prefilled-forms",
      flag_descriptions::kAutofillShowAllSuggestionsOnPrefilledFormsName,
      flag_descriptions::kAutofillShowAllSuggestionsOnPrefilledFormsDescription,
@@ -604,7 +600,11 @@
      FEATURE_VALUE_TYPE(web::kReloadSadTab)},
     {"page-info-refactoring", flag_descriptions::kPageInfoRefactoringName,
      flag_descriptions::kPageInfoRefactoringDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kPageInfoRefactoring)}};
+     FEATURE_VALUE_TYPE(kPageInfoRefactoring)},
+    {"contained-browser-bvc", flag_descriptions::kContainedBVCName,
+     flag_descriptions::kContainedBVCDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kContainedBVC)},
+};
 
 // Add all switches from experimental flags to |command_line|.
 void AppendSwitchesFromExperimentalSettings(base::CommandLine* command_line) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index f9cacad..2cacac97 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -130,6 +130,11 @@
 const char kConfirmInfobarMessagesUIDescription[] =
     "When enabled Confirm Infobars use the new Messages UI.";
 
+const char kContainedBVCName[] = "Contained Browser ViewController";
+const char kContainedBVCDescription[] =
+    "When enabled, the BrowserViewController is contained by the TabGrid "
+    "instead of being presented";
+
 const char kCrashRestoreInfobarMessagesUIName[] =
     "Crash Restore Infobars Messages UI";
 const char kCrashRestoreInfobarMessagesUIDescription[] =
@@ -261,10 +266,6 @@
     "Request the Mobile version of Google SRP by default when the desktop mode "
     "is requested by default.";
 
-const char kNewClearBrowsingDataUIName[] = "Clear Browsing Data UI";
-const char kNewClearBrowsingDataUIDescription[] =
-    "Enable new Clear Browsing Data UI.";
-
 const char kNewOmniboxPopupLayoutName[] = "New omnibox popup";
 const char kNewOmniboxPopupLayoutDescription[] =
     "Switches the omnibox suggestions and omnibox itself to display the new "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index b72755a..be4c91f 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -103,6 +103,11 @@
 extern const char kConfirmInfobarMessagesUIName[];
 extern const char kConfirmInfobarMessagesUIDescription[];
 
+// Title and description for the flag that makes the Browser being contained by
+// the TabGrid instead of being presented.
+extern const char kContainedBVCName[];
+extern const char kContainedBVCDescription[];
+
 // Title and description for the flag that enables Messages UI on
 // Crash Restore Infobars.
 extern const char kCrashRestoreInfobarMessagesUIName[];
@@ -227,10 +232,6 @@
 extern const char kMobileGoogleSRPName[];
 extern const char kMobileGoogleSRPDescription[];
 
-// Title and description for the flag to enable new Clear Browsing Data UI.
-extern const char kNewClearBrowsingDataUIName[];
-extern const char kNewClearBrowsingDataUIDescription[];
-
 // Title and description for the flag to display new omnibox popup.
 extern const char kNewOmniboxPopupLayoutName[];
 extern const char kNewOmniboxPopupLayoutDescription[];
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index 0b8cfe1..22e0299 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -61,7 +61,6 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/web/tab_id_tab_helper.h"
 #include "ios/chrome/grit/ios_strings.h"
-#import "ios/web/common/origin_util.h"
 #include "ios/web/common/url_scheme_util.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
 #include "ios/web/public/js_messaging/web_frame.h"
diff --git a/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm b/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm
index 66cf64c8..a30b7ca 100644
--- a/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm
+++ b/ios/chrome/browser/tabs/tab_model_closing_web_state_observer.mm
@@ -8,6 +8,7 @@
 #include "base/strings/string_piece.h"
 #include "components/sessions/core/tab_restore_service.h"
 #include "components/sessions/ios/ios_live_tab.h"
+#include "components/sessions/ios/ios_restore_live_tab.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
@@ -78,9 +79,15 @@
   if (!_restoreService)
     return;
 
+  web::NavigationManager* navigationManager = webState->GetNavigationManager();
+  if (navigationManager->IsRestoreSessionInProgress()) {
+    auto live_tab = std::make_unique<sessions::RestoreIOSLiveTab>(
+        webState->BuildSessionStorage());
+    _restoreService->CreateHistoricalTab(live_tab.get(), atIndex);
+    return;
+  }
   // No need to record history if the tab has no navigation or has only
   // presented the NTP or the bookmark UI.
-  web::NavigationManager* navigationManager = webState->GetNavigationManager();
   if (navigationManager->GetItemCount() <= 1) {
     web::NavigationItem* item = navigationManager->GetLastCommittedItem();
     if (!item)
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h
index 054c506..dadaf0db 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h
@@ -13,7 +13,6 @@
 
 @class ChromeIdentity;
 
-// TODO(crbug.com/894800): Remove this.
 // Item for account avatar, used everywhere an account cell is shown.
 @interface CollectionViewAccountItem : CollectionViewItem
 
diff --git a/ios/chrome/browser/ui/commands/BUILD.gn b/ios/chrome/browser/ui/commands/BUILD.gn
index 6bdec25..23a4bdb 100644
--- a/ios/chrome/browser/ui/commands/BUILD.gn
+++ b/ios/chrome/browser/ui/commands/BUILD.gn
@@ -26,7 +26,6 @@
     "reading_list_add_command.mm",
     "send_tab_to_self_command.h",
     "send_tab_to_self_command.mm",
-    "settings_main_page_commands.h",
     "show_signin_command.h",
     "show_signin_command.mm",
     "snackbar_commands.h",
diff --git a/ios/chrome/browser/ui/commands/settings_main_page_commands.h b/ios/chrome/browser/ui/commands/settings_main_page_commands.h
deleted file mode 100644
index fa975fa..0000000
--- a/ios/chrome/browser/ui/commands/settings_main_page_commands.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_
-#define IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_
-
-// Command protocol for commands related to the Settings Main Page.
-@protocol SettingsMainPageCommands
-// Called when the Material Cell Catalog cell is tapped.
-- (void)showMaterialCellCatalog;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_COMMANDS_SETTINGS_MAIN_PAGE_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index 9e88ec02..65f8f3e3 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -56,7 +56,6 @@
 #import "ios/chrome/browser/ui/payments/js_payment_request_manager.h"
 #import "ios/chrome/browser/ui/payments/payment_request_coordinator.h"
 #import "ios/chrome/browser/ui/payments/payment_request_error_coordinator.h"
-#include "ios/web/common/origin_util.h"
 #import "ios/web/common/url_scheme_util.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
 #include "ios/web/public/deprecated/url_verification_constants.h"
@@ -70,6 +69,7 @@
 #import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state.h"
 #import "ios/web/public/web_state_observer_bridge.h"
+#include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
 #include "url/gurl.h"
@@ -995,8 +995,7 @@
 
   const GURL lastCommittedURL = _activeWebState->GetLastCommittedURL();
 
-  if (!web::IsOriginSecure(lastCommittedURL) ||
-      lastCommittedURL.scheme() == url::kDataScheme) {
+  if (!network::IsUrlPotentiallyTrustworthy(lastCommittedURL)) {
     DLOG(ERROR) << "Not in a secure context.";
     return NO;
   }
@@ -1212,10 +1211,8 @@
 
   // Set the JS isContextSecure global variable at the earliest opportunity.
   [_paymentRequestJsManager
-       setContextSecure:(web::IsOriginSecure(
-                             _activeWebState->GetLastCommittedURL()) &&
-                         _activeWebState->GetLastCommittedURL().scheme() !=
-                             url::kDataScheme)
+       setContextSecure:(network::IsUrlPotentiallyTrustworthy(
+                            _activeWebState->GetLastCommittedURL()))
       completionHandler:nil];
 }
 
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 21d7518..388bb9d3 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -8,8 +8,6 @@
     "bar_button_activity_indicator.h",
     "bar_button_activity_indicator.mm",
     "settings_navigation_controller.h",
-    "settings_root_collection_view_controller.h",
-    "settings_root_collection_view_controller.mm",
     "settings_root_table_view_controller.h",
     "settings_root_table_view_controller.mm",
     "settings_root_view_controlling.h",
@@ -19,9 +17,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/ui:feature_flags",
-    "//ios/chrome/browser/ui/collection_view",
-    "//ios/chrome/browser/ui/collection_view/cells",
-    "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/material_components",
     "//ios/chrome/browser/ui/settings/cells",
@@ -33,7 +28,6 @@
     "//ios/chrome/common/ui_util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/user_feedback",
-    "//ios/third_party/material_components_ios",
     "//ui/base",
   ]
 }
@@ -66,8 +60,6 @@
     "handoff_table_view_controller.mm",
     "import_data_table_view_controller.h",
     "import_data_table_view_controller.mm",
-    "material_cell_catalog_view_controller.h",
-    "material_cell_catalog_view_controller.mm",
     "privacy_table_view_controller.h",
     "privacy_table_view_controller.mm",
     "search_engine_table_view_controller.h",
@@ -154,7 +146,6 @@
     "//ios/chrome/browser/ui/authentication",
     "//ios/chrome/browser/ui/authentication/cells",
     "//ios/chrome/browser/ui/autofill/cells",
-    "//ios/chrome/browser/ui/collection_view",
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions/cells",
@@ -196,14 +187,10 @@
     "//ios/public/provider/chrome/browser/signin",
     "//ios/public/provider/chrome/browser/user_feedback",
     "//ios/public/provider/chrome/browser/voice",
-    "//ios/third_party/material_components_ios",
     "//net",
     "//ui/base",
     "//url",
   ]
-  public_deps = [
-    "//ios/chrome/browser/ui/collection_view/cells",
-  ]
   allow_circular_includes_from = [ "//ios/chrome/browser/ui/authentication" ]
   libs = [
     "CoreLocation.framework",
@@ -277,7 +264,6 @@
     "privacy_table_view_controller_unittest.mm",
     "search_engine_table_view_controller_unittest.mm",
     "settings_navigation_controller_unittest.mm",
-    "settings_root_collection_view_controller_unittest.mm",
     "settings_root_table_view_controller_unittest.mm",
     "translate_table_view_controller_unittest.mm",
     "voice_search_table_view_controller_unittest.mm",
@@ -322,9 +308,6 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/translate",
     "//ios/chrome/browser/ui:feature_flags",
-    "//ios/chrome/browser/ui/collection_view",
-    "//ios/chrome/browser/ui/collection_view:test_support",
-    "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/icons",
     "//ios/chrome/browser/ui/settings/cells",
     "//ios/chrome/browser/ui/table_view",
@@ -337,7 +320,6 @@
     "//ios/chrome/test/app:test_support",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/voice",
-    "//ios/third_party/material_components_ios",
     "//ios/web/public/test",
     "//net",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn
index cdd974b..42b6cb11 100644
--- a/ios/chrome/browser/ui/settings/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -24,8 +24,6 @@
     "settings_switch_cell.mm",
     "settings_switch_item.h",
     "settings_switch_item.mm",
-    "settings_text_item.h",
-    "settings_text_item.mm",
     "sync_switch_item.h",
     "sync_switch_item.mm",
     "table_view_clear_browsing_data_item.h",
@@ -57,7 +55,6 @@
 
   public_deps = [
     ":clear_browsing_data_constants",
-    "//ios/chrome/browser/ui/settings/cells/legacy",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn b/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn
deleted file mode 100644
index 9e325a9..0000000
--- a/ios/chrome/browser/ui/settings/cells/legacy/BUILD.gn
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("legacy") {
-  sources = [
-    "legacy_settings_detail_item.h",
-    "legacy_settings_detail_item.mm",
-  ]
-
-  deps = [
-    "//components/strings",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser/ui/collection_view/cells",
-    "//ios/chrome/browser/ui/colors",
-    "//ios/chrome/browser/ui/icons",
-    "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
-    "//ios/chrome/common/ui_util",
-    "//ui/base",
-  ]
-
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h b/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h
deleted file mode 100644
index 8d7f725b..0000000
--- a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
-
-// LegacySettingsDetailItem is a model class that uses LegacySettingsDetailCell.
-@interface LegacySettingsDetailItem : CollectionViewItem
-
-// The filename for the leading icon.  If empty, no icon will be shown.
-@property(nonatomic, copy) NSString* iconImageName;
-
-// The accessory type to display on the trailing edge of the cell.
-@property(nonatomic) MDCCollectionViewCellAccessoryType accessoryType;
-
-// The main text string.
-@property(nonatomic, copy) NSString* text;
-
-// The detail text string.
-@property(nonatomic, copy) NSString* detailText;
-
-@end
-
-// LegacySettingsDetailCell implements an MDCCollectionViewCell subclass
-// containing an optional leading icon and two text labels: a "main" label and a
-// "detail" label. The two labels are laid out side-by-side and fill the full
-// width of the cell. Labels are truncated as needed to fit in the cell.
-@interface LegacySettingsDetailCell : MDCCollectionViewCell
-
-// UILabels corresponding to |text| and |detailText| from the item.
-@property(nonatomic, readonly, strong) UILabel* textLabel;
-@property(nonatomic, readonly, strong) UILabel* detailTextLabel;
-
-// Sets the image that should be displayed at the leading edge of the cell. If
-// set to nil, the icon will be hidden and the text labels will expand to fill
-// the full width of the cell.
-- (void)setIconImage:(UIImage*)image;
-
-// The amount of horizontal space to provide to each of the labels. These values
-// are determined with the following logic:
-//
-// - If there is sufficient room (after accounting for margins) for the full
-//   width of each label, use the current width of each label.
-// - If not, use the current width of the main label and a clipped width for the
-//   detail label.
-// - Unless the main label wants more than 75% of the available width and the
-//   detail label wants 25% or less of the available width, in which case use a
-//   clipped width for the main label and the current width of the detail label.
-// - If both labels want more width than their guaranteed minimums (75% and
-//   25%), use the guaranteed minimum amount for each.
-//
-// Exposed for testing.
-@property(nonatomic, readonly) CGFloat textLabelTargetWidth;
-@property(nonatomic, readonly) CGFloat detailTextLabelTargetWidth;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_LEGACY_LEGACY_SETTINGS_DETAIL_ITEM_H_
diff --git a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm b/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm
deleted file mode 100644
index d8d7168..0000000
--- a/ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.mm
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h"
-
-#include <algorithm>
-
-#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
-#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
-#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/ui_util/constraints_ui_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-// Padding used on the leading and trailing edges of the cell and between the
-// two labels.
-const CGFloat kHorizontalPadding = 16;
-
-// Padding used between the icon and the text labels.
-const CGFloat kIconTrailingPadding = 12;
-
-// Padding used on the top and bottom edges of the cell.
-const CGFloat kVerticalPadding = 16;
-
-// Size of the icon image.
-const CGFloat kIconImageSize = 28;
-
-// Minimum proportion of the available width to guarantee to the main and detail
-// labels.
-const CGFloat kMinTextWidthRatio = 0.75f;
-const CGFloat kMinDetailTextWidthRatio = 0.25f;
-}  // namespace
-
-@implementation LegacySettingsDetailItem
-
-@synthesize accessoryType = _accessoryType;
-@synthesize iconImageName = _iconImageName;
-@synthesize text = _text;
-@synthesize detailText = _detailText;
-
-- (instancetype)initWithType:(NSInteger)type {
-  self = [super initWithType:type];
-  if (self) {
-    self.cellClass = [LegacySettingsDetailCell class];
-  }
-  return self;
-}
-
-#pragma mark CollectionViewItem
-
-- (void)configureCell:(LegacySettingsDetailCell*)cell {
-  [super configureCell:cell];
-  [cell cr_setAccessoryType:self.accessoryType];
-  cell.textLabel.text = self.text;
-  cell.detailTextLabel.text = self.detailText;
-
-  // Update the icon image, if one is present.
-  UIImage* iconImage = nil;
-  if ([self.iconImageName length]) {
-    iconImage = [UIImage imageNamed:self.iconImageName];
-  }
-  [cell setIconImage:iconImage];
-}
-
-@end
-
-@implementation LegacySettingsDetailCell {
-  UIImageView* _iconImageView;
-  UILayoutGuide* _labelContainerGuide;
-  NSLayoutConstraint* _iconHiddenConstraint;
-  NSLayoutConstraint* _iconVisibleConstraint;
-  NSLayoutConstraint* _textLabelWidthConstraint;
-  NSLayoutConstraint* _detailTextLabelWidthConstraint;
-}
-
-@synthesize detailTextLabel = _detailTextLabel;
-@synthesize textLabel = _textLabel;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  self = [super initWithFrame:frame];
-  if (self) {
-    self.isAccessibilityElement = YES;
-    UIView* contentView = self.contentView;
-
-    _iconImageView = [[UIImageView alloc] init];
-    _iconImageView.translatesAutoresizingMaskIntoConstraints = NO;
-    _iconImageView.hidden = YES;
-    [contentView addSubview:_iconImageView];
-
-    // Constrain the labels inside a container view, to make width computations
-    // easier.
-    _labelContainerGuide = [[UILayoutGuide alloc] init];
-    [contentView addLayoutGuide:_labelContainerGuide];
-
-    _textLabel = [[UILabel alloc] init];
-    _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-    _textLabel.textColor = UIColor.cr_labelColor;
-    _textLabel.backgroundColor = UIColor.clearColor;
-    [contentView addSubview:_textLabel];
-
-    _detailTextLabel = [[UILabel alloc] init];
-    _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    _detailTextLabel.font = [UIFont systemFontOfSize:kUIKitDetailFontSize];
-    _detailTextLabel.textColor = UIColor.cr_secondaryLabelColor;
-    _detailTextLabel.backgroundColor = UIColor.clearColor;
-    [contentView addSubview:_detailTextLabel];
-
-    // Set up the width constraints. They are activated here and updated in
-    // layoutSubviews.
-    _textLabelWidthConstraint =
-        [_textLabel.widthAnchor constraintEqualToConstant:0];
-    _detailTextLabelWidthConstraint =
-        [_detailTextLabel.widthAnchor constraintEqualToConstant:0];
-
-    // Set up the constraints for when the icon is visible and hidden.  One of
-    // these will be active at a time, defaulting to hidden.
-    _iconHiddenConstraint = [_labelContainerGuide.leadingAnchor
-        constraintEqualToAnchor:contentView.leadingAnchor
-                       constant:kHorizontalPadding];
-    _iconVisibleConstraint = [_labelContainerGuide.leadingAnchor
-        constraintEqualToAnchor:_iconImageView.trailingAnchor
-                       constant:kIconTrailingPadding];
-
-    [NSLayoutConstraint activateConstraints:@[
-      [_iconImageView.leadingAnchor
-          constraintEqualToAnchor:contentView.leadingAnchor
-                         constant:kHorizontalPadding],
-      [_iconImageView.widthAnchor constraintEqualToConstant:kIconImageSize],
-      [_iconImageView.heightAnchor constraintEqualToConstant:kIconImageSize],
-
-      // Fix the edges of the text labels.
-      [_textLabel.leadingAnchor
-          constraintEqualToAnchor:_labelContainerGuide.leadingAnchor],
-      [_detailTextLabel.trailingAnchor
-          constraintEqualToAnchor:_labelContainerGuide.trailingAnchor],
-      [_labelContainerGuide.trailingAnchor
-          constraintEqualToAnchor:contentView.trailingAnchor
-                         constant:-kHorizontalPadding],
-
-      // Set up the vertical constraints and align the baselines of the two text
-      // labels.
-      [_iconImageView.centerYAnchor
-          constraintEqualToAnchor:contentView.centerYAnchor],
-      [_textLabel.centerYAnchor
-          constraintEqualToAnchor:contentView.centerYAnchor],
-      [_detailTextLabel.firstBaselineAnchor
-          constraintEqualToAnchor:_textLabel.firstBaselineAnchor],
-
-      _textLabelWidthConstraint,
-      _detailTextLabelWidthConstraint,
-      _iconHiddenConstraint,
-    ]];
-
-    AddOptionalVerticalPadding(contentView, _textLabel, kVerticalPadding);
-  }
-  return self;
-}
-
-- (void)setIconImage:(UIImage*)image {
-  BOOL hidden = (image == nil);
-  if (hidden == _iconImageView.hidden) {
-    return;
-  }
-
-  _iconImageView.image = image;
-  _iconImageView.hidden = hidden;
-  if (hidden) {
-    _iconVisibleConstraint.active = NO;
-    _iconHiddenConstraint.active = YES;
-  } else {
-    _iconHiddenConstraint.active = NO;
-    _iconVisibleConstraint.active = YES;
-  }
-}
-
-// Updates the layout constraints of the text labels and then calls the
-// superclass's implementation of layoutSubviews which can then take account of
-// the new constraints.
-- (void)layoutSubviews {
-  [super layoutSubviews];
-
-  // Size the labels in order to determine how much width they want.
-  [self.textLabel sizeToFit];
-  [self.detailTextLabel sizeToFit];
-
-  // Update the width constraints.
-  _textLabelWidthConstraint.constant = self.textLabelTargetWidth;
-  _detailTextLabelWidthConstraint.constant = self.detailTextLabelTargetWidth;
-
-  // Now invoke the layout.
-  [super layoutSubviews];
-}
-
-- (void)prepareForReuse {
-  [super prepareForReuse];
-
-  [self setIconImage:nil];
-}
-
-- (CGFloat)textLabelTargetWidth {
-  CGFloat availableWidth =
-      CGRectGetWidth(_labelContainerGuide.layoutFrame) - kHorizontalPadding;
-  CGFloat textLabelWidth = self.textLabel.frame.size.width;
-  CGFloat detailTextLabelWidth = self.detailTextLabel.frame.size.width;
-
-  if (textLabelWidth + detailTextLabelWidth <= availableWidth)
-    return textLabelWidth;
-
-  return std::max(
-      availableWidth - detailTextLabelWidth,
-      std::min(availableWidth * kMinTextWidthRatio, textLabelWidth));
-}
-
-- (CGFloat)detailTextLabelTargetWidth {
-  CGFloat availableWidth =
-      CGRectGetWidth(_labelContainerGuide.layoutFrame) - kHorizontalPadding;
-  CGFloat textLabelWidth = self.textLabel.frame.size.width;
-  CGFloat detailTextLabelWidth = self.detailTextLabel.frame.size.width;
-
-  if (textLabelWidth + detailTextLabelWidth <= availableWidth)
-    return detailTextLabelWidth;
-
-  return std::max(availableWidth - textLabelWidth,
-                  std::min(availableWidth * kMinDetailTextWidthRatio,
-                           detailTextLabelWidth));
-}
-
-- (NSString*)accessibilityLabel {
-  return self.textLabel.text;
-}
-
-- (NSString*)accessibilityValue {
-  return self.detailTextLabel.text;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/settings/cells/settings_text_item.h b/ios/chrome/browser/ui/settings/cells/settings_text_item.h
deleted file mode 100644
index 230facb0..0000000
--- a/ios/chrome/browser/ui/settings/cells/settings_text_item.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
-
-// Collection view item to represent and configure a CollectionViewTextCell.
-// TODO(crbug.com/894800): Remove this.
-@interface SettingsTextItem : CollectionViewItem
-
-// The accessory type for the represented cell.
-@property(nonatomic) MDCCollectionViewCellAccessoryType accessoryType;
-
-// The main text to display.
-@property(nonatomic, nullable, copy) NSString* text;
-
-// The secondary text to display.
-@property(nonatomic, nullable, copy) NSString* detailText;
-
-// The font of the main text. Default is the medium SF font of size 16.
-@property(nonatomic, null_resettable, copy) UIFont* textFont;
-
-// The color of the main text. Default is the 900 tint color of the grey
-// palette.
-@property(nonatomic, null_resettable, copy) UIColor* textColor;
-
-@end
-
-// MDCCollectionViewCell that displays two text fields.
-@interface SettingsTextCell : MDCCollectionViewCell
-
-// The first line of text to display.
-@property(nonatomic, readonly, strong, nullable) UILabel* textLabel;
-
-// The second line of detail text to display.
-@property(nonatomic, readonly, strong, nullable) UILabel* detailTextLabel;
-
-// Returns the height needed for a cell contained in |width| to display
-// |titleLabel| and |detailTextLabel|.
-+ (CGFloat)heightForTitleLabel:(nullable UILabel*)titleLabel
-               detailTextLabel:(nullable UILabel*)detailTextLabel
-                         width:(CGFloat)width;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_CELLS_SETTINGS_TEXT_ITEM_H_
diff --git a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm b/ios/chrome/browser/ui/settings/cells/settings_text_item.mm
deleted file mode 100644
index 8868fb4..0000000
--- a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/settings/cells/settings_text_item.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
-#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
-#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
-#import "ios/chrome/common/ui_util/constraints_ui_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-const CGFloat kMargin = 16;
-const CGFloat kMinimalHeight = 48;
-}
-
-@interface SettingsTextItem ()
-
-// The maximum number of lines of the main text. Default is 1.
-@property(nonatomic, assign) NSInteger numberOfTextLines;
-
-// The font of the secondary text. Default is the regular Roboto font of size
-// 14.
-@property(nonatomic, null_resettable, copy) UIFont* detailTextFont;
-
-// The color of the secondary text. Default is the 500 tint color of the grey
-// palette.
-@property(nonatomic, null_resettable, copy) UIColor* detailTextColor;
-
-// The maximum number of lines of the secondary text. Default is 1.
-@property(nonatomic, assign) NSInteger numberOfDetailTextLines;
-
-@end
-
-@implementation SettingsTextItem
-
-@synthesize accessoryType = _accessoryType;
-@synthesize text = _text;
-@synthesize detailText = _detailText;
-@synthesize textFont = _textFont;
-@synthesize textColor = _textColor;
-@synthesize numberOfTextLines = _numberOfTextLines;
-@synthesize detailTextFont = _detailTextFont;
-@synthesize detailTextColor = _detailTextColor;
-@synthesize numberOfDetailTextLines = _numberOfDetailTextLines;
-
-- (instancetype)initWithType:(NSInteger)type {
-  self = [super initWithType:type];
-  if (self) {
-    self.cellClass = [SettingsTextCell class];
-    _numberOfTextLines = 1;
-    _numberOfDetailTextLines = 1;
-  }
-  return self;
-}
-
-- (UIFont*)textFont {
-  if (!_textFont) {
-    _textFont = [UIFont systemFontOfSize:kUIKitMainFontSize];
-  }
-  return _textFont;
-}
-
-- (UIColor*)textColor {
-  if (!_textColor) {
-    _textColor = [UIColor colorNamed:kTextPrimaryColor];
-  }
-  return _textColor;
-}
-
-- (UIFont*)detailTextFont {
-  if (!_detailTextFont) {
-    _detailTextFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-  }
-  return _detailTextFont;
-}
-
-- (UIColor*)detailTextColor {
-  if (!_detailTextColor) {
-    _detailTextColor = [UIColor colorNamed:kTextSecondaryColor];
-  }
-  return _detailTextColor;
-}
-
-#pragma mark CollectionViewItem
-
-- (void)configureCell:(SettingsTextCell*)cell {
-  [super configureCell:cell];
-  [cell cr_setAccessoryType:self.accessoryType];
-  cell.textLabel.text = self.text;
-  cell.detailTextLabel.text = self.detailText;
-  cell.isAccessibilityElement = YES;
-  if ([self.accessibilityLabel length] != 0) {
-    cell.accessibilityLabel = self.accessibilityLabel;
-  } else {
-    if (self.detailText.length == 0) {
-      cell.accessibilityLabel = self.text;
-    } else {
-      cell.accessibilityLabel =
-          [NSString stringWithFormat:@"%@, %@", self.text, self.detailText];
-    }
-  }
-
-  // Styling.
-  cell.textLabel.font = self.textFont;
-  cell.textLabel.textColor = self.textColor;
-  cell.textLabel.numberOfLines = self.numberOfTextLines;
-  cell.detailTextLabel.font = self.detailTextFont;
-  cell.detailTextLabel.textColor = self.detailTextColor;
-  cell.detailTextLabel.numberOfLines = self.numberOfDetailTextLines;
-}
-
-@end
-
-@implementation SettingsTextCell
-
-@synthesize textLabel = _textLabel;
-@synthesize detailTextLabel = _detailTextLabel;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  self = [super initWithFrame:frame];
-  if (self) {
-    UIView* containerView = [[UIView alloc] initWithFrame:CGRectZero];
-    containerView.translatesAutoresizingMaskIntoConstraints = NO;
-    [self.contentView addSubview:containerView];
-
-    _textLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    [containerView addSubview:_textLabel];
-
-    _detailTextLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    [containerView addSubview:_detailTextLabel];
-
-    CGFloat margin = kMargin;
-
-    [NSLayoutConstraint activateConstraints:@[
-      // Total height.
-      // The MDC specs ask for at least 48 pt.
-      [self.contentView.heightAnchor
-          constraintGreaterThanOrEqualToConstant:kMinimalHeight],
-
-      // Container.
-      [containerView.leadingAnchor
-          constraintEqualToAnchor:self.contentView.leadingAnchor
-                         constant:margin],
-      [containerView.trailingAnchor
-          constraintEqualToAnchor:self.contentView.trailingAnchor
-                         constant:-margin],
-      [containerView.centerYAnchor
-          constraintEqualToAnchor:self.contentView.centerYAnchor],
-
-      // Labels.
-      [_textLabel.leadingAnchor
-          constraintEqualToAnchor:containerView.leadingAnchor],
-      [_textLabel.trailingAnchor
-          constraintLessThanOrEqualToAnchor:containerView.trailingAnchor],
-      [_textLabel.topAnchor constraintEqualToAnchor:containerView.topAnchor],
-      [_textLabel.bottomAnchor
-          constraintEqualToAnchor:_detailTextLabel.topAnchor],
-      [_detailTextLabel.leadingAnchor
-          constraintEqualToAnchor:_textLabel.leadingAnchor],
-      [_detailTextLabel.trailingAnchor
-          constraintLessThanOrEqualToAnchor:containerView.trailingAnchor],
-      [_detailTextLabel.bottomAnchor
-          constraintLessThanOrEqualToAnchor:containerView.bottomAnchor],
-    ]];
-
-    AddOptionalVerticalPadding(self.contentView, containerView, margin);
-  }
-  return self;
-}
-
-+ (CGFloat)heightForTitleLabel:(UILabel*)titleLabel
-               detailTextLabel:(UILabel*)detailTextLabel
-                         width:(CGFloat)width {
-  CGSize sizeForLabel = CGSizeMake(width - 2 * kMargin, 500);
-
-  CGFloat cellHeight = 2 * kMargin;
-  cellHeight += [titleLabel sizeThatFits:sizeForLabel].height;
-  cellHeight += [detailTextLabel sizeThatFits:sizeForLabel].height;
-
-  return MAX(cellHeight, kMinimalHeight);
-}
-
-// Implement -layoutSubviews as per instructions in documentation for
-// +[MDCCollectionViewCell cr_preferredHeightForWidth:forItem:].
-- (void)layoutSubviews {
-  [super layoutSubviews];
-  // Adjust the text and detailText label preferredMaxLayoutWidth when the
-  // parent's width changes, for instance on screen rotation.
-  CGFloat preferedMaxLayoutWidth =
-      CGRectGetWidth(self.contentView.frame) - 2 * kMargin;
-  _textLabel.preferredMaxLayoutWidth = preferedMaxLayoutWidth;
-  _detailTextLabel.preferredMaxLayoutWidth = preferedMaxLayoutWidth;
-
-  // Re-layout with the new preferred width to allow the label to adjust its
-  // height.
-  [super layoutSubviews];
-}
-
-- (void)prepareForReuse {
-  [super prepareForReuse];
-  self.textLabel.text = nil;
-  self.detailTextLabel.text = nil;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
index bbda0175..f8153560 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -49,7 +49,6 @@
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/settings:settings_root",
     "//ios/chrome/browser/ui/settings/cells",
-    "//ios/chrome/browser/ui/settings/cells/legacy",
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
index 119e795e..95dd7673 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
@@ -23,8 +23,6 @@
 enum ClearBrowsingDataSectionIdentifier {
   // Section holding types of data that can be cleared.
   SectionIdentifierDataTypes = kSectionIdentifierEnumZero,
-  // Section containing button to clear browsing data.
-  SectionIdentifierClearBrowsingDataButton,
   // Section for informational footnote about user's Google Account data.
   SectionIdentifierGoogleAccount,
   // Section for footnote about synced data being cleared.
@@ -47,8 +45,6 @@
   ItemTypeDataTypeSavedPasswords,
   // Items representing autofill data.
   ItemTypeDataTypeAutofill,
-  // Clear data button.
-  ItemTypeClearBrowsingDataButton,
   // Footer noting account will not be signed out.
   ItemTypeFooterGoogleAccount,
   // Footer noting user will not be signed out of chrome and other forms of
@@ -64,13 +60,6 @@
   ItemTypeTimeRange,
 };
 
-// Differentiation between two types of view controllers that the
-// ClearBrowsingDataManager could be serving.
-enum class ClearBrowsingDataListType {
-  kListTypeTableView,
-  kListTypeCollectionView,
-};
-
 // Manager that serves as the bulk of the logic for
 // ClearBrowsingDataConsumer.
 @interface ClearBrowsingDataManager : NSObject
@@ -80,14 +69,11 @@
 // Reference to the LinkDelegate for CollectionViewFooterItem.
 @property(nonatomic, weak) id<CollectionViewFooterLinkDelegate> linkDelegate;
 
-// Default init method. |browserState| can't be nil and
-// |listType| determines what kind of items to populate model with.
-- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                            listType:(ClearBrowsingDataListType)listType;
+// Default init method. |browserState| can't be nil.
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState;
 
 // Designated initializer to allow dependency injection (in tests).
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                              listType:(ClearBrowsingDataListType)listType
                    browsingDataRemover:(BrowsingDataRemover*)remover
     browsingDataCounterWrapperProducer:
         (BrowsingDataCounterWrapperProducer*)producer NS_DESIGNATED_INITIALIZER;
@@ -103,15 +89,6 @@
 
 // Returns a ActionSheetCoordinator that has action block to clear data of type
 // |dataTypeMaskToRemove|.
-// When action triggered by a UIButton.
-- (ActionSheetCoordinator*)
-    actionSheetCoordinatorWithDataTypesToRemove:
-        (BrowsingDataRemoveMask)dataTypeMaskToRemove
-                             baseViewController:
-                                 (UIViewController*)baseViewController
-                                     sourceRect:(CGRect)sourceRect
-                                     sourceView:(UIView*)sourceView;
-// When action triggered by a UIBarButtonItem.
 - (ActionSheetCoordinator*)
     actionSheetCoordinatorWithDataTypesToRemove:
         (BrowsingDataRemoveMask)dataTypeMaskToRemove
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
index 2f77f372..f687c15 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -41,7 +41,6 @@
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
 #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h"
-#import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h"
 #import "ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/browsing_data_counter_wrapper_producer.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h"
@@ -106,16 +105,14 @@
   PrefChangeRegistrar _prefChangeRegistrar;
 
   // Observer for browsing data removal events and associated ScopedObserver
-  // used to track registration with BrowsingDataRemover. They both may be
-  // null if the new Clear Browser Data UI is disabled.
+  // used to track registration with BrowsingDataRemover.
   std::unique_ptr<BrowsingDataRemoverObserver> _observer;
   std::unique_ptr<
       ScopedObserver<BrowsingDataRemover, BrowsingDataRemoverObserver>>
       _scoped_observer;
 
   // Corresponds browsing data counters to their masks/flags. Items are inserted
-  // as clear data items are constructed. Remains empty if the new Clear Browser
-  // Data UI is disabled.
+  // as clear data items are constructed.
   std::map<BrowsingDataRemoveMask, std::unique_ptr<BrowsingDataCounterWrapper>>
       _countersByMasks;
 }
@@ -127,14 +124,6 @@
 // Whether to show popup other forms of browsing history.
 @property(nonatomic, assign)
     BOOL shouldPopupDialogAboutOtherFormsOfBrowsingHistory;
-// Whether the mediator is managing a TableViewController or a
-// CollectionsViewController.
-@property(nonatomic, assign) ClearBrowsingDataListType listType;
-
-// TODO(crbug.com/947456): Prune
-// ClearBrowsingDataCollectionViewController-related code when it is dropped.
-@property(nonatomic, strong)
-    LegacySettingsDetailItem* collectionViewTimeRangeItem;
 
 @property(nonatomic, strong) TableViewDetailIconItem* tableViewTimeRangeItem;
 
@@ -151,12 +140,9 @@
     _shouldShowNoticeAboutOtherFormsOfBrowsingHistory;
 @synthesize shouldPopupDialogAboutOtherFormsOfBrowsingHistory =
     _shouldPopupDialogAboutOtherFormsOfBrowsingHistory;
-@synthesize listType = _listType;
 
-- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                            listType:(ClearBrowsingDataListType)listType {
+- (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState {
   return [self initWithBrowserState:browserState
-                                listType:listType
                      browsingDataRemover:BrowsingDataRemoverFactory::
                                              GetForBrowserState(browserState)
       browsingDataCounterWrapperProducer:[[BrowsingDataCounterWrapperProducer
@@ -164,14 +150,12 @@
 }
 
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                              listType:(ClearBrowsingDataListType)listType
                    browsingDataRemover:(BrowsingDataRemover*)remover
     browsingDataCounterWrapperProducer:
         (BrowsingDataCounterWrapperProducer*)producer {
   self = [super init];
   if (self) {
     _browserState = browserState;
-    _listType = listType;
     _counterWrapperProducer = producer;
 
     _timeRangePref.Init(browsing_data::prefs::kDeleteTimePeriod,
@@ -194,14 +178,12 @@
 #pragma mark - Public Methods
 
 - (void)loadModel:(ListModel*)model {
-  [model addSectionWithIdentifier:SectionIdentifierTimeRange];
-  ListItem* timeRangeItem = [self timeRangeItem];
-  [model addItem:timeRangeItem
-      toSectionWithIdentifier:SectionIdentifierTimeRange];
-  self.tableViewTimeRangeItem =
-      base::mac::ObjCCastStrict<TableViewDetailIconItem>(timeRangeItem);
+  self.tableViewTimeRangeItem = [self timeRangeItem];
   self.tableViewTimeRangeItem.useCustomSeparator = YES;
 
+  [model addSectionWithIdentifier:SectionIdentifierTimeRange];
+  [model addItem:self.tableViewTimeRangeItem
+      toSectionWithIdentifier:SectionIdentifierTimeRange];
   [self addClearBrowsingDataItemsToModel:model];
   [self addSyncProfileItemsToModel:model];
 }
@@ -219,7 +201,7 @@
       toSectionWithIdentifier:SectionIdentifierDataTypes];
 
   // This data type doesn't currently have an associated counter, but displays
-  // an explanatory text instead, when the new UI is enabled.
+  // an explanatory text instead.
   ListItem* cookiesSiteDataItem =
       [self clearDataItemWithType:ItemTypeDataTypeCookiesSiteData
                           titleID:IDS_IOS_CLEAR_COOKIES
@@ -299,27 +281,32 @@
         (BrowsingDataRemoveMask)dataTypeMaskToRemove
                              baseViewController:
                                  (UIViewController*)baseViewController
-                                     sourceRect:(CGRect)sourceRect
-                                     sourceView:(UIView*)sourceView {
-  return [self actionSheetCoordinatorWithDataTypesToRemove:dataTypeMaskToRemove
-                                        baseViewController:baseViewController
-                                                sourceRect:sourceRect
-                                                sourceView:sourceView
-                                       sourceBarButtonItem:nil];
-}
-
-- (ActionSheetCoordinator*)
-    actionSheetCoordinatorWithDataTypesToRemove:
-        (BrowsingDataRemoveMask)dataTypeMaskToRemove
-                             baseViewController:
-                                 (UIViewController*)baseViewController
                             sourceBarButtonItem:
                                 (UIBarButtonItem*)sourceBarButtonItem {
-  return [self actionSheetCoordinatorWithDataTypesToRemove:dataTypeMaskToRemove
-                                        baseViewController:baseViewController
-                                                sourceRect:CGRectNull
-                                                sourceView:nil
-                                       sourceBarButtonItem:sourceBarButtonItem];
+  if (dataTypeMaskToRemove == BrowsingDataRemoveMask::REMOVE_NOTHING) {
+    // Nothing to clear (no data types selected).
+    return nil;
+  }
+  __weak ClearBrowsingDataManager* weakSelf = self;
+
+  ActionSheetCoordinator* actionCoordinator = [[ActionSheetCoordinator alloc]
+      initWithBaseViewController:baseViewController
+                           title:l10n_util::GetNSString(
+                                     IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE)
+                         message:nil
+                   barButtonItem:sourceBarButtonItem];
+  actionCoordinator.popoverArrowDirection =
+      UIPopoverArrowDirectionDown | UIPopoverArrowDirectionUp;
+  [actionCoordinator
+      addItemWithTitle:l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON)
+                action:^{
+                  [weakSelf clearDataForDataTypes:dataTypeMaskToRemove];
+                }
+                 style:UIAlertActionStyleDestructive];
+  [actionCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
+                               action:nil
+                                style:UIAlertActionStyleCancel];
+  return actionCoordinator;
 }
 
 // Add footers about user's account data.
@@ -497,7 +484,7 @@
   return footerItem;
 }
 
-- (ListItem*)timeRangeItem {
+- (TableViewDetailIconItem*)timeRangeItem {
   TableViewDetailIconItem* timeRangeItem =
       [[TableViewDetailIconItem alloc] initWithType:ItemTypeTimeRange];
   timeRangeItem.text = l10n_util::GetNSString(
@@ -505,7 +492,6 @@
   NSString* detailText = [TimeRangeSelectorTableViewController
       timePeriodLabelForPrefs:self.browserState->GetPrefs()];
   DCHECK(detailText);
-
   timeRangeItem.detailText = detailText;
   timeRangeItem.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
   timeRangeItem.accessibilityTraits |= UIAccessibilityTraitButton;
@@ -576,57 +562,6 @@
   }
 }
 
-// Internal helper method which constructs an ActionSheetCoordinator for the two
-// |actionSheetCoordinatorWithDataTypesToRemove:...| in the interface.
-- (ActionSheetCoordinator*)
-    actionSheetCoordinatorWithDataTypesToRemove:
-        (BrowsingDataRemoveMask)dataTypeMaskToRemove
-                             baseViewController:
-                                 (UIViewController*)baseViewController
-                                     sourceRect:(CGRect)sourceRect
-                                     sourceView:(UIView*)sourceView
-                            sourceBarButtonItem:
-                                (UIBarButtonItem*)sourceBarButtonItem {
-  if (dataTypeMaskToRemove == BrowsingDataRemoveMask::REMOVE_NOTHING) {
-    // Nothing to clear (no data types selected).
-    return nil;
-  }
-  __weak ClearBrowsingDataManager* weakSelf = self;
-
-  ActionSheetCoordinator* actionCoordinator;
-  if (sourceBarButtonItem) {
-    DCHECK(!sourceView);
-    actionCoordinator = [[ActionSheetCoordinator alloc]
-        initWithBaseViewController:baseViewController
-                             title:l10n_util::GetNSString(
-                                       IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE)
-                           message:nil
-                     barButtonItem:sourceBarButtonItem];
-  } else {
-    DCHECK(!sourceBarButtonItem);
-    actionCoordinator = [[ActionSheetCoordinator alloc]
-        initWithBaseViewController:baseViewController
-                             title:l10n_util::GetNSString(
-                                       IDS_IOS_CONFIRM_CLEAR_BUTTON_TITLE)
-                           message:nil
-                              rect:sourceRect
-                              view:sourceView];
-  }
-
-  actionCoordinator.popoverArrowDirection =
-      UIPopoverArrowDirectionDown | UIPopoverArrowDirectionUp;
-  [actionCoordinator
-      addItemWithTitle:l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON)
-                action:^{
-                  [weakSelf clearDataForDataTypes:dataTypeMaskToRemove];
-                }
-                 style:UIAlertActionStyleDestructive];
-  [actionCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
-                               action:nil
-                                style:UIAlertActionStyleCancel];
-  return actionCoordinator;
-}
-
 #pragma mark Properties
 
 - (void)setShouldShowNoticeAboutOtherFormsOfBrowsingHistory:(BOOL)showNotice
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
index 2ddf6c3c..2d0a1d1 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
@@ -84,8 +84,6 @@
     remover_ = std::make_unique<FakeBrowsingDataRemover>();
     manager_ = [[ClearBrowsingDataManager alloc]
                       initWithBrowserState:browser_state_.get()
-                                  listType:ClearBrowsingDataListType::
-                                               kListTypeTableView
                        browsingDataRemover:remover_.get()
         browsingDataCounterWrapperProducer:
             [[FakeBrowsingDataCounterWrapperProducer alloc] init]];
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 92d991e..839f9640 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -58,9 +58,6 @@
 @property(nonatomic, strong)
     ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator;
 
-// Reference to clear browsing data button for positioning popover confirmation
-// dialog.
-@property(nonatomic, strong) UIButton* clearBrowsingDataButton;
 @property(nonatomic, readonly, strong)
     UIBarButtonItem* clearBrowsingDataBarButton;
 
@@ -78,7 +75,6 @@
 @synthesize actionSheetCoordinator = _actionSheetCoordinator;
 @synthesize alertCoordinator = _alertCoordinator;
 @synthesize browserState = _browserState;
-@synthesize clearBrowsingDataButton = _clearBrowsingDataButton;
 @synthesize clearBrowsingDataBarButton = _clearBrowsingDataBarButton;
 @synthesize dataManager = _dataManager;
 @synthesize dispatcher = _dispatcher;
@@ -92,9 +88,8 @@
                            appBarStyle:ChromeTableViewControllerStyleNoAppBar];
   if (self) {
     _browserState = browserState;
-    _dataManager = [[ClearBrowsingDataManager alloc]
-        initWithBrowserState:browserState
-                    listType:ClearBrowsingDataListType::kListTypeTableView];
+    _dataManager =
+        [[ClearBrowsingDataManager alloc] initWithBrowserState:browserState];
     _dataManager.consumer = self;
   }
   return self;
@@ -226,18 +221,6 @@
           UIEdgeInsetsMake(0, tableViewTextLinkCell.bounds.size.width, 0, 0);
       break;
     }
-    case ItemTypeClearBrowsingDataButton: {
-      TableViewTextButtonCell* tableViewTextButtonCell =
-          base::mac::ObjCCastStrict<TableViewTextButtonCell>(cellToReturn);
-      tableViewTextButtonCell.selectionStyle =
-          UITableViewCellSelectionStyleNone;
-      [tableViewTextButtonCell.button
-                 addTarget:self
-                    action:@selector(showClearBrowsingDataAlertController:)
-          forControlEvents:UIControlEventTouchUpInside];
-      self.clearBrowsingDataButton = tableViewTextButtonCell.button;
-      break;
-    }
     case ItemTypeDataTypeBrowsingHistory:
     case ItemTypeDataTypeCookiesSiteData:
     case ItemTypeDataTypeCache:
@@ -301,30 +284,6 @@
   [self updateToolbarButtons];
 }
 
-- (void)tableView:(UITableView*)tableView
-    legacyDidSelectRowAtIndexPath:(NSIndexPath*)indexPath {
-  [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
-  TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
-  DCHECK(item);
-  switch (item.type) {
-    case ItemTypeDataTypeBrowsingHistory:
-    case ItemTypeDataTypeCookiesSiteData:
-    case ItemTypeDataTypeCache:
-    case ItemTypeDataTypeSavedPasswords:
-    case ItemTypeDataTypeAutofill: {
-      TableViewClearBrowsingDataItem* clearBrowsingDataItem =
-          base::mac::ObjCCastStrict<TableViewClearBrowsingDataItem>(item);
-      clearBrowsingDataItem.checked = !clearBrowsingDataItem.checked;
-      self.browserState->GetPrefs()->SetBoolean(clearBrowsingDataItem.prefName,
-                                                clearBrowsingDataItem.checked);
-      [self reconfigureCellsForItems:@[ clearBrowsingDataItem ]];
-      break;
-    }
-    default:
-      break;
-  }
-}
-
 #pragma mark - TableViewTextLinkCellDelegate
 
 - (void)tableViewTextLinkCell:(TableViewTextLinkCell*)cell
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
index c63feb30..4af69aaa 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -27,7 +27,6 @@
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
-#import "ios/chrome/browser/ui/settings/cells/settings_text_item.h"
 #import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h"
 #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h"
 #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h
deleted file mode 100644
index c6997dd..0000000
--- a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h"
-
-@interface MaterialCellCatalogViewController
-    : SettingsRootCollectionViewController
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithLayout:(UICollectionViewLayout*)layout
-                         style:(CollectionViewControllerStyle)style
-    NS_UNAVAILABLE;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_MATERIAL_CELL_CATALOG_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm
deleted file mode 100644
index 7c0e7a8..0000000
--- a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm
+++ /dev/null
@@ -1,577 +0,0 @@
-// 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.
-
-#import "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h"
-
-#import <UIKit/UIKit.h>
-
-#import "base/mac/foundation_util.h"
-#include "components/autofill/core/browser/autofill_data_util.h"
-#include "components/autofill/core/browser/data_model/credit_card.h"
-#include "components/grit/components_scaled_resources.h"
-#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h"
-#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h"
-#import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
-#import "ios/chrome/browser/ui/autofill/cells/cvc_item.h"
-#import "ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.h"
-#import "ios/chrome/browser/ui/autofill/cells/status_item.h"
-#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h"
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h"
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
-#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.h"
-#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h"
-#import "ios/chrome/browser/ui/icons/chrome_icon.h"
-#import "ios/chrome/browser/ui/payments/cells/accepted_payment_methods_item.h"
-#import "ios/chrome/browser/ui/payments/cells/autofill_profile_item.h"
-#import "ios/chrome/browser/ui/payments/cells/payments_text_item.h"
-#import "ios/chrome/browser/ui/payments/cells/price_item.h"
-#import "ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.h"
-#import "ios/chrome/browser/ui/settings/cells/legacy/legacy_settings_detail_item.h"
-#import "ios/chrome/browser/ui/settings/cells/passphrase_error_item.h"
-#import "ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.h"
-#import "ios/chrome/browser/ui/settings/cells/settings_text_item.h"
-#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
-#import "ios/public/provider/chrome/browser/signin/signin_resources_provider.h"
-#import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
-#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-typedef NS_ENUM(NSInteger, SectionIdentifier) {
-  SectionIdentifierTextCell = kSectionIdentifierEnumZero,
-  SectionIdentifierDetailCell,
-  SectionIdentifierSwitchCell,
-  SectionIdentifierNativeAppCell,
-  SectionIdentifierAutofill,
-  SectionIdentifierPayments,
-  SectionIdentifierPaymentsNoBackground,
-  SectionIdentifierCopiedToChrome,
-  SectionIdentifierPasswordDetails,
-  SectionIdentifierSettingsSearchCell,
-  SectionIdentifierAccountCell,
-  SectionIdentifierAccountControlCell,
-  SectionIdentifierFooters,
-  SectionIdentifierContentSuggestionsCell,
-};
-
-typedef NS_ENUM(NSInteger, ItemType) {
-  ItemTypeTextCheckmark = kItemTypeEnumZero,
-  ItemTypeTextDetail,
-  ItemTypeText,
-  ItemTypeDetailBasic,
-  ItemTypeDetailLeftMedium,
-  ItemTypeDetailRightMedium,
-  ItemTypeDetailLeftLong,
-  ItemTypeDetailRightLong,
-  ItemTypeDetailBothLong,
-  ItemTypeMultilineBasic,
-  ItemTypeImportDataMultiline,
-  ItemTypeSwitchDynamicHeight,
-  ItemTypeHeader,
-  ItemTypeAccountDetail,
-  ItemTypeAccountCheckMark,
-  ItemTypeAccountSignIn,
-  ItemTypeApp,
-  ItemTypePaymentsSingleLine,
-  ItemTypePaymentsDynamicHeight,
-  ItemTypeCopiedToChrome,
-  ItemTypeSettingsSearch,
-  ItemTypeAutofillDynamicHeight,
-  ItemTypeAutofillCVC,
-  ItemTypeAutofillStatus,
-  ItemTypeFooter,
-  ItemTypeSyncPassphraseError,
-  ItemTypeContentSuggestions,
-};
-
-// Credit Card icon size.
-const CGFloat kCardIssuerNetworkIconDimension = 25.0;
-
-}  // namespace
-
-@implementation MaterialCellCatalogViewController
-
-- (instancetype)init {
-  UICollectionViewLayout* layout = [[MDCCollectionViewFlowLayout alloc] init];
-  self = [super initWithLayout:layout
-                         style:CollectionViewControllerStyleDefault];
-  if (self) {
-    // TODO(crbug.com/764578): -loadModel should not be called from
-    // initializer. A possible fix is to move this call to -viewDidLoad.
-    [self loadModel];
-  }
-  return self;
-}
-
-- (void)loadModel {
-  [super loadModel];
-  CollectionViewModel* model = self.collectionViewModel;
-
-  // Text cells.
-  [model addSectionWithIdentifier:SectionIdentifierTextCell];
-
-  SettingsTextItem* textHeader =
-      [[SettingsTextItem alloc] initWithType:ItemTypeHeader];
-  textHeader.text = @"SettingsTextCell";
-  textHeader.textFont = [textHeader.textFont fontWithSize:12];
-  textHeader.textColor = [[MDCPalette greyPalette] tint500];
-  [model setHeader:textHeader
-      forSectionWithIdentifier:SectionIdentifierTextCell];
-
-  SettingsTextItem* textCell =
-      [[SettingsTextItem alloc] initWithType:ItemTypeTextCheckmark];
-  textCell.text = @"Text cell 1";
-  textCell.accessoryType = MDCCollectionViewCellAccessoryCheckmark;
-  [model addItem:textCell toSectionWithIdentifier:SectionIdentifierTextCell];
-  SettingsTextItem* textCell2 =
-      [[SettingsTextItem alloc] initWithType:ItemTypeTextDetail];
-  textCell2.text =
-      @"Text cell with text that is so long it must truncate at some point "
-      @"except that maybe it sometimes doesn't in landscape mode.";
-  textCell2.accessoryType = MDCCollectionViewCellAccessoryDetailButton;
-  [model addItem:textCell2 toSectionWithIdentifier:SectionIdentifierTextCell];
-  SettingsTextItem* smallTextCell =
-      [[SettingsTextItem alloc] initWithType:ItemTypeText];
-  smallTextCell.text = @"Text cell with small font but height of 48.";
-  smallTextCell.textFont = [smallTextCell.textFont fontWithSize:8];
-  [model addItem:smallTextCell
-      toSectionWithIdentifier:SectionIdentifierTextCell];
-
-  // Detail cells.
-  [model addSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailBasic =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailBasic];
-  detailBasic.text = @"Preload Webpages";
-  detailBasic.detailText = @"Only on Wi-Fi";
-  detailBasic.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator;
-  [model addItem:detailBasic
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailMediumLeft =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailLeftMedium];
-  detailMediumLeft.text = @"A long string but it should fit";
-  detailMediumLeft.detailText = @"Detail";
-  [model addItem:detailMediumLeft
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailMediumRight =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailRightMedium];
-  detailMediumRight.text = @"Main";
-  detailMediumRight.detailText = @"A long string but it should fit";
-  [model addItem:detailMediumRight
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailLongLeft =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailLeftLong];
-  detailLongLeft.text =
-      @"This is a very long main text that is intended to overflow "
-      @"except maybe on landscape but now it's longer so it won't fit.";
-  detailLongLeft.detailText = @"Detail Text";
-  detailLongLeft.iconImageName = @"ntp_history_icon";
-  [model addItem:detailLongLeft
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailLongRight =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailRightLong];
-  detailLongRight.text = @"Main Text";
-  detailLongRight.detailText =
-      @"This is a very long detail text that is intended to overflow "
-      @"except maybe on landscape but now it's longer so it won't fit.";
-  detailLongRight.iconImageName = @"ntp_history_icon";
-  [model addItem:detailLongRight
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-  LegacySettingsDetailItem* detailLongBoth =
-      [[LegacySettingsDetailItem alloc] initWithType:ItemTypeDetailBothLong];
-  detailLongBoth.text =
-      @"This is a very long main text that is intended to overflow "
-      @"except maybe on landscape but now it's longer so it won't fit.";
-  detailLongBoth.detailText =
-      @"This is a very long detail text that is intended to overflow "
-      @"except maybe on landscape but now it's longer so it won't fit.";
-  detailLongBoth.iconImageName = @"ntp_history_icon";
-  [model addItem:detailLongBoth
-      toSectionWithIdentifier:SectionIdentifierDetailCell];
-
-  // Autofill cells.
-  [model addSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self autofillEditItem]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self autofillEditItemWithIcon]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self cvcItem]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self cvcItemWithDate]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self cvcItemWithError]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self statusItemVerifying]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self statusItemVerified]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-  [model addItem:[self statusItemError]
-      toSectionWithIdentifier:SectionIdentifierAutofill];
-
-  // Payments cells.
-  [model addSectionWithIdentifier:SectionIdentifierPayments];
-  [model addItem:[self paymentsItemWithWrappingTextandOptionalImage]
-      toSectionWithIdentifier:SectionIdentifierPayments];
-
-  PriceItem* priceItem1 =
-      [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine];
-  priceItem1.item = @"Total";
-  priceItem1.notification = @"Updated";
-  priceItem1.price = @"USD $100.00";
-  [model addItem:priceItem1 toSectionWithIdentifier:SectionIdentifierPayments];
-  PriceItem* priceItem2 =
-      [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine];
-  priceItem2.item = @"Price label is long and should get clipped";
-  priceItem2.notification = @"Updated";
-  priceItem2.price = @"USD $1,000,000.00";
-  [model addItem:priceItem2 toSectionWithIdentifier:SectionIdentifierPayments];
-  PriceItem* priceItem3 =
-      [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine];
-  priceItem3.item = @"Price label is long and should get clipped";
-  priceItem3.notification = @"Should get clipped too";
-  priceItem3.price = @"USD $1,000,000.00";
-  [model addItem:priceItem3 toSectionWithIdentifier:SectionIdentifierPayments];
-  PriceItem* priceItem4 =
-      [[PriceItem alloc] initWithType:ItemTypePaymentsSingleLine];
-  priceItem4.item = @"Price label is long and should get clipped";
-  priceItem4.notification = @"Should get clipped too";
-  priceItem4.price = @"USD $1,000,000,000.00";
-  [model addItem:priceItem4 toSectionWithIdentifier:SectionIdentifierPayments];
-
-  AutofillProfileItem* profileItem1 =
-      [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight];
-  profileItem1.name = @"Profile Name gets wrapped if it's too long";
-  profileItem1.address = @"Profile Address also gets wrapped if it's too long";
-  profileItem1.phoneNumber = @"123-456-7890";
-  profileItem1.email = @"foo@bar.com";
-  profileItem1.notification = @"Some fields are missing";
-  [model addItem:profileItem1
-      toSectionWithIdentifier:SectionIdentifierPayments];
-  AutofillProfileItem* profileItem2 =
-      [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight];
-  profileItem1.name = @"All fields are optional";
-  profileItem2.phoneNumber = @"123-456-7890";
-  profileItem2.notification = @"Some fields are missing";
-  [model addItem:profileItem2
-      toSectionWithIdentifier:SectionIdentifierPayments];
-  AutofillProfileItem* profileItem3 =
-      [[AutofillProfileItem alloc] initWithType:ItemTypePaymentsDynamicHeight];
-  profileItem3.address = @"All fields are optional";
-  profileItem3.email = @"foo@bar.com";
-  [model addItem:profileItem3
-      toSectionWithIdentifier:SectionIdentifierPayments];
-
-  // Payments cells with no background.
-  [model addSectionWithIdentifier:SectionIdentifierPaymentsNoBackground];
-  [model addItem:[self acceptedPaymentMethodsItem]
-      toSectionWithIdentifier:SectionIdentifierPaymentsNoBackground];
-
-  // CopiedToChrome cells.
-  [model addSectionWithIdentifier:SectionIdentifierCopiedToChrome];
-  CopiedToChromeItem* copiedToChromeItem =
-      [[CopiedToChromeItem alloc] initWithType:ItemTypeCopiedToChrome];
-  [model addItem:copiedToChromeItem
-      toSectionWithIdentifier:SectionIdentifierCopiedToChrome];
-
-  // Account cells.
-  [model addSectionWithIdentifier:SectionIdentifierAccountCell];
-  [model addItem:[self accountItemDetailWithError]
-      toSectionWithIdentifier:SectionIdentifierAccountCell];
-  [model addItem:[self accountItemCheckMark]
-      toSectionWithIdentifier:SectionIdentifierAccountCell];
-
-  // Content Suggestions cells.
-  [model addSectionWithIdentifier:SectionIdentifierContentSuggestionsCell];
-  [model addItem:[self contentSuggestionsItem]
-      toSectionWithIdentifier:SectionIdentifierContentSuggestionsCell];
-  [model addItem:[self contentSuggestionsFooterItem]
-      toSectionWithIdentifier:SectionIdentifierContentSuggestionsCell];
-
-  // Footers.
-  [model addSectionWithIdentifier:SectionIdentifierFooters];
-  [model addItem:[self shortFooterItem]
-      toSectionWithIdentifier:SectionIdentifierFooters];
-  [model addItem:[self longFooterItem]
-      toSectionWithIdentifier:SectionIdentifierFooters];
-}
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  self.title = @"Collection Cell Catalog";
-}
-
-#pragma mark MDCCollectionViewStylingDelegate
-
-- (CGFloat)collectionView:(nonnull UICollectionView*)collectionView
-    cellHeightAtIndexPath:(nonnull NSIndexPath*)indexPath {
-  CollectionViewItem* item =
-      [self.collectionViewModel itemAtIndexPath:indexPath];
-  switch (item.type) {
-    case ItemTypeContentSuggestions:
-    case ItemTypeFooter:
-    case ItemTypeSwitchDynamicHeight:
-    case ItemTypeTextCheckmark:
-    case ItemTypeTextDetail:
-    case ItemTypeText:
-    case ItemTypeMultilineBasic:
-    case ItemTypeImportDataMultiline:
-    case ItemTypeAutofillCVC:
-    case ItemTypeAutofillStatus:
-    case ItemTypePaymentsDynamicHeight:
-    case ItemTypeAutofillDynamicHeight:
-      return [MDCCollectionViewCell
-          cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds)
-                             forItem:item];
-    case ItemTypeApp:
-      return MDCCellDefaultOneLineWithAvatarHeight;
-    case ItemTypeAccountDetail:
-      return MDCCellDefaultTwoLineHeight;
-    case ItemTypeAccountCheckMark:
-      return MDCCellDefaultTwoLineHeight;
-    case ItemTypeAccountSignIn:
-      return MDCCellDefaultThreeLineHeight;
-    default:
-      return MDCCellDefaultOneLineHeight;
-  }
-}
-
-- (MDCCollectionViewCellStyle)collectionView:(UICollectionView*)collectionView
-                         cellStyleForSection:(NSInteger)section {
-  NSInteger sectionIdentifier =
-      [self.collectionViewModel sectionIdentifierForSection:section];
-  switch (sectionIdentifier) {
-    case SectionIdentifierFooters:
-      // Display the Learn More footer in the default style with no "card" UI
-      // and no section padding.
-      return MDCCollectionViewCellStyleDefault;
-    default:
-      return self.styler.cellStyle;
-  }
-}
-
-- (BOOL)collectionView:(UICollectionView*)collectionView
-    shouldHideItemBackgroundAtIndexPath:(NSIndexPath*)indexPath {
-  NSInteger sectionIdentifier =
-      [self.collectionViewModel sectionIdentifierForSection:indexPath.section];
-  switch (sectionIdentifier) {
-    case SectionIdentifierPaymentsNoBackground:
-    case SectionIdentifierFooters:
-      // Display the Learn More footer without any background image or
-      // shadowing.
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-- (BOOL)collectionView:(nonnull UICollectionView*)collectionView
-    hidesInkViewAtIndexPath:(nonnull NSIndexPath*)indexPath {
-  NSInteger sectionIdentifier =
-      [self.collectionViewModel sectionIdentifierForSection:indexPath.section];
-  if (sectionIdentifier == SectionIdentifierFooters)
-    return YES;
-  CollectionViewItem* item =
-      [self.collectionViewModel itemAtIndexPath:indexPath];
-  switch (item.type) {
-    case ItemTypeApp:
-    case ItemTypeSwitchDynamicHeight:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark Item models
-
-- (CollectionViewItem*)accountItemDetailWithError {
-  CollectionViewAccountItem* accountItemDetail =
-      [[CollectionViewAccountItem alloc] initWithType:ItemTypeAccountDetail];
-  accountItemDetail.cellStyle = CollectionViewCellStyle::kUIKit;
-  // TODO(crbug.com/754032): ios_default_avatar image is from a downstream iOS
-  // internal repository. It should be used through a provider API instead.
-  accountItemDetail.image = [UIImage imageNamed:@"ios_default_avatar"];
-  accountItemDetail.text = @"Account User Name";
-  accountItemDetail.detailText =
-      @"Syncing to AccountUserNameAccount@example.com";
-  accountItemDetail.accessoryType =
-      MDCCollectionViewCellAccessoryDisclosureIndicator;
-  accountItemDetail.shouldDisplayError = YES;
-  return accountItemDetail;
-}
-
-- (CollectionViewItem*)accountItemCheckMark {
-  CollectionViewAccountItem* accountItemCheckMark =
-      [[CollectionViewAccountItem alloc] initWithType:ItemTypeAccountCheckMark];
-  accountItemCheckMark.cellStyle = CollectionViewCellStyle::kUIKit;
-  // TODO(crbug.com/754032): ios_default_avatar image is from a downstream iOS
-  // internal repository. It should be used through a provider API instead.
-  accountItemCheckMark.image = [UIImage imageNamed:@"ios_default_avatar"];
-  accountItemCheckMark.text = @"Lorem ipsum dolor sit amet, consectetur "
-                              @"adipiscing elit, sed do eiusmod tempor "
-                              @"incididunt ut labore et dolore magna aliqua.";
-  accountItemCheckMark.detailText =
-      @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
-      @"eiusmod tempor incididunt ut labore et dolore magna aliqua.";
-  accountItemCheckMark.accessoryType = MDCCollectionViewCellAccessoryCheckmark;
-  return accountItemCheckMark;
-}
-
-#pragma mark Private
-
-- (CollectionViewItem*)paymentsItemWithWrappingTextandOptionalImage {
-  PaymentsTextItem* item =
-      [[PaymentsTextItem alloc] initWithType:ItemTypePaymentsDynamicHeight];
-  item.text = @"If you want to display a long text that wraps to the next line "
-              @"and may need to feature an image this is the cell to use.";
-  item.leadingImage = [UIImage imageNamed:@"app_icon_placeholder"];
-  return item;
-}
-
-- (CollectionViewItem*)acceptedPaymentMethodsItem {
-  AcceptedPaymentMethodsItem* item = [[AcceptedPaymentMethodsItem alloc]
-      initWithType:ItemTypePaymentsDynamicHeight];
-  item.message = @"Cards accepted:";
-
-  NSMutableArray* cardTypeIcons = [NSMutableArray array];
-  const char* cardTypes[]{autofill::kVisaCard,
-                          autofill::kMasterCard,
-                          autofill::kAmericanExpressCard,
-                          autofill::kJCBCard,
-                          autofill::kDinersCard,
-                          autofill::kDiscoverCard};
-  for (const std::string& cardType : cardTypes) {
-    autofill::data_util::PaymentRequestData data =
-        autofill::data_util::GetPaymentRequestData(cardType);
-    UIImage* cardTypeIcon =
-        ResizeImage(NativeImage(data.icon_resource_id),
-                    CGSizeMake(kCardIssuerNetworkIconDimension,
-                               kCardIssuerNetworkIconDimension),
-                    ProjectionMode::kAspectFillNoClipping);
-    [cardTypeIcons addObject:cardTypeIcon];
-  }
-  item.methodTypeIcons = cardTypeIcons;
-  return item;
-}
-
-- (CollectionViewItem*)autofillEditItem {
-  LegacyAutofillEditItem* item = [[LegacyAutofillEditItem alloc]
-      initWithType:ItemTypeAutofillDynamicHeight];
-  item.cellStyle = CollectionViewCellStyle::kUIKit;
-  item.textFieldName = @"Required Card Number";
-  item.textFieldValue = @"4111111111111111";
-  item.textFieldEnabled = YES;
-  item.required = YES;
-  return item;
-}
-
-- (CollectionViewItem*)autofillEditItemWithIcon {
-  LegacyAutofillEditItem* item = [[LegacyAutofillEditItem alloc]
-      initWithType:ItemTypeAutofillDynamicHeight];
-  item.cellStyle = CollectionViewCellStyle::kUIKit;
-  item.textFieldName = @"Card Number";
-  item.textFieldValue = @"4111111111111111";
-  item.textFieldEnabled = YES;
-  int resourceID =
-      autofill::data_util::GetPaymentRequestData(autofill::kVisaCard)
-          .icon_resource_id;
-  item.identifyingIcon =
-      ResizeImage(NativeImage(resourceID), CGSizeMake(30.0, 30.0),
-                  ProjectionMode::kAspectFillNoClipping);
-  return item;
-}
-
-- (CollectionViewItem*)cvcItem {
-  CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC];
-  item.instructionsText =
-      @"This is a long text explaining to enter card details and what "
-      @"will happen afterwards.";
-  item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT;
-  return item;
-}
-
-- (CollectionViewItem*)cvcItemWithDate {
-  CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC];
-  item.instructionsText =
-      @"This is a long text explaining to enter card details and what "
-      @"will happen afterwards.";
-  item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT;
-  item.showDateInput = YES;
-  return item;
-}
-
-- (CollectionViewItem*)cvcItemWithError {
-  CVCItem* item = [[CVCItem alloc] initWithType:ItemTypeAutofillCVC];
-  item.instructionsText =
-      @"This is a long text explaining to enter card details and what "
-      @"will happen afterwards. Is this long enough to span 3 lines?";
-  item.errorMessage = @"Some error";
-  item.CVCImageResourceID = IDR_CREDIT_CARD_CVC_HINT_AMEX;
-  item.showNewCardButton = YES;
-  item.showCVCInputError = YES;
-  return item;
-}
-
-- (CollectionViewItem*)statusItemVerifying {
-  StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus];
-  item.text = @"Verifying…";
-  return item;
-}
-
-- (CollectionViewItem*)statusItemVerified {
-  StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus];
-  item.state = StatusItemState::VERIFIED;
-  item.text = @"Verified!";
-  return item;
-}
-
-- (CollectionViewItem*)statusItemError {
-  StatusItem* item = [[StatusItem alloc] initWithType:ItemTypeAutofillStatus];
-  item.state = StatusItemState::ERROR;
-  item.text = @"There was a really long error. We can't tell you more, but we "
-              @"will still display this long string.";
-  return item;
-}
-
-- (CollectionViewFooterItem*)shortFooterItem {
-  CollectionViewFooterItem* footerItem =
-      [[CollectionViewFooterItem alloc] initWithType:ItemTypeFooter];
-  footerItem.text = @"Hello";
-  return footerItem;
-}
-
-- (CollectionViewFooterItem*)longFooterItem {
-  CollectionViewFooterItem* footerItem =
-      [[CollectionViewFooterItem alloc] initWithType:ItemTypeFooter];
-  footerItem.text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello "
-                    @"Hello Hello Hello Hello Hello Hello Hello Hello Hello "
-                    @"Hello Hello Hello Hello Hello Hello Hello Hello Hello ";
-  footerItem.image = [UIImage imageNamed:@"app_icon_placeholder"];
-  return footerItem;
-}
-
-- (ContentSuggestionsItem*)contentSuggestionsItem {
-  ContentSuggestionsItem* articleItem = [[ContentSuggestionsItem alloc]
-      initWithType:ItemTypeContentSuggestions
-             title:@"This is an incredible article, you should read it!"
-               url:GURL()];
-  articleItem.publisher = @"Top Publisher.com";
-  return articleItem;
-}
-
-- (ContentSuggestionsFooterItem*)contentSuggestionsFooterItem {
-  ContentSuggestionsFooterItem* footerItem =
-      [[ContentSuggestionsFooterItem alloc]
-          initWithType:ItemTypeContentSuggestions
-                 title:@"Footer title"
-              callback:nil];
-  return footerItem;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index 087f565..ac5f8e7 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -20,7 +20,6 @@
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h"
-#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/utils/settings_utils.h"
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h
deleted file mode 100644
index 01e3488b..0000000
--- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h"
-#import "ios/chrome/browser/ui/settings/settings_root_view_controlling.h"
-
-// Root class for collection view controllers in settings.
-@interface SettingsRootCollectionViewController
-    : CollectionViewController<CollectionViewFooterLinkDelegate,
-                               SettingsRootViewControlling>
-
-// Creates an autoreleased Edit button for the collection view.  Calls
-// |editButtonEnabled| to determine if the button should be enabled.
-- (UIBarButtonItem*)createEditButton;
-
-// Creates an autoreleased Done button for the collection view's edit state.
-- (UIBarButtonItem*)createEditDoneButton;
-
-// Updates the edit or done button to reflect editing state.  If the
-// collectionView is not in edit mode (and thus showing the 'Done' button), it
-// calls the above two functions to determine the existence and state of an edit
-// button.
-- (void)updateEditButton;
-
-// Reloads the collection view model with |loadModel| and then reloads the
-// collection view data. This class calls this method in |viewWillAppear:|.
-- (void)reloadData;
-
-// Whether this collection view controller should hide the "Done" button (the
-// right navigation bar button). Default is NO.
-@property(nonatomic, assign) BOOL shouldHideDoneButton;
-
-// The collection view accessibility identifier to be set on |viewDidLoad|.
-@property(nonatomic, copy) NSString* collectionViewAccessibilityIdentifier;
-
-@end
-
-// Subclasses of SettingsRootCollectionViewController should implement the
-// following methods to customize the behavior.
-@interface SettingsRootCollectionViewController (Subclassing)
-
-// Returns NO.  Subclasses should overload this if an edit button is required.
-- (BOOL)shouldShowEditButton;
-
-// Returns NO.  Subclasses should overload this if the edit button should be
-// enabled.
-- (BOOL)editButtonEnabled;
-
-// Notifies the view controller that the edit button has been tapped. If you
-// override this method, you must call -[super editButtonPressed] at some point
-// in your implementation.
-//
-// Note that this method calls -[self setEditing:] in order to change the
-// editing mode of this controller.
-- (void)editButtonPressed;
-
-// Prevents user interaction until |-allowUserInteraction| is called by doing
-// the following:
-// * Disables user interaction with the navigation bar.
-// * Replaces the done button with an activity indicator.
-// * Covers the collection view with a transparent veil.
-- (void)preventUserInteraction;
-
-// Allows user interaction:
-// * Enables user interaction with the navigation bar.
-// * Restores the done button.
-// * Removes the transparent veil.
-- (void)allowUserInteraction;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_COLLECTION_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
deleted file mode 100644
index 86fec3f..0000000
--- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
+++ /dev/null
@@ -1,232 +0,0 @@
-// 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.
-
-#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h"
-
-#include "base/logging.h"
-#import "base/mac/foundation_util.h"
-
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
-#import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
-#import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h"
-#import "ios/chrome/browser/ui/settings/bar_button_activity_indicator.h"
-#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
-#include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#include "ios/chrome/grit/ios_strings.h"
-#import "ios/third_party/material_components_ios/src/components/Collections/src/MaterialCollections.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-enum SavedBarButtomItemPositionEnum {
-  kUndefinedBarButtonItemPosition,
-  kLeftBarButtonItemPosition,
-  kRightBarButtonItemPosition
-};
-
-// Dimension of the authentication operation activity indicator frame.
-const CGFloat kActivityIndicatorDimensionIPad = 64;
-const CGFloat kActivityIndicatorDimensionIPhone = 56;
-
-}  // namespace
-
-@implementation SettingsRootCollectionViewController {
-  SavedBarButtomItemPositionEnum _savedBarButtonItemPosition;
-  UIBarButtonItem* _savedBarButtonItem;
-  UIView* _veil;
-}
-
-@synthesize shouldHideDoneButton = _shouldHideDoneButton;
-@synthesize collectionViewAccessibilityIdentifier =
-    _collectionViewAccessibilityIdentifier;
-@synthesize dispatcher = _dispatcher;
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  self.collectionView.accessibilityIdentifier =
-      self.collectionViewAccessibilityIdentifier;
-
-  // Customize collection view settings.
-  self.collectionView.backgroundColor = UIColor.cr_systemGroupedBackgroundColor;
-  self.styler.cellStyle = MDCCollectionViewCellStyleGrouped;
-  self.styler.separatorColor = UIColorFromRGB(kUIKitSeparatorColor);
-  self.appBarViewController.headerView.backgroundColor =
-      UIColor.cr_systemGroupedBackgroundColor;
-  self.styler.separatorInset = UIEdgeInsetsMake(0, 16, 0, 16);
-
-  self.navigationItem.largeTitleDisplayMode =
-      UINavigationItemLargeTitleDisplayModeNever;
-}
-
-- (void)viewWillAppear:(BOOL)animated {
-  [super viewWillAppear:animated];
-  UIBarButtonItem* doneButton = [self doneButtonIfNeeded];
-  if (!self.navigationItem.rightBarButtonItem && doneButton) {
-    self.navigationItem.rightBarButtonItem = doneButton;
-  }
-}
-
-- (UIViewController*)childViewControllerForStatusBarHidden {
-  return nil;
-}
-
-- (UIViewController*)childViewControllerForStatusBarStyle {
-  return nil;
-}
-
-- (UIBarButtonItem*)doneButtonIfNeeded {
-  if (self.shouldHideDoneButton) {
-    return nil;
-  }
-  SettingsNavigationController* navigationController =
-      base::mac::ObjCCast<SettingsNavigationController>(
-          self.navigationController);
-  return [navigationController doneButton];
-}
-
-- (UIBarButtonItem*)createEditButton {
-  // Create a custom Edit bar button item, as Material Navigation Bar does not
-  // handle a system UIBarButtonSystemItemEdit item.
-  UIBarButtonItem* button = [[UIBarButtonItem alloc]
-      initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_EDIT_BUTTON)
-              style:UIBarButtonItemStyleDone
-             target:self
-             action:@selector(editButtonPressed)];
-  [button setEnabled:[self editButtonEnabled]];
-  return button;
-}
-
-- (UIBarButtonItem*)createEditDoneButton {
-  // Create a custom Done bar button item, as Material Navigation Bar does not
-  // handle a system UIBarButtonSystemItemDone item.
-  return [[UIBarButtonItem alloc]
-      initWithTitle:l10n_util::GetNSString(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON)
-              style:UIBarButtonItemStyleDone
-             target:self
-             action:@selector(editButtonPressed)];
-}
-
-- (void)updateEditButton {
-  if ([self.editor isEditing]) {
-    self.navigationItem.rightBarButtonItem = [self createEditDoneButton];
-  } else if ([self shouldShowEditButton]) {
-    self.navigationItem.rightBarButtonItem = [self createEditButton];
-  } else {
-    self.navigationItem.rightBarButtonItem = [self doneButtonIfNeeded];
-  }
-}
-
-- (void)editButtonPressed {
-  [self.editor setEditing:![self.editor isEditing] animated:YES];
-  [self updateEditButton];
-}
-
-- (void)reloadData {
-  [self loadModel];
-  [self.collectionView reloadData];
-}
-
-#pragma mark - CollectionViewFooterLinkDelegate
-
-- (void)cell:(CollectionViewFooterCell*)cell didTapLinkURL:(GURL)URL {
-  // Subclass must have a valid dispatcher assigned.
-  DCHECK(self.dispatcher);
-  OpenNewTabCommand* command = [OpenNewTabCommand commandWithURLFromChrome:URL];
-  [self.dispatcher closeSettingsUIAndOpenURL:command];
-}
-
-#pragma mark - Subclassing
-
-- (BOOL)shouldShowEditButton {
-  return NO;
-}
-
-- (BOOL)editButtonEnabled {
-  return NO;
-}
-
-- (void)preventUserInteraction {
-  DCHECK(!_savedBarButtonItem);
-  DCHECK_EQ(kUndefinedBarButtonItemPosition, _savedBarButtonItemPosition);
-
-  // Create |waitButton|.
-  BOOL displayActivityIndicatorOnTheRight =
-      self.navigationItem.rightBarButtonItem != nil;
-  CGFloat activityIndicatorDimension = IsIPadIdiom()
-                                           ? kActivityIndicatorDimensionIPad
-                                           : kActivityIndicatorDimensionIPhone;
-  BarButtonActivityIndicator* indicator = [[BarButtonActivityIndicator alloc]
-      initWithFrame:CGRectMake(0.0, 0.0, activityIndicatorDimension,
-                               activityIndicatorDimension)];
-  UIBarButtonItem* waitButton =
-      [[UIBarButtonItem alloc] initWithCustomView:indicator];
-
-  if (displayActivityIndicatorOnTheRight) {
-    // If there is a right bar button item, then it is the "Done" button.
-    _savedBarButtonItem = self.navigationItem.rightBarButtonItem;
-    _savedBarButtonItemPosition = kRightBarButtonItemPosition;
-    self.navigationItem.rightBarButtonItem = waitButton;
-    [self.navigationItem.leftBarButtonItem setEnabled:NO];
-  } else {
-    _savedBarButtonItem = self.navigationItem.leftBarButtonItem;
-    _savedBarButtonItemPosition = kLeftBarButtonItemPosition;
-    self.navigationItem.leftBarButtonItem = waitButton;
-  }
-
-  // Adds a veil that covers the collection view and prevents user interaction.
-  DCHECK(self.view);
-  DCHECK(!_veil);
-  _veil = [[UIView alloc] initWithFrame:self.view.bounds];
-  [_veil setAutoresizingMask:(UIViewAutoresizingFlexibleWidth |
-                              UIViewAutoresizingFlexibleHeight)];
-  [_veil setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:0.5]];
-  [self.view addSubview:_veil];
-
-  // Disable user interaction for the navigation controller view to ensure
-  // that the user cannot go back by swipping the navigation's top view
-  // controller
-  [self.navigationController.view setUserInteractionEnabled:NO];
-}
-
-- (void)allowUserInteraction {
-  DCHECK(self.navigationController)
-      << "|allowUserInteraction| should always be called before this settings"
-         " controller is popped or dismissed.";
-  [self.navigationController.view setUserInteractionEnabled:YES];
-
-  // Removes the veil that prevents user interaction.
-  DCHECK(_veil);
-  [UIView animateWithDuration:0.3
-      animations:^{
-        [_veil removeFromSuperview];
-      }
-      completion:^(BOOL finished) {
-        _veil = nil;
-      }];
-
-  DCHECK(_savedBarButtonItem);
-  switch (_savedBarButtonItemPosition) {
-    case kLeftBarButtonItemPosition:
-      self.navigationItem.leftBarButtonItem = _savedBarButtonItem;
-      break;
-    case kRightBarButtonItemPosition:
-      self.navigationItem.rightBarButtonItem = _savedBarButtonItem;
-      [self.navigationItem.leftBarButtonItem setEnabled:YES];
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  _savedBarButtonItem = nil;
-  _savedBarButtonItemPosition = kUndefinedBarButtonItemPosition;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm
deleted file mode 100644
index 255555aa..0000000
--- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller_unittest.mm
+++ /dev/null
@@ -1,108 +0,0 @@
-// 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.
-
-#import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h"
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#import "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface TestSettingsRootCollectionViewController
-    : SettingsRootCollectionViewController
-@property(nonatomic, readonly) NSMutableArray* items;
-- (void)reset;
-@end
-
-@implementation TestSettingsRootCollectionViewController {
-  NSMutableArray* _items;
-}
-
-- (NSMutableArray*)items {
-  if (!_items) {
-    _items = [[NSMutableArray alloc] init];
-  }
-  return _items;
-}
-
-- (void)reset {
-  _items = nil;
-}
-
-- (void)loadModel {
-  [super loadModel];
-  if ([self.items count] > 0) {
-    [self.collectionViewModel
-        addSectionWithIdentifier:kSectionIdentifierEnumZero];
-  }
-  for (CollectionViewItem* item in self.items) {
-    [self.collectionViewModel addItem:item
-              toSectionWithIdentifier:kSectionIdentifierEnumZero];
-  }
-}
-
-@end
-
-namespace {
-
-class SettingsRootCollectionViewControllerTest : public PlatformTest {
- public:
-  SettingsRootCollectionViewControllerTest()
-      : controller_([[TestSettingsRootCollectionViewController alloc]
-            initWithLayout:[[MDCCollectionViewFlowLayout alloc] init]
-                     style:CollectionViewControllerStyleDefault]) {
-    item1_ = [[CollectionViewItem alloc] initWithType:kItemTypeEnumZero];
-    item2_ = [[CollectionViewItem alloc] initWithType:kItemTypeEnumZero + 10];
-  }
-
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-    [controller() reset];
-  }
-
-  TestSettingsRootCollectionViewController* controller() { return controller_; }
-  CollectionViewItem* item1() { return item1_; }
-  CollectionViewItem* item2() { return item2_; }
-
-  id getCollectionViewItem(int section, int item) {
-    return [controller().collectionViewModel
-        itemAtIndexPath:[NSIndexPath indexPathForItem:item inSection:section]];
-  }
-
-  int numberOfSections() {
-    return [controller().collectionViewModel numberOfSections];
-  }
-
-  int numberOfItems(int section) {
-    return [controller().collectionViewModel numberOfItemsInSection:section];
-  }
-
-  TestSettingsRootCollectionViewController* controller_;
-  CollectionViewItem* item1_;
-  CollectionViewItem* item2_;
-};
-
-TEST_F(SettingsRootCollectionViewControllerTest, Empty) {
-  [controller() loadModel];
-  EXPECT_EQ(0, numberOfSections());
-}
-
-TEST_F(SettingsRootCollectionViewControllerTest, ModelContents) {
-  [controller().items addObjectsFromArray:@[ item1(), item2() ]];
-  [controller() loadModel];
-  EXPECT_EQ(1, numberOfSections());
-  EXPECT_EQ(2, numberOfItems(0));
-  EXPECT_EQ(item1(), getCollectionViewItem(0, 0));
-  EXPECT_EQ(item2(), getCollectionViewItem(0, 1));
-}
-
-}  // namespace
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.h b/ios/chrome/browser/ui/settings/settings_table_view_controller.h
index 0672b53..77baf004 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.h
@@ -19,11 +19,6 @@
 @interface SettingsTableViewController
     : SettingsRootTableViewController <SettingsControllerProtocol>
 
-// Dispatcher for SettingsMainPageCommands. Defaults to self if not set.
-// TODO(crbug.com/738881): Unify this with the dispatcher passed into the init.
-@property(weak, nonatomic) id<SettingsMainPageCommands>
-    settingsMainPageDispatcher;
-
 // Initializes a new SettingsTableViewController. |browser| must not
 // be nil and must not be associated with an off the record browser state.
 - (instancetype)
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 0b2f23ed..44c3be5 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -42,7 +42,6 @@
 #import "ios/chrome/browser/ui/authentication/cells/table_view_account_item.h"
 #import "ios/chrome/browser/ui/authentication/cells/table_view_signin_promo_item.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
-#import "ios/chrome/browser/ui/commands/settings_main_page_commands.h"
 #import "ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.h"
@@ -55,7 +54,6 @@
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h"
 #import "ios/chrome/browser/ui/settings/language/language_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h"
-#import "ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.h"
 #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/privacy_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/search_engine_table_view_controller.h"
@@ -142,7 +140,6 @@
   ItemTypeAboutChrome,
   ItemTypeMemoryDebugging,
   ItemTypeViewSource,
-  ItemTypeCollectionCellCatalog,
   ItemTypeTableCellCatalog,
   ItemTypeArticlesForYou,
 };
@@ -163,7 +160,6 @@
     PrefObserverDelegate,
     SettingsControllerProtocol,
     SearchEngineObserving,
-    SettingsMainPageCommands,
     SigninPresenter,
     SigninPromoViewConsumer,
     SyncObserverModelBridge> {
@@ -238,7 +234,6 @@
 @end
 
 @implementation SettingsTableViewController
-@synthesize settingsMainPageDispatcher = _settingsMainPageDispatcher;
 @synthesize dispatcher = _dispatcher;
 @synthesize signinInteractionCoordinator = _signinInteractionCoordinator;
 
@@ -308,7 +303,6 @@
     _prefObserverBridge->ObserveChangesForPreference(
         autofill::prefs::kAutofillProfileEnabled, &_prefChangeRegistrar);
 
-    _settingsMainPageDispatcher = self;
     _dispatcher = dispatcher;
 
     // TODO(crbug.com/764578): -loadModel should not be called from
@@ -440,8 +434,6 @@
 #if BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG)
   [model addItem:[self viewSourceSwitchItem]
       toSectionWithIdentifier:SectionIdentifierDebug];
-  [model addItem:[self collectionViewCatalogDetailItem]
-      toSectionWithIdentifier:SectionIdentifierDebug];
   [model addItem:[self tableViewCatalogDetailItem]
       toSectionWithIdentifier:SectionIdentifierDebug];
 #endif  // BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG)
@@ -651,13 +643,6 @@
                   withDefaultsKey:kDevViewSourceKey];
 }
 
-- (TableViewDetailIconItem*)collectionViewCatalogDetailItem {
-  return [self detailItemWithType:ItemTypeCollectionCellCatalog
-                             text:@"Collection Cell Catalog"
-                       detailText:nil
-                    iconImageName:kSettingsDebugImageName];
-}
-
 - (TableViewDetailIconItem*)tableViewCatalogDetailItem {
   return [self detailItemWithType:ItemTypeTableCellCatalog
                              text:@"TableView Cell Catalog"
@@ -849,9 +834,6 @@
       // Taps on these don't do anything. They have a switch as accessory view
       // and only the switch is tappable.
       break;
-    case ItemTypeCollectionCellCatalog:
-      [self.settingsMainPageDispatcher showMaterialCellCatalog];
-      break;
     case ItemTypeTableCellCatalog:
       [self.navigationController
           pushViewController:[[TableCellCatalogViewController alloc] init]
@@ -1080,14 +1062,6 @@
     [self reloadData];
 }
 
-#pragma mark Material Cell Catalog
-
-- (void)showMaterialCellCatalog {
-  [self.navigationController
-      pushViewController:[[MaterialCellCatalogViewController alloc] init]
-                animated:YES];
-}
-
 #pragma mark SettingsControllerProtocol
 
 - (void)settingsWillBeDismissed {
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn
index 5cba055..bf8d6498 100644
--- a/ios/chrome/browser/ui/settings/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -38,7 +38,6 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/settings:settings_root",
     "//ios/chrome/browser/ui/settings/cells",
-    "//ios/chrome/browser/ui/settings/cells/legacy",
     "//ios/chrome/browser/ui/settings/sync/utils",
     "//ios/chrome/browser/ui/settings/utils",
     "//ios/chrome/browser/ui/table_view",
@@ -83,7 +82,6 @@
     "//ios/chrome/browser/ui/collection_view:test_support",
     "//ios/chrome/browser/ui/settings:test_support",
     "//ios/chrome/browser/ui/settings/cells",
-    "//ios/chrome/browser/ui/settings/cells/legacy",
     "//ios/chrome/browser/ui/settings/sync/utils",
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view:test_support",
diff --git a/ios/chrome/browser/ui/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/BUILD.gn
index 158ea75f..3df663af 100644
--- a/ios/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/BUILD.gn
@@ -31,6 +31,7 @@
     "//ios/chrome/browser/sessions:serialisation",
     "//ios/chrome/browser/snapshots",
     "//ios/chrome/browser/tabs",
+    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/history",
@@ -95,6 +96,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/crash_report",
+    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui",
     "//ios/chrome/browser/ui/tab_grid/transitions",
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h
index 43d0291..1ea9068 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.h
@@ -60,6 +60,10 @@
 // Returns the layout of the grid for use in an animated transition.
 - (GridTransitionLayout*)transitionLayout;
 
+// Notifies the ViewController that its content is being displayed or hidden.
+- (void)contentWillAppearAnimated:(BOOL)animated;
+- (void)contentWillDisappear;
+
 // Notifies the grid that it is about to be dismissed.
 - (void)prepareForDismissal;
 
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
index 49c1ec9..d35d7c3 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
@@ -127,25 +127,11 @@
 
 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
-  self.updatesCollectionView = YES;
-  self.defaultLayout.animatesItemUpdates = YES;
-  [self.collectionView reloadData];
-  // Selection is invalid if there are no items.
-  if (self.items.count == 0) {
-    [self animateEmptyStateIn];
-    return;
-  }
-  [self.collectionView selectItemAtIndexPath:CreateIndexPath(self.selectedIndex)
-                                    animated:animated
-                              scrollPosition:UICollectionViewScrollPositionTop];
-  // Update the delegate, in case it wasn't set when |items| was populated.
-  [self.delegate gridViewController:self didChangeItemCount:self.items.count];
-  [self removeEmptyStateAnimated:NO];
-  self.lastInsertedItemID = nil;
+  [self contentWillAppearAnimated:animated];
 }
 
 - (void)viewWillDisappear:(BOOL)animated {
-  self.updatesCollectionView = NO;
+  [self contentWillDisappear];
   [super viewWillDisappear:animated];
 }
 
@@ -247,6 +233,28 @@
   self.defaultLayout.animatesItemUpdates = NO;
 }
 
+- (void)contentWillAppearAnimated:(BOOL)animated {
+  self.updatesCollectionView = YES;
+  self.defaultLayout.animatesItemUpdates = YES;
+  [self.collectionView reloadData];
+  // Selection is invalid if there are no items.
+  if (self.items.count == 0) {
+    [self animateEmptyStateIn];
+    return;
+  }
+  [self.collectionView selectItemAtIndexPath:CreateIndexPath(self.selectedIndex)
+                                    animated:animated
+                              scrollPosition:UICollectionViewScrollPositionTop];
+  // Update the delegate, in case it wasn't set when |items| was populated.
+  [self.delegate gridViewController:self didChangeItemCount:self.items.count];
+  [self removeEmptyStateAnimated:NO];
+  self.lastInsertedItemID = nil;
+}
+
+- (void)contentWillDisappear {
+  self.updatesCollectionView = NO;
+}
+
 #pragma mark - UICollectionViewDataSource
 
 - (NSInteger)collectionView:(UICollectionView*)collectionView
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h b/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h
index 31cb113a..6e051df 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_adaptor.h
@@ -8,6 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_mediator.h"
+#import "ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_switcher.h"
 
 @class TabGridViewController;
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
index db97b060..71ca053d 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -26,6 +26,7 @@
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_paging.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_transition_handler.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h"
+#include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -243,8 +244,10 @@
 
 - (UIViewController*)activeViewController {
   if (self.bvcContainer) {
-    DCHECK_EQ(self.bvcContainer,
-              self.baseViewController.presentedViewController);
+    if (!base::FeatureList::IsEnabled(kContainedBVC)) {
+      DCHECK_EQ(self.bvcContainer,
+                self.baseViewController.presentedViewController);
+    }
     DCHECK(self.bvcContainer.currentBVC);
     return self.bvcContainer.currentBVC;
   }
@@ -274,11 +277,20 @@
   // If a BVC is currently being presented, dismiss it.  This will trigger any
   // necessary animations.
   if (self.bvcContainer) {
-    self.bvcContainer.transitioningDelegate = self.transitionHandler;
-    self.bvcContainer = nil;
-    BOOL animated = !self.animationsDisabledForTesting;
-    [self.baseViewController dismissViewControllerAnimated:animated
-                                                completion:nil];
+    if (base::FeatureList::IsEnabled(kContainedBVC)) {
+      [self.baseViewController contentWillAppearAnimated:NO];
+      [self.bvcContainer willMoveToParentViewController:nil];
+      [self.bvcContainer.view removeFromSuperview];
+      [self.bvcContainer removeFromParentViewController];
+      self.bvcContainer = nil;
+      [self.baseViewController contentDidAppear];
+    } else {
+      self.bvcContainer.transitioningDelegate = self.transitionHandler;
+      self.bvcContainer = nil;
+      BOOL animated = !self.animationsDisabledForTesting;
+      [self.baseViewController dismissViewControllerAnimated:animated
+                                                  completion:nil];
+    }
   }
   // Record when the tab switcher is presented.
   base::RecordAction(base::UserMetricsAction("MobileTabGridEntered"));
@@ -287,6 +299,7 @@
 - (void)showTabViewController:(UIViewController*)viewController
                    completion:(ProceduralBlock)completion {
   DCHECK(viewController);
+  [self.adaptor.tabGridViewController contentWillDisappearAnimated:NO];
 
   // Record when the tab switcher is dismissed.
   base::RecordAction(base::UserMetricsAction("MobileTabGridExited"));
@@ -324,9 +337,17 @@
     self.launchMaskView = nil;
   };
 
-  [self.baseViewController presentViewController:self.bvcContainer
-                                        animated:animated
-                                      completion:extendedCompletion];
+  if (base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self.baseViewController addChildViewController:self.bvcContainer];
+    self.bvcContainer.view.frame = self.baseViewController.view.bounds;
+    [self.baseViewController.view addSubview:self.bvcContainer.view];
+    [self.bvcContainer didMoveToParentViewController:self.baseViewController];
+    extendedCompletion();
+  } else {
+    [self.baseViewController presentViewController:self.bvcContainer
+                                          animated:animated
+                                        completion:extendedCompletion];
+  }
 }
 
 #pragma mark - TabPresentationDelegate
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h
index 38929a9f..e7dc55b 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h
@@ -60,6 +60,11 @@
 // transitions are triggered.
 - (void)prepareForAppearance;
 
+// Notifies the ViewController that its content is being displayed or hidden.
+- (void)contentWillAppearAnimated:(BOOL)animated;
+- (void)contentDidAppear;
+- (void)contentWillDisappearAnimated:(BOOL)animated;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TAB_GRID_TAB_GRID_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
index 42634075..54ba192c 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -26,6 +26,7 @@
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_top_toolbar.h"
 #import "ios/chrome/browser/ui/tab_grid/transitions/grid_transition_layout.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
+#include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/common/colors/semantic_color_names.h"
@@ -181,29 +182,17 @@
 }
 
 - (void)viewWillAppear:(BOOL)animated {
-  self.viewVisible = YES;
-  [self.topToolbar.pageControl setSelectedPage:self.currentPage animated:YES];
-  [self configureViewControllerForCurrentSizeClassesAndPage];
-  // The toolbars should be hidden (alpha 0.0) before the tab appears, so that
-  // they can be animated in. They can't be set to 0.0 here, because if
-  // |animated| is YES, this method is being called inside the animation block.
-  if (animated && self.transitionCoordinator) {
-    [self animateToolbarsForAppearance];
-  } else {
-    [self showToolbars];
+  if (!base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self contentWillAppearAnimated:animated];
   }
-  [self broadcastIncognitoContentVisibility];
   [super viewWillAppear:animated];
 }
 
 - (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
-  self.initialFrame = self.view.frame;
-  // Modify Remote Tabs Insets when page appears and during rotation.
-  [self setInsetForRemoteTabs];
-  // Let image sources know the initial appearance is done.
-  [self.regularTabsImageDataSource clearPreloadedSnapshots];
-  [self.incognitoTabsImageDataSource clearPreloadedSnapshots];
+  if (!base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self contentDidAppear];
+  }
 }
 
 - (void)viewDidLayoutSubviews {
@@ -213,16 +202,9 @@
 }
 
 - (void)viewWillDisappear:(BOOL)animated {
-  self.undoCloseAllAvailable = NO;
-  [self.regularTabsDelegate discardSavedClosedItems];
-  // When the view disappears, the toolbar alpha should be set to 0; either as
-  // part of the animation, or directly with -hideToolbars.
-  if (animated && self.transitionCoordinator) {
-    [self animateToolbarsForDisappearance];
-  } else {
-    [self hideToolbars];
+  if (!base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self contentWillDisappearAnimated:animated];
   }
-  self.viewVisible = NO;
   [super viewWillDisappear:animated];
 }
 
@@ -382,6 +364,53 @@
   }
 }
 
+- (void)contentWillAppearAnimated:(BOOL)animated {
+  self.viewVisible = YES;
+  [self.topToolbar.pageControl setSelectedPage:self.currentPage animated:YES];
+  [self configureViewControllerForCurrentSizeClassesAndPage];
+  // The toolbars should be hidden (alpha 0.0) before the tab appears, so that
+  // they can be animated in. They can't be set to 0.0 here, because if
+  // |animated| is YES, this method is being called inside the animation block.
+  if (animated && self.transitionCoordinator) {
+    [self animateToolbarsForAppearance];
+  } else {
+    [self showToolbars];
+  }
+  [self broadcastIncognitoContentVisibility];
+
+  if (base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self.incognitoTabsViewController contentWillAppearAnimated:animated];
+    [self.regularTabsViewController contentWillAppearAnimated:animated];
+  }
+}
+
+- (void)contentDidAppear {
+  self.initialFrame = self.view.frame;
+  // Modify Remote Tabs Insets when page appears and during rotation.
+  [self setInsetForRemoteTabs];
+  // Let image sources know the initial appearance is done.
+  [self.regularTabsImageDataSource clearPreloadedSnapshots];
+  [self.incognitoTabsImageDataSource clearPreloadedSnapshots];
+}
+
+- (void)contentWillDisappearAnimated:(BOOL)animated {
+  self.undoCloseAllAvailable = NO;
+  [self.regularTabsDelegate discardSavedClosedItems];
+  // When the view disappears, the toolbar alpha should be set to 0; either as
+  // part of the animation, or directly with -hideToolbars.
+  if (animated && self.transitionCoordinator) {
+    [self animateToolbarsForDisappearance];
+  } else {
+    [self hideToolbars];
+  }
+  self.viewVisible = NO;
+
+  if (base::FeatureList::IsEnabled(kContainedBVC)) {
+    [self.incognitoTabsViewController contentWillDisappear];
+    [self.regularTabsViewController contentWillDisappear];
+  }
+}
+
 #pragma mark - Public Properties
 
 - (id<GridConsumer>)regularTabsConsumer {
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index 5dca4f4..bc407cd0 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -33,3 +33,6 @@
 
 const base::Feature kForceUnstackedTabstrip{"ForceUnstackedTabstrip",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kContainedBVC{"ContainedBVC",
+                                  base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h
index 034ff91..176adf4 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.h
+++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -36,4 +36,8 @@
 // Feature flag to always force an unstacked tabstrip.
 extern const base::Feature kForceUnstackedTabstrip;
 
+// Feature flag to have the Browser contained by the TabGrid instead of being
+// presented.
+extern const base::Feature kContainedBVC;
+
 #endif  // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index 938da77..4f4fd94 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -389,6 +389,7 @@
     "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui",
     "//ios/chrome/browser/ui/bookmarks:bookmarks_ui",
     "//ios/chrome/browser/ui/bookmarks:eg_app_support+eg2",
+    "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions:constants",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
diff --git a/ios/web/common/BUILD.gn b/ios/web/common/BUILD.gn
index 7ecbf12..dbf18d44 100644
--- a/ios/web/common/BUILD.gn
+++ b/ios/web/common/BUILD.gn
@@ -9,8 +9,6 @@
     "crw_content_view.h",
     "crw_web_view_content_view.h",
     "crw_web_view_content_view.mm",
-    "origin_util.h",
-    "origin_util.mm",
     "referrer_util.cc",
     "referrer_util.h",
     "url_scheme_util.h",
@@ -97,7 +95,6 @@
   ]
 
   sources = [
-    "origin_util_unittest.mm",
     "referrer_util_unittest.cc",
     "url_scheme_util_unittest.mm",
     "url_util_unittest.cc",
diff --git a/ios/web/common/origin_util.h b/ios/web/common/origin_util.h
deleted file mode 100644
index a2ece23..0000000
--- a/ios/web/common/origin_util.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_WEB_COMMON_ORIGIN_UTIL_H_
-#define IOS_WEB_COMMON_ORIGIN_UTIL_H_
-
-class GURL;
-
-namespace web {
-
-// Returns true if the origin is trustworthy: that is, if its content can be
-// said to have been transferred to the browser in a way that a network attacker
-// cannot tamper with or observe.
-//
-// See https://www.w3.org/TR/powerful-features/#is-origin-trustworthy.
-bool IsOriginSecure(const GURL& url);
-
-}  // namespace web
-
-#endif  // IOS_WEB_COMMON_ORIGIN_UTIL_H_
diff --git a/ios/web/common/origin_util.mm b/ios/web/common/origin_util.mm
deleted file mode 100644
index 57d3c33ee..0000000
--- a/ios/web/common/origin_util.mm
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2015 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.
-
-#import "ios/web/common/origin_util.h"
-
-#include "base/stl_util.h"
-#include "net/base/url_util.h"
-#include "services/network/public/cpp/is_potentially_trustworthy.h"
-#include "url/gurl.h"
-#include "url/url_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace web {
-
-bool IsOriginSecure(const GURL& url) {
-  return network::IsUrlPotentiallyTrustworthy(url);
-}
-
-}  // namespace web
diff --git a/ios/web/common/origin_util_unittest.mm b/ios/web/common/origin_util_unittest.mm
deleted file mode 100644
index 5bed38c..0000000
--- a/ios/web/common/origin_util_unittest.mm
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-#import "ios/web/common/origin_util.h"
-
-#import <WebKit/WebKit.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-#include "url/gurl.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace web {
-
-using OriginUtilTest = PlatformTest;
-
-// Tests calling IsSecureOrigin with secure origins.
-TEST_F(OriginUtilTest, IsSecureOriginSecure) {
-  EXPECT_TRUE(IsOriginSecure(GURL("http://localhost")));
-  EXPECT_TRUE(IsOriginSecure(GURL("https://chromium.org")));
-  EXPECT_TRUE(IsOriginSecure(GURL("file://file")));
-}
-
-// Tests calling IsSecureOrigin with insecure origins.
-TEST_F(OriginUtilTest, IsInsecureOriginSecure) {
-  EXPECT_FALSE(IsOriginSecure(GURL("http://chromium.org")));
-  EXPECT_FALSE(IsOriginSecure(GURL("bogus://bogus")));
-}
-
-}  // namespace web
diff --git a/ios/web_view/internal/passwords/cwv_password_controller.mm b/ios/web_view/internal/passwords/cwv_password_controller.mm
index e177d44..49ebcba 100644
--- a/ios/web_view/internal/passwords/cwv_password_controller.mm
+++ b/ios/web_view/internal/passwords/cwv_password_controller.mm
@@ -16,7 +16,6 @@
 #include "components/password_manager/ios/account_select_fill_data.h"
 #import "components/password_manager/ios/password_form_helper.h"
 #import "components/password_manager/ios/password_suggestion_helper.h"
-#import "ios/web/common/origin_util.h"
 #include "ios/web/common/url_scheme_util.h"
 #include "ios/web/public/js_messaging/web_frame.h"
 #include "ios/web/public/js_messaging/web_frame_util.h"
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
index ce0edc3..5498ab8 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -200,16 +200,22 @@
   }
 
   if (profile >= H264PROFILE_MIN && profile <= H264PROFILE_MAX) {
-    decoder_.reset(new H264Decoder(
-        std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_),
-        profile, config.container_color_space));
+    auto accelerator =
+        std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+    decoder_.reset(new H264Decoder(std::move(accelerator), profile,
+                                   config.container_color_space));
   } else if (profile >= VP8PROFILE_MIN && profile <= VP8PROFILE_MAX) {
-    decoder_.reset(new VP8Decoder(
-        std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_)));
+    auto accelerator =
+        std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+    decoder_.reset(new VP8Decoder(std::move(accelerator)));
   } else if (profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX) {
-    decoder_.reset(new VP9Decoder(
-        std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_),
-        profile, config.container_color_space));
+    auto accelerator =
+        std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+    decoder_.reset(new VP9Decoder(std::move(accelerator), profile,
+                                  config.container_color_space));
   } else {
     VLOGF(1) << "Unsupported profile " << GetProfileName(profile);
     return false;
@@ -445,20 +451,14 @@
 
     switch (res) {
       case AcceleratedVideoDecoder::kConfigChange: {
-        gfx::Size new_size = decoder_->GetPicSize();
-        if (profile_ != decoder_->GetProfile() &&
-            requested_pic_size_ == new_size) {
-          // Profile only is changed.
-          // TODO(crbug.com/1022246): Handle profile change.
-          continue;
-        }
         VLOGF(2) << "Decoder requesting a new set of surfaces";
         task_runner_->PostTask(
             FROM_HERE,
             base::BindOnce(
                 &VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange,
-                weak_this_, decoder_->GetRequiredNumOfPictures(), new_size,
-                decoder_->GetNumReferenceFrames(), decoder_->GetVisibleRect()));
+                weak_this_, decoder_->GetRequiredNumOfPictures(),
+                decoder_->GetPicSize(), decoder_->GetNumReferenceFrames(),
+                decoder_->GetVisibleRect()));
         // We'll get rescheduled once ProvidePictureBuffers() finishes.
         return;
       }
@@ -566,11 +566,25 @@
 
   // All surfaces released, destroy them and dismiss all PictureBuffers.
   awaiting_va_surfaces_recycle_ = false;
-  if (buffer_allocation_mode_ != BufferAllocationMode::kNone) {
-    vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>(
-        available_va_surfaces_.begin(), available_va_surfaces_.end()));
+
+  VideoCodecProfile new_profile = decoder_->GetProfile();
+  if (profile_ != new_profile) {
+    DCHECK(decoder_delegate_);
+    profile_ = new_profile;
+    auto new_vaapi_wrapper = VaapiWrapper::CreateForVideoCodec(
+        VaapiWrapper::kDecode, profile_, base::Bind(&ReportToUMA, VAAPI_ERROR));
+    RETURN_AND_NOTIFY_ON_FAILURE(new_vaapi_wrapper.get(),
+                                 "Failed creating VaapiWrapper",
+                                 INVALID_ARGUMENT, );
+    decoder_delegate_->set_vaapi_wrapper(new_vaapi_wrapper.get());
+    vaapi_wrapper_ = std::move(new_vaapi_wrapper);
   } else {
-    vaapi_wrapper_->DestroyContext();
+    if (buffer_allocation_mode_ != BufferAllocationMode::kNone) {
+      vaapi_wrapper_->DestroyContextAndSurfaces(std::vector<VASurfaceID>(
+          available_va_surfaces_.begin(), available_va_surfaces_.end()));
+    } else {
+      vaapi_wrapper_->DestroyContext();
+    }
   }
   available_va_surfaces_.clear();
 
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.h b/media/gpu/vaapi/vaapi_video_decode_accelerator.h
index 1c30f700..7e2b2328 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.h
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.h
@@ -44,6 +44,7 @@
 namespace media {
 
 class AcceleratedVideoDecoder;
+class VaapiVideoDecoderDelegate;
 class VaapiPicture;
 
 // Class to provide video decode acceleration for Intel systems with hardware
@@ -246,6 +247,9 @@
   scoped_refptr<VaapiWrapper> vaapi_wrapper_;
   // Only used on |decoder_thread_task_runner_|.
   std::unique_ptr<AcceleratedVideoDecoder> decoder_;
+  // TODO(crbug.com/1022246): Instead of having the raw pointer here, getting
+  // the pointer from AcceleratedVideoDecoder.
+  VaapiVideoDecoderDelegate* decoder_delegate_ = nullptr;
 
   // Filled in during Initialize().
   BufferAllocationMode buffer_allocation_mode_;
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
index 015fd9c8..83dcc61e 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -228,16 +228,16 @@
     EXPECT_CALL(*mock_decoder_, Decode())
         .WillOnce(Return(AcceleratedVideoDecoder::kConfigChange));
 
-    EXPECT_CALL(*mock_decoder_, GetPicSize()).WillOnce(Return(picture_size));
-    EXPECT_CALL(*mock_decoder_, GetProfile())
-        .WillOnce(Return(GetParam().video_codec));
     EXPECT_CALL(*mock_decoder_, GetRequiredNumOfPictures())
         .WillOnce(Return(num_pictures));
+    EXPECT_CALL(*mock_decoder_, GetPicSize()).WillOnce(Return(picture_size));
     const size_t kNumReferenceFrames = num_pictures / 2;
     EXPECT_CALL(*mock_decoder_, GetNumReferenceFrames())
         .WillOnce(Return(kNumReferenceFrames));
     EXPECT_CALL(*mock_decoder_, GetVisibleRect())
         .WillOnce(Return(gfx::Rect(picture_size)));
+    EXPECT_CALL(*mock_decoder_, GetProfile())
+        .WillOnce(Return(GetParam().video_codec));
     if (vda_.buffer_allocation_mode_ !=
         VaapiVideoDecodeAccelerator::BufferAllocationMode::kNone) {
       EXPECT_CALL(*mock_vaapi_wrapper_, DestroyContextAndSurfaces(_));
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 7761c3e5..0655b5b 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -124,6 +124,7 @@
 
     decoder_ = nullptr;
     vaapi_wrapper_ = nullptr;
+    decoder_delegate_ = nullptr;
     SetState(State::kUninitialized);
   }
 
@@ -236,16 +237,6 @@
       }
       break;
     case AcceleratedVideoDecoder::kConfigChange:
-      if (profile_ != decoder_->GetProfile()) {
-        DVLOGF(3) << "Profile is changed: " << profile_ << " -> "
-                  << decoder_->GetProfile();
-      }
-      if (pic_size_ == decoder_->GetPicSize()) {
-        // Profile only is changed.
-        // TODO(crbug.com/1022246): Handle profile change.
-        SetState(State::kError);
-        break;
-      }
       // A new set of output buffers is requested. We either didn't have any
       // output buffers yet or encountered a resolution change.
       // After the pipeline flushes all frames, OnPipelineFlushed() will be
@@ -401,7 +392,6 @@
   const gfx::Rect visible_rect = decoder_->GetVisibleRect();
   gfx::Size natural_size = GetNaturalSize(visible_rect, pixel_aspect_ratio_);
   pic_size_ = decoder_->GetPicSize();
-  profile_ = decoder_->GetProfile();
   const base::Optional<VideoPixelFormat> format =
       GfxBufferFormatToVideoPixelFormat(GetBufferFormat());
   CHECK(format);
@@ -413,7 +403,22 @@
 
   // All pending decode operations will be completed before triggering a
   // resolution change, so we can safely destroy the context here.
-  vaapi_wrapper_->DestroyContext();
+  if (profile_ != decoder_->GetProfile()) {
+    // When a profile is changed, we need to re-initialize VaapiWrapper.
+    profile_ = decoder_->GetProfile();
+    auto new_vaapi_wrapper = VaapiWrapper::CreateForVideoCodec(
+        VaapiWrapper::kDecode, profile_, base::DoNothing());
+    if (!new_vaapi_wrapper.get()) {
+      DLOG(WARNING) << "Failed creating VaapiWrapper";
+      SetState(State::kError);
+      return;
+    }
+    decoder_delegate_->set_vaapi_wrapper(new_vaapi_wrapper.get());
+    vaapi_wrapper_ = std::move(new_vaapi_wrapper);
+  } else {
+    vaapi_wrapper_->DestroyContext();
+  }
+
   vaapi_wrapper_->CreateContext(pic_size_);
 
   // If we reset during resolution change, then there is no decode tasks. In
@@ -526,16 +531,25 @@
   pic_size_ = gfx::Size();
 
   if (profile_ >= H264PROFILE_MIN && profile_ <= H264PROFILE_MAX) {
-    decoder_.reset(new H264Decoder(
-        std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_),
-        profile_, color_space_));
+    auto accelerator =
+        std::make_unique<H264VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+
+    decoder_.reset(
+        new H264Decoder(std::move(accelerator), profile_, color_space_));
   } else if (profile_ >= VP8PROFILE_MIN && profile_ <= VP8PROFILE_MAX) {
-    decoder_.reset(new VP8Decoder(
-        std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_)));
+    auto accelerator =
+        std::make_unique<VP8VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+
+    decoder_.reset(new VP8Decoder(std::move(accelerator)));
   } else if (profile_ >= VP9PROFILE_MIN && profile_ <= VP9PROFILE_MAX) {
-    decoder_.reset(new VP9Decoder(
-        std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_),
-        profile_, color_space_));
+    auto accelerator =
+        std::make_unique<VP9VaapiVideoDecoderDelegate>(this, vaapi_wrapper_);
+    decoder_delegate_ = accelerator.get();
+
+    decoder_.reset(
+        new VP9Decoder(std::move(accelerator), profile_, color_space_));
   } else {
     VLOGF(1) << "Unsupported profile " << GetProfileName(profile_);
     return false;
diff --git a/media/gpu/vaapi/vaapi_video_decoder.h b/media/gpu/vaapi/vaapi_video_decoder.h
index 8e4f24e..01e282d 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.h
+++ b/media/gpu/vaapi/vaapi_video_decoder.h
@@ -33,6 +33,7 @@
 namespace media {
 
 class AcceleratedVideoDecoder;
+class VaapiVideoDecoderDelegate;
 class DmabufVideoFramePool;
 class VaapiWrapper;
 class VideoFrame;
@@ -170,6 +171,9 @@
   // Platform and codec specific video decoder.
   std::unique_ptr<AcceleratedVideoDecoder> decoder_;
   scoped_refptr<VaapiWrapper> vaapi_wrapper_;
+  // TODO(crbug.com/1022246): Instead of having the raw pointer here, getting
+  // the pointer from AcceleratedVideoDecoder.
+  VaapiVideoDecoderDelegate* decoder_delegate_ = nullptr;
 
   SEQUENCE_CHECKER(decoder_sequence_checker_);
 
diff --git a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc
index df101be..1c7ef80d 100644
--- a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc
@@ -24,4 +24,10 @@
   // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+void VaapiVideoDecoderDelegate::set_vaapi_wrapper(
+    scoped_refptr<VaapiWrapper> vaapi_wrapper) {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+  vaapi_wrapper_ = std::move(vaapi_wrapper);
+}
+
 }  // namespace media
diff --git a/media/gpu/vaapi/vaapi_video_decoder_delegate.h b/media/gpu/vaapi/vaapi_video_decoder_delegate.h
index 71b1fd6..f8b825a 100644
--- a/media/gpu/vaapi/vaapi_video_decoder_delegate.h
+++ b/media/gpu/vaapi/vaapi_video_decoder_delegate.h
@@ -16,12 +16,16 @@
 class VASurface;
 
 // The common part of each AcceleratedVideoDecoder's Accelerator for VA-API.
+// This class allows clients to reset VaapiWrapper in case of a profile change.
+// DecodeSurfaceHandler must stay alive for the lifetime of this class.
 class VaapiVideoDecoderDelegate {
  public:
   VaapiVideoDecoderDelegate(DecodeSurfaceHandler<VASurface>* const vaapi_dec,
                             scoped_refptr<VaapiWrapper> vaapi_wrapper);
   virtual ~VaapiVideoDecoderDelegate();
 
+  void set_vaapi_wrapper(scoped_refptr<VaapiWrapper> vaapi_wrapper);
+
   VaapiVideoDecoderDelegate(const VaapiVideoDecoderDelegate&) = delete;
   VaapiVideoDecoderDelegate& operator=(const VaapiVideoDecoderDelegate&) =
       delete;
@@ -29,7 +33,7 @@
  protected:
   // Both owned by caller.
   DecodeSurfaceHandler<VASurface>* const vaapi_dec_;
-  const scoped_refptr<VaapiWrapper> vaapi_wrapper_;
+  scoped_refptr<VaapiWrapper> vaapi_wrapper_;
 
   SEQUENCE_CHECKER(sequence_checker_);
 };
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc
index 8fcd1e5..d66b8e4a 100644
--- a/net/dns/mock_host_resolver.cc
+++ b/net/dns/mock_host_resolver.cc
@@ -892,7 +892,10 @@
         r->address_family == address_family;
     // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
     // whether a rule matches.
-    HostResolverFlags flags = host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY;
+    HostResolverFlags flags =
+        host_resolver_flags &
+        (~HOST_RESOLVER_SYSTEM_ONLY &
+         ~HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
     // Flags match if all of the bitflags in host_resolver_flags are enabled
     // in the rule's host_resolver_flags. However, the rule may have additional
     // flags specified, in which case the flags should still be considered a
diff --git a/ppapi/tests/test_host_resolver.cc b/ppapi/tests/test_host_resolver.cc
index 3bdbdc3..b0e8383 100644
--- a/ppapi/tests/test_host_resolver.cc
+++ b/ppapi/tests/test_host_resolver.cc
@@ -118,10 +118,11 @@
     const PP_HostResolver_Hint& hint) {
   pp::HostResolver host_resolver(instance_);
 
-  ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint));
+  ASSERT_SUBTEST_SUCCESS(
+      SyncResolve(&host_resolver, "host_resolver.test", port_, hint));
 
   size_t size = host_resolver.GetNetAddressCount();
-  ASSERT_TRUE(size >= 1);
+  ASSERT_EQ(1u, size);
 
   pp::NetAddress address;
   for (size_t i = 0; i < size; ++i) {
diff --git a/services/device/nfc/README.md b/services/device/nfc/README.md
new file mode 100644
index 0000000..6058a73
--- /dev/null
+++ b/services/device/nfc/README.md
@@ -0,0 +1,69 @@
+# NFC
+
+### High level Overview
+
+The implementation of Web NFC in Chromium consists of two main parts:
+The NFC module in Blink located at `third_party/blink/renderer/modules/nfc/` which
+contains Blink JavaScript bindings for Web NFC and the browser side platform
+level adaptation that is located at `services/device/nfc`. The Blink NFC module
+communicates with the browser adaptation through NFC Mojo interface defined in
+the `services/device/public/mojom/nfc.mojom` file and implemented by the
+`services/device/nfc` module.
+
+NDEFWriter and NDEFReader are the two primary interfaces of the Web NFC APIs.
+
+The NDEFWriter interface has the push method for writing data to NFC devices such as
+tags. This method will return a promise, which will be resolved when the
+message is successfully written to some target or be rejected when errors
+happened or the process is aborted by setting the AbortSignal in the
+NDEFPushOptions.
+
+The NDEFReader interface has the scan method to try to read data from any NFC device
+that comes within proximity. Once there is some data found to be matching the
+filtering criteria provided by web developers in NDEFScanOptions, an
+NDEFReadingEvent carrying the data will be dispatched to the NDEFReader.
+
+The most important classes for Android adaptation are
+
+[NfcImpl](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java),
+[NfcTagHandler](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NfcTagHandler.java)
+and
+[NdefMessageUtils](../../../services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java).
+
+## Web-exposed Interfaces
+
+### [NFC specification ](https://w3c.github.io/web-nfc/)
+
+## Testing:
+
+* Web platform tests are located in
+`third_party/blink/web_tests/external/wpt/web-nfc/` and are a mirror of the
+[web-platform-tests GitHub repository](https://github.com/web-platform-tests/wpt).
+* NFC platform unit tests file for Android is
+[NFCTest.java](../../../services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java)
+
+
+## Security and Privacy
+
+Web NFC API can be only accessed by top-level secure browsing contexts and user
+permission is required to access NFC functionality. Web NFC API specification
+addresses security and privacy topics in chapter [7. Security and Privacy](https://w3c.github.io/web-nfc/#security).
+
+
+## Permissions
+
+The device service provides no support for permission checks. When the render
+process requests access to a NFC this request is proxied through the browser
+process by [NfcPermissionContext](../../../chrome/browser/nfc/nfc_permission_context.h)
+which is responsible for checking the permissions granted to the requesting origin.
+
+
+## Platform Support
+
+At the time of writing, only Android platform is supported.
+
+
+## Design Documents
+
+Please refer to the [design documentation](https://sites.google.com/a/chromium.org/dev/developers/design-documents/web-nfc)
+for more details.
\ No newline at end of file
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index f3d07b9..49115e0f 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -426,6 +426,8 @@
     "test/test_cookie_manager.h",
     "test/test_data_pipe_getter.cc",
     "test/test_data_pipe_getter.h",
+    "test/test_dns_util.cc",
+    "test/test_dns_util.h",
     "test/test_network_connection_tracker.cc",
     "test/test_network_connection_tracker.h",
     "test/test_network_context.h",
diff --git a/services/network/origin_policy/origin_policy_parser.cc b/services/network/origin_policy/origin_policy_parser.cc
index a6715760..62cf8cd8 100644
--- a/services/network/origin_policy/origin_policy_parser.cc
+++ b/services/network/origin_policy/origin_policy_parser.cc
@@ -11,6 +11,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/values.h"
+#include "services/network/public/cpp/isolation_opt_in_hints.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -45,6 +46,14 @@
     ParseFeatures(*features);
   }
 
+  if (base::Value* isolation =
+          json->FindKeyOfType("isolation", base::Value::Type::BOOLEAN)) {
+    if (isolation->GetBool())
+      policy_contents_->isolation_optin_hints = IsolationOptInHints::NO_HINTS;
+  } else if (base::Value* isolation = json->FindDictKey("isolation")) {
+    ParseIsolation(*isolation);
+  }
+
   return csp_ok;
 }
 
@@ -81,4 +90,23 @@
   }
 }
 
+// The parsing is based on the example at
+// https://github.com/domenic/origin-isolation#example.
+void OriginPolicyParser::ParseIsolation(const base::Value& policy) {
+  IsolationOptInHints hints = IsolationOptInHints::NO_HINTS;
+  for (const auto& key_value : policy.DictItems()) {
+    // If we hit a key with a non-boolean value, skip it.
+    if (!key_value.second.is_bool())
+      continue;
+    if (key_value.second.GetBool()) {
+      IsolationOptInHints dict_hint =
+          GetIsolationOptInHintFromString(key_value.first);
+      // If we hit a key we don't recognise, it will just return NO_HINTS and
+      // have no effect.
+      hints |= dict_hint;
+    }
+  }
+  policy_contents_->isolation_optin_hints = hints;
+}
+
 }  // namespace network
diff --git a/services/network/origin_policy/origin_policy_parser.h b/services/network/origin_policy/origin_policy_parser.h
index 99a8a30..2535cd56 100644
--- a/services/network/origin_policy/origin_policy_parser.h
+++ b/services/network/origin_policy/origin_policy_parser.h
@@ -42,8 +42,9 @@
   bool ParseContentSecurityPolicies(const base::Value&);
   bool ParseContentSecurityPolicy(const base::Value&);
 
-  // The following method is implemented according to the newer spec:
+  // The following methods are implemented according to the newer spec:
   void ParseFeatures(const base::Value&);
+  void ParseIsolation(const base::Value&);
 
   OriginPolicyContentsPtr policy_contents_;
 
diff --git a/services/network/origin_policy/origin_policy_parser_unittest.cc b/services/network/origin_policy/origin_policy_parser_unittest.cc
index ff34d18..01b10d2 100644
--- a/services/network/origin_policy/origin_policy_parser_unittest.cc
+++ b/services/network/origin_policy/origin_policy_parser_unittest.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "services/network/origin_policy/origin_policy_parser.h"
+#include "base/strings/stringprintf.h"
+#include "services/network/public/cpp/isolation_opt_in_hints.h"
 #include "services/network/public/mojom/origin_policy_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
@@ -228,4 +230,91 @@
   ASSERT_FALSE(policy_contents->feature_policy.has_value());
 }
 
+namespace {
+
+void TestHintsHelper(const std::vector<std::string>& target_hints) {
+  std::string hints_substr;
+  for (auto hint_str : target_hints) {
+    hints_substr += base::StringPrintf("%s\"%s\": true",
+                                       (!hints_substr.empty() ? ", " : ""),
+                                       hint_str.c_str());
+  }
+  std::string manifest_string =
+      base::StringPrintf("{ \"isolation\": { %s }}", hints_substr.c_str());
+  auto policy_contents = OriginPolicyParser::Parse(manifest_string);
+
+  ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
+  for (auto target_hint_str : target_hints) {
+    IsolationOptInHints target_hint =
+        GetIsolationOptInHintFromString(target_hint_str);
+    EXPECT_EQ(target_hint,
+              target_hint & policy_contents->isolation_optin_hints.value());
+  }
+}
+
+}  // namespace
+
+TEST(OriginPolicyParser, IsolationOptInNoIsolationKey) {
+  auto policy_contents = OriginPolicyParser::Parse(R"({})");
+  ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value());
+}
+
+TEST(OriginPolicyParser, IsolationOptInNoDict) {
+  auto policy_contents = OriginPolicyParser::Parse(R"({ "isolation": true })");
+  ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
+  EXPECT_EQ(IsolationOptInHints::NO_HINTS,
+            policy_contents->isolation_optin_hints.value());
+
+  ASSERT_FALSE(OriginPolicyParser::Parse(R"({ "isolation": false })")
+                   ->isolation_optin_hints.has_value());
+}
+
+TEST(OriginPolicyParser, IsolationOptInEmptyDict) {
+  TestHintsHelper({});
+}
+
+TEST(OriginPolicyParser, IsolationOptInTestOneHint) {
+  TestHintsHelper({"prefer_isolated_event_loop"});
+  TestHintsHelper({"prefer_isolated_memory"});
+  TestHintsHelper({"for_side_channel_protection"});
+  TestHintsHelper({"for_memory_measurement"});
+}
+
+TEST(OriginPolicyParser, IsolationOptInTestTwoHints) {
+  TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory"});
+  TestHintsHelper(
+      {"prefer_isolated_event_loop", "for_side_channel_protection"});
+  TestHintsHelper({"prefer_isolated_event_loop", "for_memory_measurement"});
+  TestHintsHelper({"prefer_isolated_memory", "for_side_channel_protection"});
+  TestHintsHelper({"prefer_isolated_memory", "for_memory_measurement"});
+  TestHintsHelper({"for_side_channel_protection", "for_memory_measurement"});
+}
+
+TEST(OriginPolicyParser, IsolationOptInTestThreeHints) {
+  TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory",
+                   "for_side_channel_protection"});
+}
+
+TEST(OriginPolicyParser, IsolationOptInIgnoreUnrecognisedKeys) {
+  std::string manifest_string = R"( { "isolation": {
+    "prefer_isolated_event_loop": true,
+    "foo": true }
+  } )";
+  auto policy_contents = OriginPolicyParser::Parse(manifest_string);
+  ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
+  EXPECT_EQ(IsolationOptInHints::PREFER_ISOLATED_EVENT_LOOP,
+            policy_contents->isolation_optin_hints.value());
+}
+
+TEST(OriginPolicyParser, IsolationOptInIgnoreFalseValues) {
+  std::string manifest_string = R"( { "isolation": {
+    "prefer_isolated_event_loop": false
+    }
+  } )";
+  auto policy_contents = OriginPolicyParser::Parse(manifest_string);
+  ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value());
+  EXPECT_EQ(IsolationOptInHints::NO_HINTS,
+            policy_contents->isolation_optin_hints.value());
+}
+
 }  // namespace network
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index 463009c..5546dd8f 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -124,6 +124,8 @@
     "http_raw_request_response_info.h",
     "http_request_headers_mojom_traits.cc",
     "http_request_headers_mojom_traits.h",
+    "isolation_opt_in_hints.cc",
+    "isolation_opt_in_hints.h",
     "mutable_network_traffic_annotation_tag_mojom_traits.h",
     "mutable_partial_network_traffic_annotation_tag_mojom_traits.h",
     "net_ipc_param_traits.cc",
diff --git a/services/network/public/cpp/isolation_opt_in_hints.cc b/services/network/public/cpp/isolation_opt_in_hints.cc
new file mode 100644
index 0000000..8453fcaa
--- /dev/null
+++ b/services/network/public/cpp/isolation_opt_in_hints.cc
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/public/cpp/isolation_opt_in_hints.h"
+
+#include <type_traits>
+
+namespace network {
+
+IsolationOptInHints GetIsolationOptInHintFromString(
+    const std::string& hint_str) {
+  if (hint_str == "prefer_isolated_event_loop")
+    return IsolationOptInHints::PREFER_ISOLATED_EVENT_LOOP;
+  if (hint_str == "prefer_isolated_memory")
+    return IsolationOptInHints::PREFER_ISOLATED_MEMORY;
+  if (hint_str == "for_side_channel_protection")
+    return IsolationOptInHints::FOR_SIDE_CHANNEL_PROTECTION;
+  if (hint_str == "for_memory_measurement")
+    return IsolationOptInHints::FOR_MEMORY_ISOLATION;
+  return IsolationOptInHints::NO_HINTS;
+}
+
+IsolationOptInHints& operator|=(IsolationOptInHints& lhs,
+                                IsolationOptInHints& rhs) {
+  lhs = static_cast<IsolationOptInHints>(
+      static_cast<std::underlying_type<IsolationOptInHints>::type>(lhs) |
+      static_cast<std::underlying_type<IsolationOptInHints>::type>(rhs));
+  return lhs;
+}
+
+IsolationOptInHints& operator&(IsolationOptInHints& lhs,
+                               IsolationOptInHints& rhs) {
+  lhs = static_cast<IsolationOptInHints>(
+      static_cast<std::underlying_type<IsolationOptInHints>::type>(lhs) &
+      static_cast<std::underlying_type<IsolationOptInHints>::type>(rhs));
+  return lhs;
+}
+
+}  // namespace network
diff --git a/services/network/public/cpp/isolation_opt_in_hints.h b/services/network/public/cpp/isolation_opt_in_hints.h
new file mode 100644
index 0000000..26a19fe0
--- /dev/null
+++ b/services/network/public/cpp/isolation_opt_in_hints.h
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_
+#define SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+
+namespace network {
+
+// The following definitions correspond to the draft spec found here:
+// https://github.com/domenic/origin-isolation#proposed-hints.
+enum class IsolationOptInHints : unsigned {
+  NO_HINTS = 0x0,
+  PREFER_ISOLATED_EVENT_LOOP = 0x1,
+  PREFER_ISOLATED_MEMORY = 0x2,
+  FOR_SIDE_CHANNEL_PROTECTION = 0x4,
+  FOR_MEMORY_ISOLATION = 0x8
+};
+
+// Converts hint strings into their corresponding IsolationOptInHints values.
+// The hint strings are specified at
+// https://github.com/domenic/origin-isolation#proposed-hints.
+COMPONENT_EXPORT(NETWORK_CPP_BASE)
+IsolationOptInHints GetIsolationOptInHintFromString(
+    const std::string& hint_str);
+
+COMPONENT_EXPORT(NETWORK_CPP_BASE)
+IsolationOptInHints& operator|=(IsolationOptInHints& lhs,
+                                IsolationOptInHints& rhs);
+
+COMPONENT_EXPORT(NETWORK_CPP_BASE)
+IsolationOptInHints& operator&(IsolationOptInHints& lhs,
+                               IsolationOptInHints& rhs);
+
+}  // namespace network
+#endif  // SERVICES_NETWORK_PUBLIC_CPP_ISOLATION_OPT_IN_HINTS_H_
diff --git a/services/network/public/cpp/origin_policy.cc b/services/network/public/cpp/origin_policy.cc
index cd6a2963..fd8481ce 100644
--- a/services/network/public/cpp/origin_policy.cc
+++ b/services/network/public/cpp/origin_policy.cc
@@ -25,11 +25,13 @@
 OriginPolicyContents::OriginPolicyContents(
     const base::Optional<std::string>& feature_policy,
     const std::vector<std::string>& content_security_policies,
-    const std::vector<std::string>& content_security_policies_report_only)
+    const std::vector<std::string>& content_security_policies_report_only,
+    const base::Optional<IsolationOptInHints>& isolation_optin_hints)
     : feature_policy(feature_policy),
       content_security_policies(content_security_policies),
       content_security_policies_report_only(
-          content_security_policies_report_only) {}
+          content_security_policies_report_only),
+      isolation_optin_hints(isolation_optin_hints) {}
 
 OriginPolicyContents& OriginPolicyContents::operator=(
     const OriginPolicyContents& other) = default;
@@ -38,7 +40,8 @@
   return feature_policy == other.feature_policy &&
          content_security_policies == other.content_security_policies &&
          content_security_policies_report_only ==
-             other.content_security_policies_report_only;
+             other.content_security_policies_report_only &&
+         isolation_optin_hints == other.isolation_optin_hints;
 }
 
 OriginPolicyContentsPtr OriginPolicyContents::ClonePtr() {
diff --git a/services/network/public/cpp/origin_policy.h b/services/network/public/cpp/origin_policy.h
index d5e82d4..e40822df 100644
--- a/services/network/public/cpp/origin_policy.h
+++ b/services/network/public/cpp/origin_policy.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/optional.h"
+#include "services/network/public/cpp/isolation_opt_in_hints.h"
 #include "url/gurl.h"
 
 namespace network {
@@ -54,7 +55,8 @@
   OriginPolicyContents(
       const base::Optional<std::string>& feature_policy,
       const std::vector<std::string>& content_security_policies,
-      const std::vector<std::string>& content_security_policies_report_only);
+      const std::vector<std::string>& content_security_policies_report_only,
+      const base::Optional<IsolationOptInHints>& isolation_optin_hints);
 
   OriginPolicyContents(const OriginPolicyContents& other);
   OriginPolicyContents& operator=(const OriginPolicyContents& other);
@@ -83,6 +85,11 @@
   // a "report" disposition.
   // https://w3c.github.io/webappsec-csp/#policy-disposition
   std::vector<std::string> content_security_policies_report_only;
+
+  // This field, if present, indicates that the origin is opting in to
+  // origin-based isolation. The int contains zero or more flag bits indicating
+  // what the origin is hoping to achieve through isolation.
+  base::Optional<IsolationOptInHints> isolation_optin_hints;
 };
 
 // Native implementation of mojom::OriginPolicy. This is done so we can pass
diff --git a/services/network/public/mojom/network_service_test.mojom b/services/network/public/mojom/network_service_test.mojom
index bed4308a8..4528519e1 100644
--- a/services/network/public/mojom/network_service_test.mojom
+++ b/services/network/public/mojom/network_service_test.mojom
@@ -22,6 +22,8 @@
   ResolverType resolver_type;
   string host_pattern;
   string replacement;
+  int32 host_resolver_flags;
+  string canonical_name;
 };
 
 // Testing interface to the network service.
diff --git a/services/network/quic_transport_unittest.cc b/services/network/quic_transport_unittest.cc
index aa59685a..042fffdd88 100644
--- a/services/network/quic_transport_unittest.cc
+++ b/services/network/quic_transport_unittest.cc
@@ -101,6 +101,23 @@
   bool has_seen_mojo_connection_error_ = false;
 };
 
+class TestClient final : public mojom::QuicTransportClient {
+ public:
+  explicit TestClient(
+      mojo::PendingReceiver<mojom::QuicTransportClient> pending_receiver)
+      : receiver_(this, std::move(pending_receiver)) {}
+
+  void WaitUntilMojoConnectionError() {
+    base::RunLoop run_loop;
+
+    receiver_.set_disconnect_handler(run_loop.QuitClosure());
+    run_loop.Run();
+  }
+
+ private:
+  mojo::Receiver<mojom::QuicTransportClient> receiver_;
+};
+
 class QuicTransportTest : public testing::Test {
  public:
   QuicTransportTest()
@@ -187,24 +204,28 @@
   EXPECT_EQ(1u, network_context().NumOpenQuicTransports());
 }
 
-TEST_F(QuicTransportTest, ConnectWithError) {
+TEST_F(QuicTransportTest, ConnectWithWrongOrigin) {
   base::RunLoop run_loop_for_handshake;
   mojo::PendingRemote<mojom::QuicTransportHandshakeClient> handshake_client;
   TestHandshakeClient test_handshake_client(
       handshake_client.InitWithNewPipeAndPassReceiver(),
       run_loop_for_handshake.QuitClosure());
 
-  // This should fail due to the wrong origin
   CreateQuicTransport(GetURL("/discard"),
                       url::Origin::Create(GURL("https://evil.com")),
                       std::move(handshake_client));
 
   run_loop_for_handshake.Run();
 
-  // TODO(vasilvv): This should fail, but now succeeds due to a bug in net/.
   EXPECT_TRUE(test_handshake_client.has_seen_connection_establishment());
   EXPECT_FALSE(test_handshake_client.has_seen_handshake_failure());
   EXPECT_FALSE(test_handshake_client.has_seen_mojo_connection_error());
+
+  // Server resets the connection due to origin mismatch.
+  TestClient client(test_handshake_client.PassClientReceiver());
+  client.WaitUntilMojoConnectionError();
+
+  EXPECT_EQ(0u, network_context().NumOpenQuicTransports());
 }
 
 TEST_F(QuicTransportTest, SendDatagram) {
diff --git a/services/network/test/test_dns_util.cc b/services/network/test/test_dns_util.cc
new file mode 100644
index 0000000..59487d8f
--- /dev/null
+++ b/services/network/test/test_dns_util.cc
@@ -0,0 +1,86 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/test/test_dns_util.h"
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "net/base/host_port_pair.h"
+#include "net/base/net_errors.h"
+#include "net/base/network_isolation_key.h"
+#include "services/network/public/mojom/network_context.mojom.h"
+
+namespace network {
+
+namespace {
+
+// Utility class that waits until a DNS resolve completes, and returns the
+// resulting net::Error code. Expects there to only be one result on success.
+class DnsLookupClient : public network::mojom::ResolveHostClient {
+ public:
+  explicit DnsLookupClient(
+      mojo::PendingReceiver<network::mojom::ResolveHostClient> receiver)
+      : receiver_(this, std::move(receiver)) {
+    receiver_.set_disconnect_handler(base::BindOnce(
+        &DnsLookupClient::OnComplete, base::Unretained(this), net::ERR_FAILED,
+        net::ResolveErrorInfo(net::ERR_FAILED), base::nullopt));
+  }
+  ~DnsLookupClient() override = default;
+
+  DnsLookupClient(const DnsLookupClient&) = delete;
+  DnsLookupClient& operator=(const DnsLookupClient&) = delete;
+
+  DnsLookupResult WaitForResult() {
+    run_loop_.Run();
+    return dns_lookup_result_;
+  }
+
+ private:
+  // network::mojom::ResolveHostClient:
+  void OnComplete(
+      int32_t error,
+      const net::ResolveErrorInfo& resolve_error_info,
+      const base::Optional<net::AddressList>& resolved_addresses) override {
+    receiver_.reset();
+    dns_lookup_result_.error = error;
+    dns_lookup_result_.resolve_error_info = resolve_error_info;
+    dns_lookup_result_.resolved_addresses = resolved_addresses;
+    run_loop_.Quit();
+  }
+  void OnTextResults(const std::vector<std::string>& text_results) override {
+    NOTREACHED();
+  }
+  void OnHostnameResults(const std::vector<net::HostPortPair>& hosts) override {
+    NOTREACHED();
+  }
+
+ private:
+  DnsLookupResult dns_lookup_result_;
+
+  mojo::Receiver<network::mojom::ResolveHostClient> receiver_;
+  base::RunLoop run_loop_;
+};
+
+}  // namespace
+
+DnsLookupResult::DnsLookupResult() = default;
+DnsLookupResult::DnsLookupResult(const DnsLookupResult& dns_lookup_result) =
+    default;
+DnsLookupResult::~DnsLookupResult() = default;
+
+DnsLookupResult BlockingDnsLookup(
+    mojom::NetworkContext* network_context,
+    const net::HostPortPair& host_port_pair,
+    network::mojom::ResolveHostParametersPtr params,
+    const net::NetworkIsolationKey& network_isolation_key) {
+  mojo::PendingRemote<network::mojom::ResolveHostClient> client;
+  DnsLookupClient dns_lookup_client(client.InitWithNewPipeAndPassReceiver());
+  network_context->ResolveHost(host_port_pair, network_isolation_key,
+                               std::move(params), std::move(client));
+  return dns_lookup_client.WaitForResult();
+}
+
+}  // namespace network
diff --git a/services/network/test/test_dns_util.h b/services/network/test/test_dns_util.h
new file mode 100644
index 0000000..c033170
--- /dev/null
+++ b/services/network/test/test_dns_util.h
@@ -0,0 +1,43 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_
+#define SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_
+
+#include <stdint.h>
+
+#include "base/optional.h"
+#include "net/base/address_list.h"
+#include "net/dns/public/resolve_error_info.h"
+#include "services/network/public/mojom/host_resolver.mojom.h"
+
+namespace network {
+
+namespace mojom {
+class NetworkContext;
+}
+
+// Struct containing the results passed to a network::mojom::ResolveHostClient's
+// OnComplete() method.
+struct DnsLookupResult {
+  DnsLookupResult();
+  DnsLookupResult(const DnsLookupResult& dns_lookup_result);
+  ~DnsLookupResult();
+
+  int32_t error;
+  net::ResolveErrorInfo resolve_error_info;
+  base::Optional<net::AddressList> resolved_addresses;
+};
+
+// Test utility function to perform the indicated DNS resolution, and block
+// until complete. Only handles address results.
+DnsLookupResult BlockingDnsLookup(
+    mojom::NetworkContext* network_context,
+    const net::HostPortPair& host_port_pair,
+    network::mojom::ResolveHostParametersPtr params,
+    const net::NetworkIsolationKey& network_isolation_key);
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_TEST_TEST_DNS_UTIL_H_
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 7874c294..94e9588a 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -211,10 +211,6 @@
 #define SK_DISABLE_REDUCE_OPLIST_SPLITTING
 #endif
 
-#ifndef SK_SUPPORT_LEGACY_CANVAS_MATRIX_33
-#define SK_SUPPORT_LEGACY_CANVAS_MATRIX_33
-#endif
-
 #ifndef SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
 #define SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
 #endif
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 6d7747f..c91c0811 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6688,7 +6688,7 @@
           "--browser=android-chromium",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=VizDisplayCompositor,UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode",
           "--dont-restore-color-profile-after-test",
           "--build-revision",
           "${got_revision}",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 3afd653..bc57759 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2100,7 +2100,7 @@
           '${got_revision}',
           '--test-machine-name',
           '${buildername}',
-          '--extra-browser-args=--enable-features=VizDisplayCompositor,UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode',
+          '--extra-browser-args=--enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --force-gpu-rasterization --enable-oop-rasterization --disable-software-compositing-fallback --disable-headless-mode',
         ],
         'precommit_args': [
           # Gerrit issue ID
diff --git a/testing/buildbot/tryserver.devtools-frontend.json b/testing/buildbot/tryserver.devtools-frontend.json
index 805c3ba..823513d 100644
--- a/testing/buildbot/tryserver.devtools-frontend.json
+++ b/testing/buildbot/tryserver.devtools-frontend.json
@@ -55,5 +55,59 @@
         "test_target": "//:blink_web_tests"
       }
     ]
+  },
+  "devtools_frontend_linux_blink_rel": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "--num-retries=3",
+          "--layout-tests-directory=../../third_party/devtools-frontend/src/test/webtests/",
+          "http/tests/devtools"
+        ],
+        "isolate_name": "devtools_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "webkit_layout_from_devtools",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "shards": 4
+        },
+        "test_target": "//:devtools_web_tests"
+      },
+      {
+        "args": [
+          "--num-retries=3"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "webkit_layout_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "shards": 12
+        },
+        "test_target": "//:blink_web_tests"
+      }
+    ]
   }
 }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index fc22554..aea9c83 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -4550,6 +4550,14 @@
           'isolated_scripts': 'devtools_webkit_isolated_scripts',
         },
       },
+      'devtools_frontend_linux_blink_rel': {
+        'mixins': [
+          'linux-xenial',
+        ],
+        'test_suites': {
+          'isolated_scripts': 'devtools_webkit_isolated_scripts',
+        },
+      },
     }
   },
   {
diff --git a/third_party/android_build_tools/aapt2/README.chromium b/third_party/android_build_tools/aapt2/README.chromium
index 247ef7fb..9dd0caad 100644
--- a/third_party/android_build_tools/aapt2/README.chromium
+++ b/third_party/android_build_tools/aapt2/README.chromium
@@ -12,6 +12,4 @@
 distributed here as a CIPD package instead. See cipd.yaml for details.
 
 Local Modifications:
-ToT aapt2 branch:goog/master (@9a7341806913471f2f5ab5b2077ff09cdc9285ec)
-This is after 3.6.0-alpha05 (latest released version at time of cut) but before
-3.7.0-alpha01 (the next major version release).
+Fetched prebuilt from go/aapt2-6089589 (version not yet published to maven).
diff --git a/third_party/blink/perf_tests/resources/runner.js b/third_party/blink/perf_tests/resources/runner.js
index d1a99ac..a162af8f 100644
--- a/third_party/blink/perf_tests/resources/runner.js
+++ b/third_party/blink/perf_tests/resources/runner.js
@@ -177,7 +177,12 @@
         if (test.warmUpCount && test.warmUpCount > 0)
             completedIterations = -test.warmUpCount;
         logLines = PerfTestRunner.bufferedLog || window.testRunner ? [] : null;
-        PerfTestRunner.log("Running " + iterationCount + " times");
+
+        // Tests that run in workers are not impacted by the iteration control.
+        if (!currentTest.runInWorker) {
+            PerfTestRunner.log("Running " + iterationCount + " times");
+        }
+
         if (test.doNotIgnoreInitialRun)
             completedIterations++;
 
@@ -245,7 +250,8 @@
 
     function ignoreWarmUpAndLog(measuredValue) {
         var labeledResult = measuredValue + " " + PerfTestRunner.unit;
-        if (completedIterations <= 0)
+        // Tests that run in workers are not impacted by the iteration control.
+        if (!currentTest.runInWorker && completedIterations <= 0)
             PerfTestRunner.log("Ignoring warm-up run (" + labeledResult + ")");
         else {
             results.push(measuredValue);
@@ -454,5 +460,41 @@
         PerfTestRunner.measureTime(test);
     }
 
+    // Used for tests that run in workers.
+    // 1. Call this method to trigger the test. It should be used together
+    //    with |WorkerTestHelper.measureRunsPerSecond()| which is defined in
+    //    src/third_party/blink/perf_tests/resources/worker-test-helper.js.
+    // 2. The iteration control parameters (test.iterationCount,
+    //    test.doNotIgnoreInitialRun, and test.warmUpCount) are ignored.
+    //    Use parameters of |measureRunsPerSecond()| to control iteration.
+    // 3. Test result should be sent to the page where the test is triggered.
+    //    Then the result should be recorded by |recordResultFromWorker()| to
+    //    finish the test.
+    PerfTestRunner.startMeasureValuesInWorker = function (test) {
+        PerfTestRunner.unit = test.unit;
+        test.runInWorker = true;
+        start(test, undefined, function() { test.run(); });
+    }
+
+    // Used for tests that run in workers.
+    // This method records the result posted from worker thread and finishes the test.
+    PerfTestRunner.recordResultFromWorker = function(result) {
+        if (result.error) {
+            PerfTestRunner.logFatalError(result.error);
+            return;
+        }
+
+        try {
+            result.values.forEach((value) => {
+                ignoreWarmUpAndLog(value);
+            });
+        } catch (exception) {
+            PerfTestRunner.logFatalError("Got an exception while logging the result with name=" + exception.name + ", message=" + exception.message);
+            return;
+        }
+
+        finish();
+    }
+
     window.PerfTestRunner = PerfTestRunner;
 })();
diff --git a/third_party/blink/perf_tests/resources/worker-test-helper.js b/third_party/blink/perf_tests/resources/worker-test-helper.js
new file mode 100644
index 0000000..b1c99dba
--- /dev/null
+++ b/third_party/blink/perf_tests/resources/worker-test-helper.js
@@ -0,0 +1,71 @@
+// This file defines helper methods for running performance tests in workers.
+
+(function () {
+  class WorkerTestHelper {
+    constructor() {
+      this.callsPerIteration = 1;
+    }
+
+    // Measure the runs per second of test.run().
+    // This method should be used together with
+    // |PerfTestRunner.startMeasureValuesInWorker| in
+    // src/third_party/blink/perf_tests/resources/runner.js.
+    //
+    // Arguments:
+    // |test.run| is the function to test.
+    // |test.setup| and |test.tearDown| are optional functions.
+    // |test.iterationCount| defines count of iterations to run. Default value
+    // is 5.
+    //
+    // Returns a promise that resolves to an object:
+    // |result.error|: The error string or null if no error occurs.
+    // |result.values|: An array of test result values.
+    async measureRunsPerSecond(test) {
+      this.test = test;
+      const values = [];
+      const iterationCount =
+          this.test.iterationCount ? this.test.iterationCount : 5;
+
+      try {
+        if (this.test.setup)
+          await this.test.setup();
+        for (let i = 0; i < iterationCount; i++) {
+          values.push(await this.measureRunsPerSecondOnce_());
+        }
+        if (this.test.tearDown)
+          await this.test.tearDown();
+      } catch (exception) {
+        const error = "Got an exception while running test with name=" +
+        exception.name + ", message=" + exception.message + "\n" +
+        exception.stack;
+        return { error: error, values: null };
+      }
+      return { error: null, values: values };
+    }
+
+    // This method is basically the same with measureRunsPerSecondOnce() in
+    // src/third_party/blink/perf_tests/resources/runner.js
+    async measureRunsPerSecondOnce_() {
+      const timeToRun = 750;
+      let totalTime = 0;
+      let numberOfRuns = 0;
+
+      while (totalTime < timeToRun) {
+        totalTime += await this.callRunAndMeasureTime_();
+        numberOfRuns += this.callsPerIteration;
+        if (totalTime < 100)
+          this.callsPerIteration = Math.max(10, 2 * this.callsPerIteration);
+      }
+      return numberOfRuns * 1000 / totalTime;
+    };
+
+    async callRunAndMeasureTime_() {
+      var startTime = performance.now();
+      for (let i = 0; i < this.callsPerIteration; i++) {
+        await this.test.run();
+      }
+      return performance.now() - startTime;
+    }
+  }
+  self.workerTestHelper = new WorkerTestHelper();
+})();
diff --git a/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html
new file mode 100644
index 0000000..e4ab9fe
--- /dev/null
+++ b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-10K.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src='../resources/runner.js'></script>
+</head>
+<body>
+<script>
+
+function runTest() {
+  navigator.serviceWorker.addEventListener('message', (msg) => {
+    PerfTestRunner.recordResultFromWorker(msg.data);
+  });
+
+  const script =
+      '/service_worker/resources/cache-open-add-delete-10K-service-worker.js';
+  const scope = '/service_worker/resources/';
+  navigator.serviceWorker.register(script, { scope: scope }).catch((error) => {
+    PerfTestRunner.logFatalError(
+        'Failed to register service worker script:' + script);
+  });
+  return;
+}
+
+PerfTestRunner.startMeasureValuesInWorker({
+  description: 'Measure performance of open, add and delete operations of' +
+      'cache with 10K sized file',
+  unit: 'runs/s',
+  run: runTest,
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html
new file mode 100644
index 0000000..4b209eed
--- /dev/null
+++ b/third_party/blink/perf_tests/service_worker/cache-open-add-delete-1M.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src='../resources/runner.js'></script>
+</head>
+<body>
+<script>
+
+function runTest() {
+  navigator.serviceWorker.addEventListener('message', (msg) => {
+    PerfTestRunner.recordResultFromWorker(msg.data);
+  });
+
+  const script =
+      '/service_worker/resources/cache-open-add-delete-1M-service-worker.js';
+  const scope = '/service_worker/resources/';
+  navigator.serviceWorker.register(script, { scope: scope }).catch((error) => {
+    PerfTestRunner.logFatalError(
+        'Failed to register service worker script:' + script);
+  });
+  return;
+}
+
+PerfTestRunner.startMeasureValuesInWorker({
+  description: 'Measure performance of open, add and delete operations of' +
+      ' cache with 1M sized file',
+  unit: 'runs/s',
+  run: runTest,
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js
new file mode 100644
index 0000000..4c24094b
--- /dev/null
+++ b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-10K-service-worker.js
@@ -0,0 +1,29 @@
+importScripts('/resources/worker-test-helper.js');
+
+// Send the result to all clients to finish the test.
+function sendTestResultToClients(result) {
+  clients.matchAll({includeUncontrolled: true}).then((allClients) => {
+    for (const client of allClients) {
+      client.postMessage(result);
+    }
+  });
+}
+
+const CACHE_NAME = 'test-cache';
+
+async function cacheOpenAddDelete() {
+  const cache = await caches.open(CACHE_NAME);
+  await cache.add('/service_worker/resources/data/10K.txt');
+  await cache.delete(CACHE_NAME);
+}
+
+async function test() {
+  const result = await self.workerTestHelper.measureRunsPerSecond({
+    run: cacheOpenAddDelete
+  });
+  sendTestResultToClients(result);
+}
+
+self.addEventListener('install', function(event) {
+  event.waitUntil(test());
+});
diff --git a/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js
new file mode 100644
index 0000000..5528bb9
--- /dev/null
+++ b/third_party/blink/perf_tests/service_worker/resources/cache-open-add-delete-1M-service-worker.js
@@ -0,0 +1,29 @@
+importScripts('/resources/worker-test-helper.js');
+
+// Send the result to all clients to finish the test.
+function sendTestResultToClients(result) {
+  clients.matchAll({includeUncontrolled: true}).then((allClients) => {
+    for (const client of allClients) {
+      client.postMessage(result);
+    }
+  });
+}
+
+const CACHE_NAME = 'test-cache';
+
+async function cacheOpenAddDelete() {
+  const cache = await caches.open(CACHE_NAME);
+  await cache.add('/service_worker/resources/data/1M.txt');
+  await cache.delete(CACHE_NAME);
+}
+
+async function test() {
+  const result = await self.workerTestHelper.measureRunsPerSecond({
+    run: cacheOpenAddDelete
+  });
+  sendTestResultToClients(result);
+}
+
+self.addEventListener('install', function(event) {
+  event.waitUntil(test());
+});
diff --git a/third_party/blink/public/common/input/web_keyboard_event.h b/third_party/blink/public/common/input/web_keyboard_event.h
index 5f38e9e..939d2645 100644
--- a/third_party/blink/public/common/input/web_keyboard_event.h
+++ b/third_party/blink/public/common/input/web_keyboard_event.h
@@ -34,7 +34,7 @@
   int native_key_code = 0;
 
   // The DOM code enum of the key pressed as passed by the embedder. DOM code
-  // enums are defined in ui/events/keycodes/dom/keycode_converter_data.inc.
+  // enums are defined in ui/events/keycodes/dom/dom_code_data.inc.
   int dom_code = 0;
 
   // The DOM key enum of the key pressed as passed by the embedder. DOM
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni
index c2e6aa7..07ae9d3 100644
--- a/third_party/blink/renderer/bindings/bindings.gni
+++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -29,7 +29,6 @@
                     "core/v8/custom/v8_event_target_custom.cc",
                     "core/v8/custom/v8_html_all_collection_custom.cc",
                     "core/v8/custom/v8_html_plugin_element_custom.cc",
-                    "core/v8/custom/v8_message_channel_custom.cc",
                     "core/v8/custom/v8_pop_state_event_custom.cc",
                     "core/v8/custom/v8_promise_rejection_event_custom.cc",
                     "core/v8/custom/v8_shadow_root_custom.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc
deleted file mode 100644
index 8a162d0..0000000
--- a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_channel_custom.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_message_channel.h"
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_message_port.h"
-#include "third_party/blink/renderer/core/messaging/message_channel.h"
-#include "third_party/blink/renderer/core/workers/worker_global_scope.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
-
-namespace blink {
-
-const V8PrivateProperty::SymbolKey kPrivatePropertyPort1;
-const V8PrivateProperty::SymbolKey kPrivatePropertyPort2;
-
-void V8MessageChannel::ConstructorCustom(
-    const v8::FunctionCallbackInfo<v8::Value>& info) {
-  v8::Isolate* isolate = info.GetIsolate();
-
-  ExecutionContext* context = CurrentExecutionContext(isolate);
-  auto* channel = MakeGarbageCollected<MessageChannel>(context);
-
-  v8::Local<v8::Object> wrapper = info.Holder();
-
-  // Create references from the MessageChannel wrapper to the two
-  // MessagePort wrappers to make sure that the MessagePort wrappers
-  // stay alive as long as the MessageChannel wrapper is around.
-  V8PrivateProperty::GetSymbol(isolate, kPrivatePropertyPort1)
-      .Set(wrapper, ToV8(channel->port1(), wrapper, isolate));
-  V8PrivateProperty::GetSymbol(isolate, kPrivatePropertyPort2)
-      .Set(wrapper, ToV8(channel->port2(), wrapper, isolate));
-
-  V8SetReturnValue(info, V8DOMWrapper::AssociateObjectWithWrapper(
-                             isolate, channel, GetWrapperTypeInfo(), wrapper));
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc b/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc
index 2582bba8..9ca40f1 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/unpacked_serialized_script_value.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_shared_array_buffer.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
 
@@ -33,11 +34,11 @@
   auto& image_bitmap_contents = value_->image_bitmap_contents_array_;
   if (!image_bitmap_contents.IsEmpty()) {
     image_bitmaps_.Grow(image_bitmap_contents.size());
-    std::transform(image_bitmap_contents.begin(), image_bitmap_contents.end(),
-                   image_bitmaps_.begin(),
-                   [](scoped_refptr<StaticBitmapImage>& contents) {
-                     return ImageBitmap::Create(std::move(contents));
-                   });
+    std::transform(
+        image_bitmap_contents.begin(), image_bitmap_contents.end(),
+        image_bitmaps_.begin(), [](scoped_refptr<StaticBitmapImage>& contents) {
+          return MakeGarbageCollected<ImageBitmap>(std::move(contents));
+        });
     image_bitmap_contents.clear();
   }
 }
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
index cfd4024..f60eb2f 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
@@ -359,8 +359,8 @@
         // been deprecated.
         return nullptr;
       }
-      return ImageBitmap::Create(pixels, width, height, is_premultiplied,
-                                 origin_clean, color_params);
+      return MakeGarbageCollected<ImageBitmap>(
+          pixels, width, height, is_premultiplied, origin_clean, color_params);
     }
     case kImageBitmapTransferTag: {
       uint32_t index = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
index f95c979..991e382 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer_test.cc
@@ -1015,7 +1015,7 @@
   // Make a 10x7 red ImageBitmap.
   sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(10, 7);
   surface->getCanvas()->clear(SK_ColorRED);
-  ImageBitmap* image_bitmap = ImageBitmap::Create(
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
       UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot()));
   ASSERT_TRUE(image_bitmap->BitmapImage());
 
@@ -1047,7 +1047,7 @@
       SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, SkNamedGamut::kDCIP3));
   sk_sp<SkSurface> surface = SkSurface::MakeRaster(info);
   surface->getCanvas()->clear(SK_ColorRED);
-  ImageBitmap* image_bitmap = ImageBitmap::Create(
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
       UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot()));
   ASSERT_TRUE(image_bitmap->BitmapImage());
 
@@ -1283,8 +1283,8 @@
   sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(10, 7);
   surface->getCanvas()->clear(SK_ColorRED);
   sk_sp<SkImage> image = surface->makeImageSnapshot();
-  ImageBitmap* image_bitmap =
-      ImageBitmap::Create(UnacceleratedStaticBitmapImage::Create(image));
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
+      UnacceleratedStaticBitmapImage::Create(image));
   ASSERT_TRUE(image_bitmap->BitmapImage());
 
   v8::Local<v8::Value> wrapper = ToV8(image_bitmap, scope.GetScriptState());
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 6664bb4..aa94f0e 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -1474,7 +1474,8 @@
   DCHECK(To<KeyframeEffect>(content_.Get()));
   DCHECK(std::isfinite(time_offset));
   To<KeyframeEffect>(content_.Get())
-      ->StartAnimationOnCompositor(compositor_group_, start_time, time_offset,
+      ->StartAnimationOnCompositor(compositor_group_, start_time,
+                                   base::TimeDelta::FromSecondsD(time_offset),
                                    EffectivePlaybackRate());
 }
 
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index d7b1abb..be55dbb 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -334,7 +334,8 @@
   }
 
   CompositorTiming out;
-  if (!ConvertTimingForCompositor(timing, 0, out, animation_playback_rate)) {
+  if (!ConvertTimingForCompositor(timing, base::TimeDelta(), out,
+                                  animation_playback_rate)) {
     reasons |= kEffectHasUnsupportedTimingParameters;
   }
 
@@ -440,7 +441,7 @@
     const Element& element,
     int group,
     base::Optional<double> start_time,
-    double time_offset,
+    base::TimeDelta time_offset,
     const Timing& timing,
     const Animation* animation,
     CompositorAnimation& compositor_animation,
@@ -537,7 +538,7 @@
 
 bool CompositorAnimations::ConvertTimingForCompositor(
     const Timing& timing,
-    double time_offset,
+    base::TimeDelta time_offset,
     CompositorTiming& out,
     double animation_playback_rate) {
   timing.AssertValid();
@@ -559,7 +560,7 @@
   out.direction = timing.direction;
   // Compositor's time offset is positive for seeking into the animation.
   out.scaled_time_offset =
-      -timing.start_delay / animation_playback_rate + time_offset;
+      -timing.start_delay / animation_playback_rate + time_offset.InSecondsF();
   out.playback_rate = animation_playback_rate;
   out.fill_mode = timing.fill_mode == Timing::FillMode::AUTO
                       ? Timing::FillMode::NONE
@@ -649,7 +650,7 @@
     const Timing& timing,
     int group,
     base::Optional<double> start_time,
-    double time_offset,
+    base::TimeDelta time_offset,
     const KeyframeEffectModelBase& effect,
     Vector<std::unique_ptr<CompositorKeyframeModel>>& keyframe_models,
     double animation_playback_rate) {
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.h b/third_party/blink/renderer/core/animation/compositor_animations.h
index 33c7f698..091cefe 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.h
+++ b/third_party/blink/renderer/core/animation/compositor_animations.h
@@ -113,7 +113,7 @@
       const Element&,
       int group,
       base::Optional<double> start_time,
-      double time_offset,
+      base::TimeDelta time_offset,
       const Timing&,
       const Animation*,
       CompositorAnimation&,
@@ -141,7 +141,7 @@
   };
 
   static bool ConvertTimingForCompositor(const Timing&,
-                                         double time_offset,
+                                         base::TimeDelta time_offset,
                                          CompositorTiming& out,
                                          double animation_playback_rate);
 
@@ -150,7 +150,7 @@
       const Timing&,
       int group,
       base::Optional<double> start_time,
-      double time_offset,
+      base::TimeDelta time_offset,
       const KeyframeEffectModelBase&,
       Vector<std::unique_ptr<CompositorKeyframeModel>>& animations,
       double animation_playback_rate);
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
index e05f7da7..d2140b3 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -171,7 +171,8 @@
  public:
   bool ConvertTimingForCompositor(const Timing& t,
                                   CompositorAnimations::CompositorTiming& out) {
-    return CompositorAnimations::ConvertTimingForCompositor(t, 0, out, 1);
+    return CompositorAnimations::ConvertTimingForCompositor(
+        t, base::TimeDelta(), out, 1);
   }
 
   CompositorAnimations::FailureReasons CanStartEffectOnCompositor(
@@ -206,8 +207,8 @@
       Vector<std::unique_ptr<CompositorKeyframeModel>>& keyframe_models,
       double animation_playback_rate) {
     CompositorAnimations::GetAnimationOnCompositor(
-        *element_, timing, 0, base::nullopt, 0, effect, keyframe_models,
-        animation_playback_rate);
+        *element_, timing, 0, base::nullopt, base::TimeDelta(), effect,
+        keyframe_models, animation_playback_rate);
   }
 
   CompositorAnimations::FailureReasons
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc
index 108513a..2d0495a 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -330,7 +330,7 @@
 void KeyframeEffect::StartAnimationOnCompositor(
     int group,
     base::Optional<double> start_time,
-    double current_time,
+    base::TimeDelta time_offset,
     double animation_playback_rate,
     CompositorAnimation* compositor_animation) {
   DCHECK(!HasActiveAnimationsOnCompositor());
@@ -345,7 +345,7 @@
   DCHECK(Model());
 
   CompositorAnimations::StartAnimationOnCompositor(
-      *effect_target_, group, start_time, current_time, SpecifiedTiming(),
+      *effect_target_, group, start_time, time_offset, SpecifiedTiming(),
       GetAnimation(), *compositor_animation, *Model(),
       compositor_keyframe_model_ids_, animation_playback_rate);
   DCHECK(!compositor_keyframe_model_ids_.IsEmpty());
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.h b/third_party/blink/renderer/core/animation/keyframe_effect.h
index 4e6139b04..da9d50b 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.h
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.h
@@ -113,7 +113,7 @@
   // Must only be called once.
   void StartAnimationOnCompositor(int group,
                                   base::Optional<double> start_time,
-                                  double time_offset,
+                                  base::TimeDelta time_offset,
                                   double animation_playback_rate,
                                   CompositorAnimation* = nullptr);
   bool HasActiveAnimationsOnCompositor() const;
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 303757f..32ede28 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -342,6 +342,17 @@
     return;
   }
 
+  if (IsA<HTMLSummaryElement>(element)) {
+    // <summary> should be a list item by default, but currently it's a block
+    // and the disclosure symbol is not a ::marker (bug 590014). If an author
+    // specifies 'display: list-item', the <summary> would seem to have two
+    // markers (the real one and the disclosure symbol). To avoid this, compute
+    // to 'display: block'. This adjustment should go away with bug 590014.
+    if (style.Display() == EDisplay::kListItem)
+      style.SetDisplay(EDisplay::kBlock);
+    return;
+  }
+
   if (style.Display() == EDisplay::kContents) {
     // See https://drafts.csswg.org/css-display/#unbox-html
     // Some of these elements are handled with other adjustments above.
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 0a8a8ad..bfb4b28 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -1303,7 +1303,8 @@
   DCHECK(event_target.ToLocalDOMWindow());
 
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state, ImageBitmap::Create(this, crop_rect, options));
+      script_state,
+      MakeGarbageCollected<ImageBitmap>(this, crop_rect, options));
 }
 
 void HTMLCanvasElement::SetOffscreenCanvasResource(
diff --git a/third_party/blink/renderer/core/html/canvas/image_data.cc b/third_party/blink/renderer/core/html/canvas/image_data.cc
index 704e0f29..f1ea89dc 100644
--- a/third_party/blink/renderer/core/html/canvas/image_data.cc
+++ b/third_party/blink/renderer/core/html/canvas/image_data.cc
@@ -570,7 +570,8 @@
                           "The source data has been detached."));
   }
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state, ImageBitmap::Create(this, crop_rect, options));
+      script_state,
+      MakeGarbageCollected<ImageBitmap>(this, crop_rect, options));
 }
 
 v8::Local<v8::Object> ImageData::AssociateWithWrapper(
diff --git a/third_party/blink/renderer/core/html/canvas/image_element_base.cc b/third_party/blink/renderer/core/html/canvas/image_element_base.cc
index 15abb2f3..879613ed 100644
--- a/third_party/blink/renderer/core/html/canvas/image_element_base.cc
+++ b/third_party/blink/renderer/core/html/canvas/image_element_base.cc
@@ -165,7 +165,7 @@
                                     script_state, options);
   }
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state, ImageBitmap::Create(
+      script_state, MakeGarbageCollected<ImageBitmap>(
                         this, crop_rect,
                         event_target.ToLocalDOMWindow()->document(), options));
 }
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
index 0f2a685..93da5c3 100644
--- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
@@ -55,11 +55,9 @@
   return FormControlState(GetElement().checked() ? "on" : "off");
 }
 
-bool BaseCheckableInputType::RestoreFormControlState(
+void BaseCheckableInputType::RestoreFormControlState(
     const FormControlState& state) {
-  bool old_checked = GetElement().checked();
   GetElement().setChecked(state[0] == "on");
-  return old_checked != GetElement().checked();
 }
 
 void BaseCheckableInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
index 8b5fc1b..d9696d3 100644
--- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
@@ -57,7 +57,7 @@
  private:
   InputTypeView* CreateView() override;
   FormControlState SaveFormControlState() const final;
-  bool RestoreFormControlState(const FormControlState&) final;
+  void RestoreFormControlState(const FormControlState&) final;
   void AppendToFormData(FormData&) const final;
   void HandleKeypressEvent(KeyboardEvent&) final;
   bool CanSetStringValue() const final;
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.cc b/third_party/blink/renderer/core/html/forms/file_input_type.cc
index 83eb6be1..5e07aa0 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/file_input_type.cc
@@ -116,11 +116,9 @@
   return state;
 }
 
-bool FileInputType::RestoreFormControlState(const FormControlState& state) {
-  // Check if the state is broken.
-  // See File::AppendToControlState() and File::CreateFromControlState().
+void FileInputType::RestoreFormControlState(const FormControlState& state) {
   if (state.ValueSize() % 3)
-    return false;
+    return;
   HeapVector<Member<File>> file_vector =
       CreateFilesFrom<File*, HeapVector<Member<File>>>(
           state, &File::CreateFromControlState);
@@ -128,9 +126,6 @@
   for (const auto& file : file_vector)
     file_list->Append(file);
   SetFilesAndDispatchEvents(file_list);
-  // This function always returns false because SetFilesAndDispatchEvents()
-  // dispatches events if files are changed.
-  return false;
 }
 
 void FileInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.h b/third_party/blink/renderer/core/html/forms/file_input_type.h
index 9cb288b..256a752 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/file_input_type.h
@@ -67,7 +67,7 @@
   InputTypeView* CreateView() override;
   const AtomicString& FormControlType() const override;
   FormControlState SaveFormControlState() const override;
-  bool RestoreFormControlState(const FormControlState&) override;
+  void RestoreFormControlState(const FormControlState&) override;
   void AppendToFormData(FormData&) const override;
   bool ValueMissing(const String&) const override;
   String ValueMissingText() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
index 7aa11b0..f8f5337 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
@@ -276,17 +276,6 @@
   return isConnected() && ShouldAutocomplete();
 }
 
-void HTMLFormControlElementWithState::QueueInputAndChangeEvents() {
-  auto task_runner = GetDocument().GetTaskRunner(TaskType::kUserInteraction);
-  task_runner->PostTask(
-      FROM_HERE, WTF::Bind(&HTMLFormControlElementWithState::DispatchInputEvent,
-                           WrapWeakPersistent(this)));
-  task_runner->PostTask(
-      FROM_HERE,
-      WTF::Bind(&HTMLFormControlElementWithState::DispatchChangeEvent,
-                WrapWeakPersistent(this)));
-}
-
 void HTMLFormControlElementWithState::DispatchInputEvent() {
   // Legacy 'input' event for forms set value and checked.
   Event* event = Event::CreateBubble(event_type_names::kInput);
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
index 4c5f5b8..c023906 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
@@ -57,8 +57,6 @@
   bool user_has_edited_the_field_ = false;
   HTMLFormControlElementWithState(const QualifiedName& tag_name, Document&);
 
-  void QueueInputAndChangeEvents();
-
   void FinishParsingChildren() override;
   bool IsFormControlElementWithState() const final;
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index bad6851..e25e24fe7 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -584,10 +584,8 @@
 }
 
 void HTMLInputElement::RestoreFormControlState(const FormControlState& state) {
-  if (input_type_view_->RestoreFormControlState(state)) {
-    state_restored_ = true;
-    QueueInputAndChangeEvents();
-  }
+  input_type_view_->RestoreFormControlState(state);
+  state_restored_ = true;
 }
 
 bool HTMLInputElement::CanStartSelection() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index a94e7f8..b25fcd2d 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1187,13 +1187,6 @@
   if (items_size == 0)
     return;
 
-  Vector<bool> old_selection(items_size);
-  for (wtf_size_t i = 0; i < items_size; ++i) {
-    if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get()))
-      old_selection[i] = option->Selected();
-    else
-      old_selection[i] = false;
-  }
   SelectOption(nullptr, kDeselectOtherOptionsFlag);
 
   // The saved state should have at least one value and an index.
@@ -1244,15 +1237,6 @@
   }
 
   SetNeedsValidityCheck();
-
-  for (wtf_size_t i = 0; i < items_size; ++i) {
-    if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get())) {
-      if (old_selection[i] != option->Selected()) {
-        QueueInputAndChangeEvents();
-        break;
-      }
-    }
-  }
 }
 
 void HTMLSelectElement::ParseMultipleAttribute(const AtomicString& value) {
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
index d93d48dd..78a93fe7 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -94,13 +94,7 @@
 
 void HTMLTextAreaElement::RestoreFormControlState(
     const FormControlState& state) {
-  if (EqualIgnoringNullity(value(), state[0]))
-    return;
-  // We don't add kDispatchInputAndChangeEvent to setValue(), and we
-  // post tasks to dispatch events instead. This function can be called
-  // while we should not dispatch any events.
   setValue(state[0]);
-  QueueInputAndChangeEvents();
 }
 
 void HTMLTextAreaElement::ChildrenChanged(const ChildrenChange& change) {
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.cc b/third_party/blink/renderer/core/html/forms/input_type_view.cc
index 5eada37..ed41b3c 100644
--- a/third_party/blink/renderer/core/html/forms/input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/input_type_view.cc
@@ -177,10 +177,8 @@
   return FormControlState(current_value);
 }
 
-bool InputTypeView::RestoreFormControlState(const FormControlState& state) {
-  String old_value = GetElement().value();
+void InputTypeView::RestoreFormControlState(const FormControlState& state) {
   GetElement().setValue(state[0]);
-  return !EqualIgnoringNullity(old_value, GetElement().value());
 }
 
 bool InputTypeView::HasBadInput() const {
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.h b/third_party/blink/renderer/core/html/forms/input_type_view.h
index 5a190e03..ef47dea 100644
--- a/third_party/blink/renderer/core/html/forms/input_type_view.h
+++ b/third_party/blink/renderer/core/html/forms/input_type_view.h
@@ -128,9 +128,7 @@
   virtual void EnsurePrimaryContent() {}
   virtual bool HasFallbackContent() const { return false; }
   virtual FormControlState SaveFormControlState() const;
-  // Should return |true| if the value is changed and the callsite needs to
-  // dispatch 'input' and 'change' events.
-  virtual bool RestoreFormControlState(const FormControlState&);
+  virtual void RestoreFormControlState(const FormControlState&);
 
   // Validation functions
   virtual bool HasBadInput() const;
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
index a30cb0a2..4e2cada7 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -527,18 +527,16 @@
     edit->ReadOnlyStateChanged();
 }
 
-bool MultipleFieldsTemporalInputTypeView::RestoreFormControlState(
+void MultipleFieldsTemporalInputTypeView::RestoreFormControlState(
     const FormControlState& state) {
   DateTimeEditElement* edit = GetDateTimeEditElement();
   if (!edit)
-    return false;
-  String old_value = GetElement().value();
+    return;
   DateTimeFieldsState date_time_fields_state =
       DateTimeFieldsState::RestoreFormControlState(state);
   edit->SetValueAsDateTimeFieldsState(date_time_fields_state);
   GetElement().SetNonAttributeValue(input_type_->SanitizeValue(edit->Value()));
   UpdateClearButtonVisibility();
-  return !EqualIgnoringNullity(old_value, GetElement().value());
 }
 
 FormControlState MultipleFieldsTemporalInputTypeView::SaveFormControlState()
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
index 4e21fa2f..7ec1c40 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
@@ -107,7 +107,7 @@
   void MinOrMaxAttributeChanged() final;
   void ReadonlyAttributeChanged() final;
   void RequiredAttributeChanged() final;
-  bool RestoreFormControlState(const FormControlState&) final;
+  void RestoreFormControlState(const FormControlState&) final;
   FormControlState SaveFormControlState() const final;
   void DidSetValue(const String&, bool value_changed) final;
   void StepAttributeChanged() final;
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc
index aa054d4..171ce120 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -69,10 +69,9 @@
   return FormControlState();
 }
 
-bool PasswordInputType::RestoreFormControlState(const FormControlState&) {
+void PasswordInputType::RestoreFormControlState(const FormControlState&) {
   // Should never save/restore password fields.
   NOTREACHED();
-  return false;
 }
 
 bool PasswordInputType::ShouldRespectListAttribute() {
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h
index 9195e2ae..10804fb4 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -47,7 +47,7 @@
   const AtomicString& FormControlType() const override;
   bool ShouldSaveAndRestoreFormControlState() const override;
   FormControlState SaveFormControlState() const override;
-  bool RestoreFormControlState(const FormControlState&) override;
+  void RestoreFormControlState(const FormControlState&) override;
   bool ShouldRespectListAttribute() override;
 
   bool NeedsContainer() const override;
diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc
index 4c43f28..0e8d812d 100644
--- a/third_party/blink/renderer/core/html/image_document.cc
+++ b/third_party/blink/renderer/core/html/image_document.cc
@@ -174,13 +174,15 @@
         loader->GetTiming().ResponseEnd(),
         GetDocument()->GetTaskRunner(TaskType::kInternalLoading).get());
 
-    GetDocument()->UpdateTitle();
+    if (GetDocument()->CachedImage()) {
+      GetDocument()->UpdateTitle();
 
-    if (IsDetached())
-      return;
+      if (IsDetached())
+        return;
 
-    GetDocument()->ImageUpdated();
-    GetDocument()->ImageLoaded();
+      GetDocument()->ImageUpdated();
+      GetDocument()->ImageLoaded();
+    }
   }
 
   if (!IsDetached()) {
diff --git a/third_party/blink/renderer/core/html/image_document_test.cc b/third_party/blink/renderer/core/html/image_document_test.cc
index d5287ce5..4e41609 100644
--- a/third_party/blink/renderer/core/html/image_document_test.cc
+++ b/third_party/blink/renderer/core/html/image_document_test.cc
@@ -83,6 +83,7 @@
 
   void CreateDocumentWithoutLoadingImage(int view_width, int view_height);
   void CreateDocument(int view_width, int view_height);
+  DocumentParser* StartLoadingImage();
   void LoadImage();
 
   ImageDocument& GetDocument() const;
@@ -126,11 +127,16 @@
   return *image_document;
 }
 
-void ImageDocumentTest::LoadImage() {
+DocumentParser* ImageDocumentTest::StartLoadingImage() {
   DocumentParser* parser = GetDocument().ImplicitOpen(
       ParserSynchronizationPolicy::kForceSynchronousParsing);
   const Vector<unsigned char>& data = JpegImage();
   parser->AppendBytes(reinterpret_cast<const char*>(data.data()), data.size());
+  return parser;
+}
+
+void ImageDocumentTest::LoadImage() {
+  DocumentParser* parser = StartLoadingImage();
   parser->Finish();
 }
 
@@ -223,6 +229,13 @@
   EXPECT_FALSE(GetDocument().GetTiming().DomInteractive().is_null());
 }
 
+TEST_F(ImageDocumentTest, ImageSrcChangedBeforeFinish) {
+  CreateDocumentWithoutLoadingImage(80, 70);
+  DocumentParser* parser = StartLoadingImage();
+  GetDocument().ImageElement()->removeAttribute(html_names::kSrcAttr);
+  parser->Finish();
+}
+
 #if defined(OS_ANDROID)
 #define MAYBE(test) DISABLED_##test
 #else
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc
index b4c0d7be..ceef40f 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -685,7 +685,7 @@
   }
 
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state, ImageBitmap::Create(
+      script_state, MakeGarbageCollected<ImageBitmap>(
                         this, crop_rect,
                         event_target.ToLocalDOMWindow()->document(), options));
 }
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
index 1c81530..3335f1d 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -21,6 +21,7 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
 #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h"
@@ -909,67 +910,6 @@
       -memory_usage_);
 }
 
-ImageBitmap* ImageBitmap::Create(ImageElementBase* image,
-                                 base::Optional<IntRect> crop_rect,
-                                 Document* document,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(image, crop_rect, document, options);
-}
-
-ImageBitmap* ImageBitmap::Create(HTMLVideoElement* video,
-                                 base::Optional<IntRect> crop_rect,
-                                 Document* document,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(video, crop_rect, document, options);
-}
-
-ImageBitmap* ImageBitmap::Create(HTMLCanvasElement* canvas,
-                                 base::Optional<IntRect> crop_rect,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(OffscreenCanvas* offscreen_canvas,
-                                 base::Optional<IntRect> crop_rect,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(offscreen_canvas, crop_rect,
-                                           options);
-}
-
-ImageBitmap* ImageBitmap::Create(ImageData* data,
-                                 base::Optional<IntRect> crop_rect,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(data, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(ImageBitmap* bitmap,
-                                 base::Optional<IntRect> crop_rect,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(bitmap, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image,
-                                 base::Optional<IntRect> crop_rect,
-                                 const ImageBitmapOptions* options) {
-  return MakeGarbageCollected<ImageBitmap>(std::move(image), crop_rect,
-                                           options);
-}
-
-ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image) {
-  return MakeGarbageCollected<ImageBitmap>(std::move(image));
-}
-
-ImageBitmap* ImageBitmap::Create(const void* pixel_data,
-                                 uint32_t width,
-                                 uint32_t height,
-                                 bool is_image_bitmap_premultiplied,
-                                 bool is_image_bitmap_origin_clean,
-                                 const CanvasColorParams& color_params) {
-  return MakeGarbageCollected<ImageBitmap>(
-      pixel_data, width, height, is_image_bitmap_premultiplied,
-      is_image_bitmap_origin_clean, color_params);
-}
-
 void ImageBitmap::ResolvePromiseOnOriginalThread(
     ScriptPromiseResolver* resolver,
     bool origin_clean,
@@ -1091,7 +1031,7 @@
 
 // static
 ImageBitmap* ImageBitmap::Take(ScriptPromiseResolver*, sk_sp<SkImage> image) {
-  return ImageBitmap::Create(
+  return MakeGarbageCollected<ImageBitmap>(
       UnacceleratedStaticBitmapImage::Create(std::move(image)));
 }
 
@@ -1150,7 +1090,8 @@
     base::Optional<IntRect> crop_rect,
     const ImageBitmapOptions* options) {
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state, Create(this, crop_rect, options));
+      script_state,
+      MakeGarbageCollected<ImageBitmap>(this, crop_rect, options));
 }
 
 scoped_refptr<Image> ImageBitmap::GetSourceImageForCanvas(
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
index f4fde0b..485f878 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.h
@@ -40,48 +40,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static ImageBitmap* Create(
-      ImageElementBase*,
-      base::Optional<IntRect>,
-      Document*,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(
-      HTMLVideoElement*,
-      base::Optional<IntRect>,
-      Document*,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(
-      HTMLCanvasElement*,
-      base::Optional<IntRect>,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(
-      OffscreenCanvas*,
-      base::Optional<IntRect>,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(
-      ImageData*,
-      base::Optional<IntRect>,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(
-      ImageBitmap*,
-      base::Optional<IntRect>,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  static ImageBitmap* Create(scoped_refptr<StaticBitmapImage>);
-  static ImageBitmap* Create(
-      scoped_refptr<StaticBitmapImage>,
-      base::Optional<IntRect>,
-      const ImageBitmapOptions* = ImageBitmapOptions::Create());
-  // This function is called by structured-cloning an ImageBitmap.
-  // isImageBitmapPremultiplied indicates whether the original ImageBitmap is
-  // premultiplied or not.
-  // isImageBitmapOriginClean indicates whether the original ImageBitmap is
-  // origin clean or not.
-  static ImageBitmap* Create(const void* pixel_data,
-                             uint32_t width,
-                             uint32_t height,
-                             bool is_image_bitmap_premultiplied,
-                             bool is_image_bitmap_origin_clean,
-                             const CanvasColorParams&);
   static ScriptPromise CreateAsync(
       ImageElementBase*,
       base::Optional<IntRect>,
@@ -93,23 +51,32 @@
   ImageBitmap(ImageElementBase*,
               base::Optional<IntRect>,
               Document*,
-              const ImageBitmapOptions*);
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
   ImageBitmap(HTMLVideoElement*,
               base::Optional<IntRect>,
               Document*,
-              const ImageBitmapOptions*);
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
   ImageBitmap(HTMLCanvasElement*,
               base::Optional<IntRect>,
-              const ImageBitmapOptions*);
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
   ImageBitmap(OffscreenCanvas*,
               base::Optional<IntRect>,
-              const ImageBitmapOptions*);
-  ImageBitmap(ImageData*, base::Optional<IntRect>, const ImageBitmapOptions*);
-  ImageBitmap(ImageBitmap*, base::Optional<IntRect>, const ImageBitmapOptions*);
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
+  ImageBitmap(ImageData*,
+              base::Optional<IntRect>,
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
+  ImageBitmap(ImageBitmap*,
+              base::Optional<IntRect>,
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
   ImageBitmap(scoped_refptr<StaticBitmapImage>);
   ImageBitmap(scoped_refptr<StaticBitmapImage>,
               base::Optional<IntRect>,
-              const ImageBitmapOptions*);
+              const ImageBitmapOptions* = ImageBitmapOptions::Create());
+  // This constructor may called by structured-cloning an ImageBitmap.
+  // isImageBitmapPremultiplied indicates whether the original ImageBitmap is
+  // premultiplied or not.
+  // isImageBitmapOriginClean indicates whether the original ImageBitmap is
+  // origin clean or not.
   ImageBitmap(const void* pixel_data,
               uint32_t width,
               uint32_t height,
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
index 4379d184..2b8b55a810 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
@@ -369,7 +369,8 @@
   scoped_refptr<StaticBitmapImage> image =
       UnacceleratedStaticBitmapImage::Create(std::move(frame));
   image->SetOriginClean(true);
-  ImageBitmap* image_bitmap = ImageBitmap::Create(image, crop_rect_, options_);
+  auto* image_bitmap =
+      MakeGarbageCollected<ImageBitmap>(image, crop_rect_, options_);
   if (image_bitmap && image_bitmap->BitmapImage()) {
     resolver_->Resolve(image_bitmap);
   } else {
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
index da835fe..f3b1a97 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
@@ -118,27 +118,27 @@
 
   base::Optional<IntRect> crop_rect =
       IntRect(0, 0, image_->width(), image_->height());
-  ImageBitmap* image_bitmap_no_crop =
-      ImageBitmap::Create(image_element, crop_rect,
-                          &(image_element->GetDocument()), default_options);
+  auto* image_bitmap_no_crop = MakeGarbageCollected<ImageBitmap>(
+      image_element, crop_rect, &(image_element->GetDocument()),
+      default_options);
   ASSERT_TRUE(image_bitmap_no_crop);
   crop_rect = IntRect(image_->width() / 2, image_->height() / 2,
                       image_->width() / 2, image_->height() / 2);
-  ImageBitmap* image_bitmap_interior_crop =
-      ImageBitmap::Create(image_element, crop_rect,
-                          &(image_element->GetDocument()), default_options);
+  auto* image_bitmap_interior_crop = MakeGarbageCollected<ImageBitmap>(
+      image_element, crop_rect, &(image_element->GetDocument()),
+      default_options);
   ASSERT_TRUE(image_bitmap_interior_crop);
   crop_rect = IntRect(-image_->width() / 2, -image_->height() / 2,
                       image_->width(), image_->height());
-  ImageBitmap* image_bitmap_exterior_crop =
-      ImageBitmap::Create(image_element, crop_rect,
-                          &(image_element->GetDocument()), default_options);
+  auto* image_bitmap_exterior_crop = MakeGarbageCollected<ImageBitmap>(
+      image_element, crop_rect, &(image_element->GetDocument()),
+      default_options);
   ASSERT_TRUE(image_bitmap_exterior_crop);
   crop_rect = IntRect(-image_->width(), -image_->height(), image_->width(),
                       image_->height());
-  ImageBitmap* image_bitmap_outside_crop =
-      ImageBitmap::Create(image_element, crop_rect,
-                          &(image_element->GetDocument()), default_options);
+  auto* image_bitmap_outside_crop = MakeGarbageCollected<ImageBitmap>(
+      image_element, crop_rect, &(image_element->GetDocument()),
+      default_options);
   ASSERT_TRUE(image_bitmap_outside_crop);
 
   ASSERT_EQ(image_bitmap_no_crop->BitmapImage()
@@ -190,7 +190,7 @@
   const ImageBitmapOptions* default_options = ImageBitmapOptions::Create();
   base::Optional<IntRect> crop_rect =
       IntRect(0, 0, image_->width(), image_->height());
-  ImageBitmap* image_bitmap = ImageBitmap::Create(
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
       image, crop_rect, &(image->GetDocument()), default_options);
   ASSERT_TRUE(image_bitmap);
   ASSERT_EQ(
@@ -247,7 +247,7 @@
     IntRect& rect,
     ImageBitmapOptions* options,
     bool is_texture_backed) {
-  ImageBitmap* image_bitmap = ImageBitmap::Create(bitmap, rect, options);
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(bitmap, rect, options);
   EXPECT_TRUE(image_bitmap);
   EXPECT_EQ(image_bitmap->BitmapImage()->IsTextureBacked(), is_texture_backed);
 }
@@ -264,7 +264,7 @@
   scoped_refptr<StaticBitmapImage> bitmap = resource_provider->Snapshot();
   ASSERT_TRUE(bitmap->IsTextureBacked());
 
-  ImageBitmap* image_bitmap = ImageBitmap::Create(bitmap);
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(bitmap);
   EXPECT_TRUE(image_bitmap);
   EXPECT_TRUE(image_bitmap->BitmapImage()->IsTextureBacked());
 
@@ -341,7 +341,7 @@
     options->setColorSpaceConversion(
         ColorCorrectionTestUtils::ColorSpaceConversionToString(
             static_cast<ColorSpaceConversion>(conversion_iterator)));
-    ImageBitmap* image_bitmap = ImageBitmap::Create(
+    auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
         image_element, crop_rect, &(image_element->GetDocument()), options);
     ASSERT_TRUE(image_bitmap);
     sk_sp<SkImage> converted_image =
@@ -400,7 +400,7 @@
   options->setColorSpaceConversion(
       ColorCorrectionTestUtils::ColorSpaceConversionToString(
           kColorSpaceConversion_Preserve));
-  ImageBitmap* source_image_bitmap = ImageBitmap::Create(
+  auto* source_image_bitmap = MakeGarbageCollected<ImageBitmap>(
       UnacceleratedStaticBitmapImage::Create(source_image), crop_rect, options);
   ASSERT_TRUE(source_image_bitmap);
 
@@ -410,8 +410,8 @@
     options->setColorSpaceConversion(
         ColorCorrectionTestUtils::ColorSpaceConversionToString(
             static_cast<ColorSpaceConversion>(conversion_iterator)));
-    ImageBitmap* image_bitmap =
-        ImageBitmap::Create(source_image_bitmap, crop_rect, options);
+    auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(source_image_bitmap,
+                                                           crop_rect, options);
     ASSERT_TRUE(image_bitmap);
     sk_sp<SkImage> converted_image =
         image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage();
@@ -473,7 +473,7 @@
     options->setColorSpaceConversion(
         ColorCorrectionTestUtils::ColorSpaceConversionToString(
             static_cast<ColorSpaceConversion>(conversion_iterator)));
-    ImageBitmap* image_bitmap = ImageBitmap::Create(
+    auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
         UnacceleratedStaticBitmapImage::Create(source_image), crop_rect,
         options);
     ASSERT_TRUE(image_bitmap);
@@ -539,8 +539,8 @@
     options->setColorSpaceConversion(
         ColorCorrectionTestUtils::ColorSpaceConversionToString(
             static_cast<ColorSpaceConversion>(conversion_iterator)));
-    ImageBitmap* image_bitmap =
-        ImageBitmap::Create(image_data, crop_rect, options);
+    auto* image_bitmap =
+        MakeGarbageCollected<ImageBitmap>(image_data, crop_rect, options);
     ASSERT_TRUE(image_bitmap);
     sk_sp<SkImage> converted_image =
         image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage();
@@ -587,8 +587,8 @@
 
   // source: uint8, bitmap pixel format: default
   ImageBitmapOptions* options = ImageBitmapOptions::Create();
-  ImageBitmap* image_bitmap =
-      ImageBitmap::Create(bitmap_image, bitmap_image->Rect(), options);
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
+      bitmap_image, bitmap_image->Rect(), options);
 
   ASSERT_TRUE(image_bitmap);
   sk_sp<SkImage> sk_image_internal =
@@ -597,8 +597,8 @@
 
   // source: uint8, bitmap pixel format: uint8
   options->setImagePixelFormat("uint8");
-  ImageBitmap* image_bitmap_8888 =
-      ImageBitmap::Create(bitmap_image, bitmap_image->Rect(), options);
+  auto* image_bitmap_8888 = MakeGarbageCollected<ImageBitmap>(
+      bitmap_image, bitmap_image->Rect(), options);
   ASSERT_TRUE(image_bitmap_8888);
   sk_sp<SkImage> sk_image_internal_8888 = image_bitmap_8888->BitmapImage()
                                               ->PaintImageForCurrentFrame()
@@ -621,7 +621,7 @@
 
   // source: f16, bitmap pixel format: default
   ImageBitmapOptions* options_f16 = ImageBitmapOptions::Create();
-  ImageBitmap* image_bitmap_f16 = ImageBitmap::Create(
+  auto* image_bitmap_f16 = MakeGarbageCollected<ImageBitmap>(
       bitmap_image_f16, bitmap_image_f16->Rect(), options_f16);
   ASSERT_TRUE(image_bitmap_f16);
   sk_sp<SkImage> sk_image_internal_f16 =
@@ -630,7 +630,7 @@
 
   // source: f16, bitmap pixel format: uint8
   options_f16->setImagePixelFormat("uint8");
-  ImageBitmap* image_bitmap_f16_8888 = ImageBitmap::Create(
+  auto* image_bitmap_f16_8888 = MakeGarbageCollected<ImageBitmap>(
       bitmap_image_f16, bitmap_image_f16->Rect(), options_f16);
   ASSERT_TRUE(image_bitmap_f16_8888);
   sk_sp<SkImage> sk_image_internal_f16_8888 =
@@ -661,7 +661,7 @@
   options->setColorSpaceConversion(
       ColorCorrectionTestUtils::ColorSpaceConversionToString(
           kColorSpaceConversion_Default));
-  ImageBitmap* image_bitmap = ImageBitmap::Create(
+  auto* image_bitmap = MakeGarbageCollected<ImageBitmap>(
       image_data, IntRect(IntPoint(0, 0), image_data->Size()), options);
   DCHECK(image_bitmap);
 }
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 985ecec8..c11aa24 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2365,7 +2365,9 @@
   CHECK(IsInLayoutNGInlineFormattingContext()) << *this;
   DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
   DCHECK_NE(index, 0u);
-  first_fragment_item_index_ = index;
+  // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|,
+  // we should enable below.
+  // first_fragment_item_index_ = index;
 }
 
 void LayoutBox::InLayoutNGInlineFormattingContextWillChange(bool new_value) {
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index 383705c..33064e0 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -171,7 +171,9 @@
   CHECK(IsInLayoutNGInlineFormattingContext()) << *this;
   DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
   DCHECK_NE(index, 0u);
-  first_fragment_item_index_ = index;
+  // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|,
+  // we should enable below.
+  // first_fragment_item_index_ = index;
 }
 
 void LayoutInline::InLayoutNGInlineFormattingContextWillChange(bool new_value) {
diff --git a/third_party/blink/renderer/core/layout/layout_object_test.cc b/third_party/blink/renderer/core/layout/layout_object_test.cc
index 87b11ab..bc06001 100644
--- a/third_party/blink/renderer/core/layout/layout_object_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_test.cc
@@ -1064,7 +1064,8 @@
   UpdateAllLifecyclePhasesForTest();
 }
 
-TEST_F(LayoutObjectTest, NeedsLayoutOverflowRecalc) {
+// TODO(rego): Test is failing until we can fix https://crbug.com/941180.
+TEST_F(LayoutObjectTest, DISABLED_NeedsLayoutOverflowRecalc) {
   if (!RuntimeEnabledFeatures::LayoutNGEnabled())
     return;
 
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc
index e9082e4..94d232c 100644
--- a/third_party/blink/renderer/core/layout/layout_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -222,13 +222,20 @@
       for (InlineTextBox* box : TextBoxes())
         box->Remove();
     } else {
-      if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) {
+      if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
+        if (has_abstract_inline_text_box_)
+          ClearFirstInlineFragmentItemIndex();
+      } else if (NGPaintFragment* first_inline_fragment =
+                     FirstInlineFragment()) {
         first_inline_fragment->LayoutObjectWillBeDestroyed();
         SetFirstInlineFragment(nullptr);
       }
       if (Parent())
         Parent()->DirtyLinesFromChangedChild(this);
     }
+  } else if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
+    if (has_abstract_inline_text_box_)
+      ClearFirstInlineFragmentItemIndex();
   } else if (NGPaintFragment* first_inline_fragment = FirstInlineFragment()) {
     // Still do this to clear the global hash map in  NGAbstractInlineTextBox.
     SetFirstInlineFragment(nullptr);
@@ -266,7 +273,20 @@
 
 void LayoutText::DeleteTextBoxes() {
   if (!IsInLayoutNGInlineFormattingContext())
-    MutableTextBoxes().DeleteLineBoxes();
+    return MutableTextBoxes().DeleteLineBoxes();
+  DetachAbstractInlineTextBoxesIfNeeded();
+}
+
+void LayoutText::DetachAbstractInlineTextBoxesIfNeeded() {
+  // TODO(layout-dev): Because We should call |WillDestroy()| once for
+  // associated fragments, when you reuse fragments, you should construct
+  // NGAbstractInlineTextBox for them.
+  if (!has_abstract_inline_text_box_)
+    return;
+  NGInlineCursor cursor;
+  for (cursor.MoveTo(*this); cursor; cursor.MoveToNextForSameLayoutObject())
+    NGAbstractInlineTextBox::WillDestroy(cursor);
+  has_abstract_inline_text_box_ = false;
 }
 
 void LayoutText::SetFirstInlineFragment(NGPaintFragment* first_fragment) {
@@ -275,20 +295,14 @@
   // |!fragment|.
   DCHECK(!first_fragment ||
          !RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
-  // TODO(layout-dev): Because We should call |WillDestroy()| once for
-  // associated fragments, when you reuse fragments, you should construct
-  // NGAbstractInlineTextBox for them.
-  if (has_abstract_inline_text_box_) {
-    for (NGPaintFragment* fragment : NGPaintFragment::InlineFragmentsFor(this))
-      NGAbstractInlineTextBox::WillDestroy(fragment);
-    has_abstract_inline_text_box_ = false;
-  }
+  DetachAbstractInlineTextBoxesIfNeeded();
   first_paint_fragment_ = first_fragment;
 }
 
 void LayoutText::ClearFirstInlineFragmentItemIndex() {
   CHECK(IsInLayoutNGInlineFormattingContext()) << *this;
   DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
+  DetachAbstractInlineTextBoxesIfNeeded();
   first_fragment_item_index_ = 0u;
 }
 
@@ -297,7 +311,10 @@
   // TODO(yosin): Call |NGAbstractInlineTextBox::WillDestroy()|.
   DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
   DCHECK_NE(index, 0u);
-  first_fragment_item_index_ = index;
+  DetachAbstractInlineTextBoxesIfNeeded();
+  // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|,
+  // we should enable below.
+  // first_fragment_item_index_ = index;
 }
 
 void LayoutText::InLayoutNGInlineFormattingContextWillChange(bool new_value) {
@@ -306,6 +323,10 @@
   // Because |first_paint_fragment_| and |text_boxes_| are union, when one is
   // deleted, the other should be initialized to nullptr.
   DCHECK(new_value ? !first_paint_fragment_ : !text_boxes_.First());
+
+  // Because there are no inline boxes associated to this text, we should not
+  // have abstract inline text boxes too.
+  DCHECK(!has_abstract_inline_text_box_);
 }
 
 Vector<LayoutText::TextBoxInfo> LayoutText::GetTextBoxInfo() const {
@@ -2420,12 +2441,10 @@
 }
 
 scoped_refptr<AbstractInlineTextBox> LayoutText::FirstAbstractInlineTextBox() {
-  if (RuntimeEnabledFeatures::LayoutNGEnabled()) {
-    auto fragments = NGPaintFragment::InlineFragmentsFor(this);
-    if (!fragments.IsEmpty() &&
-        fragments.IsInLayoutNGInlineFormattingContext()) {
-      return NGAbstractInlineTextBox::GetOrCreate(fragments.front());
-    }
+  if (IsInLayoutNGInlineFormattingContext()) {
+    NGInlineCursor cursor;
+    cursor.MoveTo(*this);
+    return NGAbstractInlineTextBox::GetOrCreate(cursor);
   }
   return LegacyAbstractInlineTextBox::GetOrCreate(LineLayoutText(this),
                                                   FirstTextBox());
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h
index 3548afa..e5659229 100644
--- a/third_party/blink/renderer/core/layout/layout_text.h
+++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -439,6 +439,7 @@
 
  private:
   ContentCaptureManager* GetContentCaptureManager();
+  void DetachAbstractInlineTextBoxesIfNeeded();
 
   // Used for LayoutNG with accessibility. True if inline fragments are
   // associated to |NGAbstractInlineTextBox|.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc
index bd55b43..1be6411 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_test.cc
@@ -153,6 +153,21 @@
             GetItemsAsString(*text.GetLayoutObject()));
 }
 
+// http://crbug.com/1039143
+TEST_F(LayoutNGTextTest, SetTextWithOffsetDeleteWithBidiControl) {
+  if (!RuntimeEnabledFeatures::LayoutNGEnabled())
+    return;
+
+  // In text content, we have bidi control codes:
+  // U+2066 U+2069 \n U+2066 abc U+2066
+  SetBodyInnerHTML(u"<pre><b id=target dir=ltr>\nabc</b></pre>");
+  Text& text = To<Text>(*GetElementById("target")->firstChild());
+  text.deleteData(0, 1, ASSERT_NO_EXCEPTION);  // remove "\n"
+
+  EXPECT_EQ("LayoutText has NeedsCollectInlines",
+            GetItemsAsString(*text.GetLayoutObject()));
+}
+
 TEST_F(LayoutNGTextTest, SetTextWithOffsetInsert) {
   if (!RuntimeEnabledFeatures::LayoutNGEnabled())
     return;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc
index 8a5f0a7..f832d0b 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.cc
@@ -5,7 +5,10 @@
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h"
 
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h"
 #include "third_party/blink/renderer/core/paint/ng/ng_paint_fragment.h"
@@ -16,38 +19,86 @@
 
 namespace blink {
 
-NGAbstractInlineTextBox::FragmentToNGAbstractInlineTextBoxHashMap*
-    NGAbstractInlineTextBox::g_abstract_inline_text_box_map_ = nullptr;
+namespace {
+
+// Mapping from NGFragmentItem/NGPaintFragment to NGAbstractInlineTextBox
+// TODO(yosin): Once we get rid of |NGPaintFragment|, we should not use
+// template class for |NGAbstractInlineTextBoxCache|.
+template <typename Fragment>
+class NGAbstractInlineTextBoxCache final {
+ public:
+  static scoped_refptr<AbstractInlineTextBox> GetOrCreate(
+      const Fragment& fragment) {
+    if (!s_instance_)
+      s_instance_ = new NGAbstractInlineTextBoxCache();
+    return s_instance_->GetOrCreateInternal(fragment);
+  }
+
+  static void WillDestroy(const Fragment* fragment) {
+    if (!s_instance_)
+      return;
+    s_instance_->WillDestroyInternal(fragment);
+  }
+
+ private:
+  scoped_refptr<AbstractInlineTextBox> GetOrCreateInternal(
+      const Fragment& fragment) {
+    const auto it = map_.find(&fragment);
+    LayoutText* const layout_text =
+        ToLayoutText(fragment.GetMutableLayoutObject());
+    if (it != map_.end()) {
+      CHECK(layout_text->HasAbstractInlineTextBox());
+      return it->value;
+    }
+    scoped_refptr<AbstractInlineTextBox> obj = base::AdoptRef(
+        new NGAbstractInlineTextBox(LineLayoutText(layout_text), fragment));
+    map_.Set(&fragment, obj);
+    layout_text->SetHasAbstractInlineTextBox();
+    return obj;
+  }
+
+  void WillDestroyInternal(const Fragment* fragment) {
+    const auto it = map_.find(fragment);
+    if (it == map_.end())
+      return;
+    it->value->Detach();
+    map_.erase(fragment);
+  }
+
+  static NGAbstractInlineTextBoxCache* s_instance_;
+
+  HashMap<const Fragment*, scoped_refptr<AbstractInlineTextBox>> map_;
+};
+
+template <typename Fragment>
+NGAbstractInlineTextBoxCache<Fragment>*
+    NGAbstractInlineTextBoxCache<Fragment>::s_instance_ = nullptr;
+
+}  // namespace
 
 scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::GetOrCreate(
-    const NGPaintFragment& fragment) {
-  DCHECK(fragment.GetLayoutObject()->IsText()) << fragment.GetLayoutObject();
-  if (!g_abstract_inline_text_box_map_) {
-    g_abstract_inline_text_box_map_ =
-        new FragmentToNGAbstractInlineTextBoxHashMap();
+    const NGInlineCursor& cursor) {
+  if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) {
+    return NGAbstractInlineTextBoxCache<NGPaintFragment>::GetOrCreate(
+        *paint_fragment);
   }
-  const auto it = g_abstract_inline_text_box_map_->find(&fragment);
-  LayoutText* const layout_text =
-      ToLayoutText(fragment.GetMutableLayoutObject());
-  if (it != g_abstract_inline_text_box_map_->end()) {
-    CHECK(layout_text->HasAbstractInlineTextBox());
-    return it->value;
+  if (const NGFragmentItem* fragment_item = cursor.CurrentItem()) {
+    return NGAbstractInlineTextBoxCache<NGFragmentItem>::GetOrCreate(
+        *fragment_item);
   }
-  scoped_refptr<AbstractInlineTextBox> obj = base::AdoptRef(
-      new NGAbstractInlineTextBox(LineLayoutText(layout_text), fragment));
-  g_abstract_inline_text_box_map_->Set(&fragment, obj);
-  layout_text->SetHasAbstractInlineTextBox();
-  return obj;
+  return nullptr;
 }
 
-void NGAbstractInlineTextBox::WillDestroy(NGPaintFragment* fragment) {
-  if (!g_abstract_inline_text_box_map_)
-    return;
-  const auto it = g_abstract_inline_text_box_map_->find(fragment);
-  if (it != g_abstract_inline_text_box_map_->end()) {
-    it->value->Detach();
-    g_abstract_inline_text_box_map_->erase(fragment);
+void NGAbstractInlineTextBox::WillDestroy(const NGInlineCursor& cursor) {
+  if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) {
+    return NGAbstractInlineTextBoxCache<NGPaintFragment>::WillDestroy(
+        paint_fragment);
   }
+  if (const NGFragmentItem* fragment_item = cursor.CurrentItem()) {
+    return NGAbstractInlineTextBoxCache<NGFragmentItem>::WillDestroy(
+        fragment_item);
+  }
+  NOTREACHED();
 }
 
 NGAbstractInlineTextBox::NGAbstractInlineTextBox(
@@ -57,6 +108,13 @@
   DCHECK(fragment_->PhysicalFragment().IsText()) << fragment_;
 }
 
+NGAbstractInlineTextBox::NGAbstractInlineTextBox(
+    LineLayoutText line_layout_item,
+    const NGFragmentItem& fragment_item)
+    : AbstractInlineTextBox(line_layout_item), fragment_item_(&fragment_item) {
+  DCHECK(fragment_item_->IsText()) << fragment_item_;
+}
+
 NGAbstractInlineTextBox::~NGAbstractInlineTextBox() {
   DCHECK(!fragment_);
 }
@@ -70,107 +128,126 @@
   fragment_ = nullptr;
 }
 
-const NGPhysicalTextFragment& NGAbstractInlineTextBox::PhysicalTextFragment()
-    const {
-  return To<NGPhysicalTextFragment>(fragment_->PhysicalFragment());
+NGInlineCursor NGAbstractInlineTextBox::GetCursor() const {
+  if (!fragment_item_)
+    return NGInlineCursor();
+  NGInlineCursor cursor;
+  if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())
+    cursor.MoveTo(*fragment_item_);
+  else
+    cursor.MoveTo(*fragment_);
+  DCHECK(!cursor.CurrentLayoutObject()->NeedsLayout());
+  return cursor;
 }
 
-bool NGAbstractInlineTextBox::NeedsLayout() const {
-  return fragment_->GetLayoutObject()->NeedsLayout();
+NGInlineCursor NGAbstractInlineTextBox::GetCursorOnLine() const {
+  NGInlineCursor current = GetCursor();
+  NGInlineCursor line_box = current;
+  line_box.MoveToContainingLine();
+  NGInlineCursor cursor = line_box.CursorForDescendants();
+  cursor.MoveTo(current);
+  return cursor;
+}
+
+String NGAbstractInlineTextBox::GetTextContent() const {
+  const NGInlineCursor& cursor = GetCursor();
+  if (cursor.IsGeneratedTextType())
+    return cursor.CurrentText().ToString();
+  if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) {
+    return To<NGPhysicalTextFragment>(paint_fragment->PhysicalFragment())
+        .TextContent();
+  }
+  return cursor.Items().Text(cursor.UsesFirstLineStyle());
 }
 
 bool NGAbstractInlineTextBox::NeedsTrailingSpace() const {
-  if (!fragment_->Style().CollapseWhiteSpace())
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor.CurrentStyle().CollapseWhiteSpace())
     return false;
-  const NGPaintFragment& line_box = *fragment_->ContainerLineBox();
-  if (!To<NGPhysicalLineBoxFragment>(line_box.PhysicalFragment())
-           .HasSoftWrapToNextLine())
+  NGInlineCursor line_box = cursor;
+  line_box.MoveToContainingLine();
+  if (!line_box.HasSoftWrapToNextLine())
     return false;
-  const NGPhysicalTextFragment& text_fragment = PhysicalTextFragment();
-  if (text_fragment.EndOffset() >= text_fragment.TextContent().length())
+  const String text_content = GetTextContent();
+  const unsigned end_offset = cursor.CurrentTextEndOffset();
+  if (end_offset >= text_content.length())
     return false;
-  if (text_fragment.TextContent()[text_fragment.EndOffset()] != ' ')
+  if (text_content[end_offset] != ' ')
     return false;
-  const NGInlineBreakToken& break_token = *To<NGInlineBreakToken>(
-      To<NGPhysicalLineBoxFragment>(line_box.PhysicalFragment()).BreakToken());
+  const NGInlineBreakToken& break_token = line_box.CurrentInlineBreakToken();
   // TODO(yosin): We should support OOF fragments between |fragment_| and
   // break token.
-  if (break_token.TextOffset() != text_fragment.EndOffset() + 1)
+  if (break_token.TextOffset() != end_offset + 1)
     return false;
   // Check a character in text content after |fragment_| comes from same
   // layout text of |fragment_|.
-  const NGOffsetMapping* mapping =
-      NGOffsetMapping::GetFor(fragment_->GetLayoutObject());
+  const LayoutObject* const layout_object = cursor.CurrentLayoutObject();
+  const NGOffsetMapping* mapping = NGOffsetMapping::GetFor(layout_object);
   // TODO(kojii): There's not much we can do for dirty-tree. crbug.com/946004
   if (!mapping)
     return false;
   const base::span<const NGOffsetMappingUnit> mapping_units =
-      mapping->GetMappingUnitsForTextContentOffsetRange(
-          text_fragment.EndOffset(), text_fragment.EndOffset() + 1);
+      mapping->GetMappingUnitsForTextContentOffsetRange(end_offset,
+                                                        end_offset + 1);
   if (mapping_units.begin() == mapping_units.end())
     return false;
   const NGOffsetMappingUnit& mapping_unit = mapping_units.front();
-  return mapping_unit.GetLayoutObject() == fragment_->GetLayoutObject();
-}
-
-const NGPaintFragment*
-NGAbstractInlineTextBox::NextTextFragmentForSameLayoutObject() const {
-  const auto fragments =
-      NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject());
-  const auto it =
-      std::find_if(fragments.begin(), fragments.end(),
-                   [&](const auto& sibling) { return fragment_ == sibling; });
-  DCHECK(it != fragments.end());
-  const auto next_it = std::next(it);
-  return next_it == fragments.end() ? nullptr : *next_it;
+  return mapping_unit.GetLayoutObject() == layout_object;
 }
 
 scoped_refptr<AbstractInlineTextBox>
 NGAbstractInlineTextBox::NextInlineTextBox() const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return nullptr;
-  DCHECK(!NeedsLayout());
-  const NGPaintFragment* next_fragment = NextTextFragmentForSameLayoutObject();
-  if (!next_fragment)
+  NGInlineCursor next;
+  next.MoveTo(*cursor.CurrentLayoutObject());
+  while (next != cursor)
+    next.MoveToNextForSameLayoutObject();
+  next.MoveToNextForSameLayoutObject();
+  if (!next)
     return nullptr;
-  return GetOrCreate(*next_fragment);
+  return GetOrCreate(next);
 }
 
 LayoutRect NGAbstractInlineTextBox::LocalBounds() const {
-  if (!fragment_ || !GetLineLayoutItem())
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return LayoutRect();
-  return LayoutRect(fragment_->InlineOffsetToContainerBox().ToLayoutPoint(),
-                    fragment_->Size().ToLayoutSize());
+  return cursor.CurrentRect().ToLayoutRect();
 }
 
 unsigned NGAbstractInlineTextBox::Len() const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return 0;
   if (NeedsTrailingSpace())
-    return PhysicalTextFragment().TextLength() + 1;
-  return PhysicalTextFragment().TextLength();
+    return cursor.CurrentText().length() + 1;
+  return cursor.CurrentText().length();
 }
 
 unsigned NGAbstractInlineTextBox::TextOffsetInContainer(unsigned offset) const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return 0;
-  return PhysicalTextFragment().StartOffset() + offset;
+  return cursor.CurrentTextStartOffset() + offset;
 }
 
 AbstractInlineTextBox::Direction NGAbstractInlineTextBox::GetDirection() const {
-  if (!fragment_ || !GetLineLayoutItem())
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return kLeftToRight;
-  const TextDirection text_direction =
-      PhysicalTextFragment().ResolvedDirection();
+  const TextDirection text_direction = cursor.CurrentResolvedDirection();
   if (GetLineLayoutItem().Style()->IsHorizontalWritingMode())
     return IsLtr(text_direction) ? kLeftToRight : kRightToLeft;
   return IsLtr(text_direction) ? kTopToBottom : kBottomToTop;
 }
 
 void NGAbstractInlineTextBox::CharacterWidths(Vector<float>& widths) const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return;
-  if (!PhysicalTextFragment().TextShapeResult()) {
+  if (!cursor.CurrentTextShapeResult()) {
     // When |fragment_| for BR, we don't have shape result.
     // "aom-computed-boolean-properties.html" reaches here.
     widths.resize(Len());
@@ -178,8 +255,7 @@
   }
   // TODO(layout-dev): Add support for IndividualCharacterRanges to
   // ShapeResultView to avoid the copy below.
-  auto shape_result =
-      PhysicalTextFragment().TextShapeResult()->CreateShapeResult();
+  auto shape_result = cursor.CurrentTextShapeResult()->CreateShapeResult();
   Vector<CharacterRange> ranges;
   shape_result->IndividualCharacterRanges(&ranges);
   widths.ReserveCapacity(ranges.size());
@@ -193,10 +269,11 @@
 }
 
 String NGAbstractInlineTextBox::GetText() const {
-  if (!fragment_ || !GetLineLayoutItem())
-    return String();
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
+    return g_empty_string;
 
-  String result = PhysicalTextFragment().Text().ToString();
+  String result = cursor.CurrentText().ToString();
 
   // For compatibility with |InlineTextBox|, we should have a space character
   // for soft line break.
@@ -217,56 +294,51 @@
 }
 
 bool NGAbstractInlineTextBox::IsFirst() const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return true;
-  DCHECK(!NeedsLayout());
-  const auto fragments =
-      NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject());
-  return fragment_ == &fragments.front();
+  NGInlineCursor first_fragment;
+  first_fragment.MoveTo(*cursor.CurrentLayoutObject());
+  return cursor == first_fragment;
 }
 
 bool NGAbstractInlineTextBox::IsLast() const {
-  if (!fragment_)
+  const NGInlineCursor& cursor = GetCursor();
+  if (!cursor)
     return true;
-  DCHECK(!NeedsLayout());
-  const auto fragments =
-      NGPaintFragment::InlineFragmentsFor(fragment_->GetLayoutObject());
-  return fragment_ == &fragments.back();
+  NGInlineCursor last_fragment;
+  last_fragment.MoveTo(*cursor.CurrentLayoutObject());
+  last_fragment.MoveToLastForSameLayoutObject();
+  return cursor == last_fragment;
 }
 
 scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::NextOnLine()
     const {
-  if (!fragment_)
+  NGInlineCursor cursor = GetCursorOnLine();
+  if (!cursor)
     return nullptr;
-  DCHECK(!NeedsLayout());
-  DCHECK(fragment_->ContainerLineBox());
-  NGPaintFragmentTraversal cursor(*fragment_->ContainerLineBox(), *fragment_);
-  for (cursor.MoveToNext(); !cursor.IsAtEnd(); cursor.MoveToNext()) {
-    if (cursor->GetLayoutObject()->IsText())
-      return GetOrCreate(*cursor);
+  for (cursor.MoveToNext(); cursor; cursor.MoveToNext()) {
+    if (cursor.CurrentLayoutObject()->IsText())
+      return GetOrCreate(cursor);
   }
   return nullptr;
 }
 
 scoped_refptr<AbstractInlineTextBox> NGAbstractInlineTextBox::PreviousOnLine()
     const {
-  if (!fragment_)
+  NGInlineCursor cursor = GetCursorOnLine();
+  if (!cursor)
     return nullptr;
-  DCHECK(!NeedsLayout());
-  DCHECK(fragment_->ContainerLineBox());
-  NGPaintFragmentTraversal cursor(*fragment_->ContainerLineBox(), *fragment_);
-  for (cursor.MoveToPrevious(); !cursor.IsAtEnd(); cursor.MoveToPrevious()) {
-    if (cursor->GetLayoutObject()->IsText())
-      return GetOrCreate(*cursor);
+  for (cursor.MoveToPrevious(); cursor; cursor.MoveToPrevious()) {
+    if (cursor.CurrentLayoutObject()->IsText())
+      return GetOrCreate(cursor);
   }
   return nullptr;
 }
 
 bool NGAbstractInlineTextBox::IsLineBreak() const {
-  if (!fragment_)
-    return false;
-  DCHECK(!NeedsLayout());
-  return PhysicalTextFragment().IsLineBreak();
+  const NGInlineCursor& cursor = GetCursor();
+  return cursor && cursor.IsLineBreak();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h
index 1f1d57d..7b49310e 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h
@@ -9,34 +9,35 @@
 
 namespace blink {
 
+class NGFragmentItem;
+class NGInlineCursor;
 class NGPaintFragment;
-class NGPhysicalTextFragment;
 
 // The implementation of |AbstractInlineTextBox| for LayoutNG.
 // See also |LegacyAbstractInlineTextBox| for legacy layout.
 class CORE_EXPORT NGAbstractInlineTextBox final : public AbstractInlineTextBox {
  private:
   // Returns existing or newly created |NGAbstractInlineTextBox|.
-  // * |fragment| should be attached to |NGPhysicalTextFragment|.
+  // * |cursor| should be attached to |NGPhysicalTextFragment|.
   static scoped_refptr<AbstractInlineTextBox> GetOrCreate(
-      const NGPaintFragment& fragment);
-  static void WillDestroy(NGPaintFragment*);
+      const NGInlineCursor& cursor);
+  static void WillDestroy(const NGInlineCursor& cursor);
 
   friend class LayoutText;
-  friend class NGPaintFragment;
 
  public:
+  NGAbstractInlineTextBox(LineLayoutText line_layout_item,
+                          const NGPaintFragment& fragment);
+  NGAbstractInlineTextBox(LineLayoutText line_layout_item,
+                          const NGFragmentItem& fragment);
+
   ~NGAbstractInlineTextBox() final;
 
  private:
-  NGAbstractInlineTextBox(LineLayoutText line_layout_item,
-                          const NGPaintFragment& fragment);
-
-  const NGPhysicalTextFragment& PhysicalTextFragment() const;
-  bool NeedsLayout() const;
+  NGInlineCursor GetCursor() const;
+  NGInlineCursor GetCursorOnLine() const;
+  String GetTextContent() const;
   bool NeedsTrailingSpace() const;
-  // Returns next fragment associated to |LayoutText|.
-  const NGPaintFragment* NextTextFragmentForSameLayoutObject() const;
 
   // Implementations of AbstractInlineTextBox member functions.
   void Detach() final;
@@ -53,12 +54,10 @@
   scoped_refptr<AbstractInlineTextBox> PreviousOnLine() const final;
   bool IsLineBreak() const final;
 
-  const NGPaintFragment* fragment_;
-
-  using FragmentToNGAbstractInlineTextBoxHashMap =
-      HashMap<const NGPaintFragment*, scoped_refptr<AbstractInlineTextBox>>;
-  static FragmentToNGAbstractInlineTextBoxHashMap*
-      g_abstract_inline_text_box_map_;
+  union {
+    const NGPaintFragment* fragment_;
+    const NGFragmentItem* fragment_item_;
+  };
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
index 37edfc10..c8b43e8 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
@@ -16,7 +16,7 @@
 
 NGFragmentItem::NGFragmentItem(const NGPhysicalTextFragment& text)
     : layout_object_(text.GetLayoutObject()),
-      text_({text.TextShapeResult(), text.StartOffset(), text.EndOffset()}),
+      text_({text.TextShapeResult(), text.TextOffset()}),
       rect_({PhysicalOffset(), text.Size()}),
       type_(kText),
       sub_type_(static_cast<unsigned>(text.TextType())),
@@ -25,11 +25,10 @@
       is_hidden_for_paint_(text.IsHiddenForPaint()),
       text_direction_(static_cast<unsigned>(text.ResolvedDirection())),
       ink_overflow_computed_(false) {
-  DCHECK_LE(text_.start_offset, text_.end_offset);
 #if DCHECK_IS_ON()
   if (text_.shape_result) {
-    DCHECK_EQ(text_.shape_result->StartIndex(), text_.start_offset);
-    DCHECK_EQ(text_.shape_result->EndIndex(), text_.end_offset);
+    DCHECK_EQ(text_.shape_result->StartIndex(), StartOffset());
+    DCHECK_EQ(text_.shape_result->EndIndex(), EndOffset());
   }
 #endif
   if (text.TextType() == NGPhysicalTextFragment::kGeneratedText) {
@@ -201,29 +200,19 @@
   return nullptr;
 }
 
-unsigned NGFragmentItem::StartOffset() const {
+NGTextOffset NGFragmentItem::TextOffset() const {
   if (Type() == kText)
-    return text_.start_offset;
+    return text_.text_offset;
   if (Type() == kGeneratedText)
-    return 0;
+    return {0, generated_text_.text.length()};
   NOTREACHED();
-  return 0;
-}
-
-unsigned NGFragmentItem::EndOffset() const {
-  if (Type() == kText)
-    return text_.end_offset;
-  if (Type() == kGeneratedText)
-    return generated_text_.text.length();
-  NOTREACHED();
-  return 0;
+  return {};
 }
 
 StringView NGFragmentItem::Text(const NGFragmentItems& items) const {
   if (Type() == kText) {
-    DCHECK_LE(text_.start_offset, text_.end_offset);
-    return StringView(items.Text(UsesFirstLineStyle()), text_.start_offset,
-                      text_.end_offset - text_.start_offset);
+    return StringView(items.Text(UsesFirstLineStyle()), text_.text_offset.start,
+                      text_.text_offset.Length());
   }
   if (Type() == kGeneratedText)
     return GeneratedText();
@@ -234,8 +223,8 @@
 NGTextFragmentPaintInfo NGFragmentItem::TextPaintInfo(
     const NGFragmentItems& items) const {
   if (Type() == kText) {
-    return {items.Text(UsesFirstLineStyle()), text_.start_offset,
-            text_.end_offset, text_.shape_result.get()};
+    return {items.Text(UsesFirstLineStyle()), text_.text_offset.start,
+            text_.text_offset.end, text_.shape_result.get()};
   }
   if (Type() == kGeneratedText) {
     return {generated_text_.text, 0, generated_text_.text.length(),
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
index 7cee04b..bd4ebd7 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_height_metrics.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h"
 #include "third_party/blink/renderer/platform/graphics/paint/display_item_client.h"
 
@@ -33,8 +34,7 @@
     // TODO(kojii): |start_offset| and |end_offset| should match to the offset
     // in |shape_result|. Consider if we should remove them, or if keeping them
     // is easier.
-    const unsigned start_offset;
-    const unsigned end_offset;
+    const NGTextOffset text_offset;
   };
   // Represents text generated by the layout engine, e.g., hyphen or ellipsis.
   struct GeneratedTextItem {
@@ -164,8 +164,6 @@
     return nullptr;
   }
 
-  NGTextFragmentPaintInfo TextPaintInfo(const NGFragmentItems& items) const;
-
   // DisplayItemClient overrides
   String DebugName() const override;
   IntRect VisualRect() const override;
@@ -299,15 +297,16 @@
   }
 
   const ShapeResultView* TextShapeResult() const;
-
-  unsigned StartOffset() const;
-  unsigned EndOffset() const;
-  unsigned TextLength() const { return EndOffset() - StartOffset(); }
+  NGTextOffset TextOffset() const;
+  unsigned StartOffset() const { return TextOffset().start; }
+  unsigned EndOffset() const { return TextOffset().end; }
+  unsigned TextLength() const { return TextOffset().Length(); }
   StringView Text(const NGFragmentItems& items) const;
   String GeneratedText() const {
     DCHECK_EQ(Type(), kGeneratedText);
     return generated_text_.text;
   }
+  NGTextFragmentPaintInfo TextPaintInfo(const NGFragmentItems& items) const;
 
   // Compute the inline position from text offset, in logical coordinate
   // relative to this fragment.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
index fa1d73a..0edf78c 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -221,9 +221,7 @@
     DCHECK(layout_object->IsInLayoutNGInlineFormattingContext()) << item;
     auto insert_result = last_fragment_map.insert(layout_object, index);
     if (insert_result.is_new_entry) {
-      // TDOO(yosin): Once we update all |LayoutObject::FirstInlineFragment()|,
-      // we should enable below.
-      // layout_object->SetFirstInlineFragmentItemIndex(index);
+      layout_object->SetFirstInlineFragmentItemIndex(index);
       continue;
     }
     const wtf_size_t last_index = insert_result.stored_value->value;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
index 0e8ccb3..54cbc22 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -535,10 +535,10 @@
   if (current_paint_fragment_) {
     const auto& text_fragment =
         To<NGPhysicalTextFragment>(current_paint_fragment_->PhysicalFragment());
-    return {text_fragment.StartOffset(), text_fragment.EndOffset()};
+    return text_fragment.TextOffset();
   }
   if (current_item_)
-    return {current_item_->StartOffset(), current_item_->EndOffset()};
+    return current_item_->TextOffset();
   NOTREACHED();
   return {};
 }
@@ -724,6 +724,17 @@
     MoveToNext();
 }
 
+void NGInlineCursor::MoveTo(const NGFragmentItem& fragment_item) {
+  DCHECK(!root_paint_fragment_ && !current_paint_fragment_);
+  MoveTo(*fragment_item.GetLayoutObject());
+  while (IsNotNull()) {
+    if (CurrentItem() == &fragment_item)
+      return;
+    MoveToNext();
+  }
+  NOTREACHED();
+}
+
 void NGInlineCursor::MoveTo(const NGInlineCursor& cursor) {
   if (const NGPaintFragment* paint_fragment = cursor.CurrentPaintFragment()) {
     MoveTo(*paint_fragment);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
index 1bb12a8..f56d621 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
@@ -175,11 +175,15 @@
   // text and atomic inline. It is also error to call |IsGeneratedTextType()|.
   UBiDiLevel CurrentBidiLevel() const;
 
+  // Returns break token for line box. It is error to call other than line box.
+  const NGInlineBreakToken& CurrentInlineBreakToken() const;
+
   // Returns text direction of current text or atomic inline. It is error to
   // call at other than text or atomic inline. Note: <span> doesn't have
   // reserved direction.
   TextDirection CurrentResolvedDirection() const;
   const ComputedStyle& CurrentStyle() const;
+  bool UsesFirstLineStyle() const;
 
   // InkOverflow of itself, including contents if they contribute to the ink
   // overflow of this object (e.g. when not clipped,) in the local coordinate.
@@ -226,6 +230,9 @@
   // Functions to move the current position.
   //
 
+  // Move the current position at |fragment_item|.
+  void MoveTo(const NGFragmentItem& fragment_item);
+
   // Move the current position at |cursor|. Unlinke copy constrcutr, this
   // function doesn't copy root. Note: The current position in |cursor|
   // should be part of |this| cursor.
@@ -256,6 +263,9 @@
   // See also |TryToMoveToFirstChild()|.
   void MoveToLastChild();
 
+  // Move the current position to the last fragment on same layout object.
+  void MoveToLastForSameLayoutObject();
+
   // Move to last logical leaf of current line box. If current line box has
   // no children, curosr becomes null.
   void MoveToLastLogicalLeaf();
@@ -308,12 +318,8 @@
   // NextSkippingChildren, Previous, etc.
 
  private:
-  // Returns break token for line box. It is error to call other than line box.
-  const NGInlineBreakToken& CurrentInlineBreakToken() const;
-
   // Returns style variant of the current position.
   NGStyleVariant CurrentStyleVariant() const;
-  bool UsesFirstLineStyle() const;
 
   // True if current position is part of culled inline box |layout_inline|.
   bool IsPartOfCulledInlineBox(const LayoutInline& layout_inline) const;
@@ -329,9 +335,6 @@
   // Move the cursor position to the first fragment in tree.
   void MoveToFirst();
 
-  // Move the current position to the last fragment on same layout object.
-  void MoveToLastForSameLayoutObject();
-
   // Same as |MoveTo()| but not support culled inline.
   void InternalMoveTo(const LayoutObject& layout_object);
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
index 419b2a1..5846660 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -528,6 +528,11 @@
     if (layout_text_.StyleRef().TextSecurity() != ETextSecurity::kNone)
       return nullptr;
 
+    // It is hard to figure differences of bidi control codes before/after
+    // editing. See http://crbug.com/1039143
+    if (layout_text_.HasBidiControlInlineItems())
+      return nullptr;
+
     // Note: We should compute offset mapping before calling
     // |LayoutBlockFlow::TakeNGInlineNodeData()|
     const NGOffsetMapping* const offset_mapping =
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc
index 0ce9cc6..6ee489c 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc
@@ -46,11 +46,10 @@
           kFragmentText,
           source.TextType()),
       text_(source.text_),
-      start_offset_(start_offset),
-      end_offset_(end_offset),
+      text_offset_(start_offset, end_offset),
       shape_result_(std::move(shape_result)) {
-  DCHECK_GE(start_offset_, source.StartOffset());
-  DCHECK_LE(end_offset_, source.EndOffset());
+  DCHECK_GE(text_offset_.start, source.StartOffset());
+  DCHECK_LE(text_offset_.end, source.EndOffset());
   DCHECK(shape_result_ || IsFlowControl()) << *this;
   is_generated_text_ = source.is_generated_text_;
   ink_overflow_computed_ = false;
@@ -59,8 +58,7 @@
 NGPhysicalTextFragment::NGPhysicalTextFragment(NGTextFragmentBuilder* builder)
     : NGPhysicalFragment(builder, kFragmentText, builder->text_type_),
       text_(builder->text_),
-      start_offset_(builder->start_offset_),
-      end_offset_(builder->end_offset_),
+      text_offset_({builder->start_offset_, builder->end_offset_}),
       shape_result_(std::move(builder->shape_result_)) {
   DCHECK(shape_result_ || IsFlowControl()) << *this;
   is_generated_text_ = builder->IsGeneratedText();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h
index 731450a9..00e8ef2 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_PHYSICAL_TEXT_FRAGMENT_H_
 
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_ink_overflow.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h"
 #include "third_party/blink/renderer/platform/fonts/ng_text_fragment_paint_info.h"
@@ -70,18 +71,19 @@
 
   bool IsSymbolMarker() const { return TextType() == kSymbolMarker; }
 
-  unsigned TextLength() const { return end_offset_ - start_offset_; }
-  StringView Text() const {
-    return StringView(text_, start_offset_, TextLength());
-  }
   const String& TextContent() const { return text_; }
 
   // ShapeResult may be nullptr if |IsFlowControl()|.
   const ShapeResultView* TextShapeResult() const { return shape_result_.get(); }
 
   // Start/end offset to the text of the block container.
-  unsigned StartOffset() const { return start_offset_; }
-  unsigned EndOffset() const { return end_offset_; }
+  const NGTextOffset& TextOffset() const { return text_offset_; }
+  unsigned StartOffset() const { return text_offset_.start; }
+  unsigned EndOffset() const { return text_offset_.end; }
+  unsigned TextLength() const { return text_offset_.Length(); }
+  StringView Text() const {
+    return StringView(text_, text_offset_.start, TextLength());
+  }
 
   WritingMode GetWritingMode() const { return Style().GetWritingMode(); }
   bool IsHorizontal() const {
@@ -141,8 +143,7 @@
   const String text_;
 
   // Start and end offset of the parent block text.
-  const unsigned start_offset_;
-  const unsigned end_offset_;
+  const NGTextOffset text_offset_;
   const scoped_refptr<const ShapeResultView> shape_result_;
 
   // Fragments are immutable but allow certain expensive data, specifically ink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h b/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h
index e8132013..0d6c7251 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_text_offset.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_TEXT_OFFSET_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_TEXT_OFFSET_H_
 
+#include "base/logging.h"
 #include "third_party/blink/renderer/core/core_export.h"
 
 namespace blink {
@@ -13,10 +14,13 @@
 struct CORE_EXPORT NGTextOffset {
   NGTextOffset() = default;
   NGTextOffset(unsigned start, unsigned end) : start(start), end(end) {
-    DCHECK_GE(end, start);
+    AssertValid();
   }
 
-  unsigned Length() const { return end - start; }
+  unsigned Length() const {
+    AssertValid();
+    return end - start;
+  }
 
   void AssertValid() const { DCHECK_GE(end, start); }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 794cd5e..57bd319d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -896,7 +896,9 @@
 
     // |ComputeOverflow()| below calls |AddVisualOverflowFromChildren()|, which
     // computes visual overflow from |RootInlineBox| if |ChildrenInline()|
-    block->SetNeedsVisualOverflowAndPaintInvalidation();
+    // TODO(rego): This causes that ChildNeedsLayoutOverflowRecalc flags are not
+    // cleared after layout (see https://crbug.com/941180).
+    block->SetNeedsOverflowRecalc();
     block->ComputeLayoutOverflow(intrinsic_block_size - borders.block_end -
                                  scrollbars.block_end);
   }
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index 3ea0a06..0cd852e 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -265,10 +265,7 @@
     RespectImageOrientationEnum should_respect_image_orientation) const {
   if (!image_)
     return IntSize();
-  if (should_respect_image_orientation == kRespectImageOrientation &&
-      image_->IsBitmapImage())
-    return ToBitmapImage(image_.get())->SizeRespectingOrientation();
-  return image_->Size();
+  return image_->Size(should_respect_image_orientation);
 }
 
 void ImageResourceContent::NotifyObservers(
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc
index b29bbeae..f92ff31 100644
--- a/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc
+++ b/third_party/blink/renderer/core/messaging/blink_transferable_message_mojom_traits_test.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 
 namespace blink {
@@ -122,7 +123,7 @@
 ImageBitmap* CreateBitmap() {
   sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(8, 4);
   surface->getCanvas()->clear(SK_ColorRED);
-  return ImageBitmap::Create(
+  return MakeGarbageCollected<ImageBitmap>(
       UnacceleratedStaticBitmapImage::Create(surface->makeImageSnapshot()));
 }
 
@@ -178,8 +179,8 @@
   ASSERT_EQ(out.message->GetImageBitmapContentsArray().size(), 1U);
   scoped_refptr<blink::StaticBitmapImage> deserialized_bitmap_contents =
       out.message->GetImageBitmapContentsArray()[0];
-  ImageBitmap* deserialized_bitmap =
-      ImageBitmap::Create(std::move(deserialized_bitmap_contents));
+  auto* deserialized_bitmap = MakeGarbageCollected<ImageBitmap>(
+      std::move(deserialized_bitmap_contents));
   ASSERT_EQ(deserialized_bitmap->height(), original_bitmap_height);
   ASSERT_EQ(deserialized_bitmap->width(), original_bitmap_width);
   // When using WrapAsMessage, the deserialized bitmap should own
diff --git a/third_party/blink/renderer/core/messaging/message_channel.h b/third_party/blink/renderer/core/messaging/message_channel.h
index 45fea2f..4ebbcc2 100644
--- a/third_party/blink/renderer/core/messaging/message_channel.h
+++ b/third_party/blink/renderer/core/messaging/message_channel.h
@@ -40,6 +40,10 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  static MessageChannel* Create(ExecutionContext* execution_context) {
+    return MakeGarbageCollected<MessageChannel>(execution_context);
+  }
+
   explicit MessageChannel(ExecutionContext*);
 
   MessagePort* port1() const { return port1_; }
diff --git a/third_party/blink/renderer/core/messaging/message_channel.idl b/third_party/blink/renderer/core/messaging/message_channel.idl
index ec70529..3990768 100644
--- a/third_party/blink/renderer/core/messaging/message_channel.idl
+++ b/third_party/blink/renderer/core/messaging/message_channel.idl
@@ -27,10 +27,9 @@
 // https://html.spec.whatwg.org/C/#message-channels
 
 [
-    Exposed=(Window,Worker),
-    Measure
+    Exposed=(Window, Worker)
 ] interface MessageChannel {
-    [Custom] constructor();
+    [CallWith=ExecutionContext, Measure] constructor();
     readonly attribute MessagePort port1;
     readonly attribute MessagePort port2;
 };
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
index 7a309ad..ffe91141 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -224,8 +224,9 @@
   if (context_)
     context_->FinalizeFrame();
   return ImageBitmapSource::FulfillImageBitmap(
-      script_state,
-      IsPaintable() ? ImageBitmap::Create(this, crop_rect, options) : nullptr);
+      script_state, IsPaintable() ? MakeGarbageCollected<ImageBitmap>(
+                                        this, crop_rect, options)
+                                  : nullptr);
 }
 
 bool OffscreenCanvas::IsOpaque() const {
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc
index 38bf217..c9525304 100644
--- a/third_party/blink/renderer/core/page/drag_controller.cc
+++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -1073,25 +1073,17 @@
       interpolation_quality = kInterpolationNone;
   }
 
-  RespectImageOrientationEnum should_respect_image_orientation =
+  RespectImageOrientationEnum respect_image_orientation =
       LayoutObject::ShouldRespectImageOrientation(element->GetLayoutObject());
-  ImageOrientation orientation;
 
-  if (should_respect_image_orientation == kRespectImageOrientation &&
-      image->IsBitmapImage())
-    orientation = ToBitmapImage(image)->CurrentFrameOrientation();
-
-  IntSize image_size = orientation.UsesWidthAsHeight()
-                           ? image->Size().TransposedSize()
-                           : image->Size();
-
+  IntSize image_size = image->Size(respect_image_orientation);
   FloatSize image_scale =
       DragImage::ClampedImageScale(image_size, image_element_size_in_pixels,
                                    MaxDragImageSize(device_scale_factor));
 
   if (image_size.Area() <= kMaxOriginalImageArea &&
       (drag_image = DragImage::Create(
-           image, should_respect_image_orientation, device_scale_factor,
+           image, respect_image_orientation, device_scale_factor,
            interpolation_quality, kDragImageAlpha, image_scale))) {
     IntSize original_size = image_element_size_in_pixels;
     origin = image_element_location;
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc
index 4bdeb41..6abea27 100644
--- a/third_party/blink/renderer/core/paint/box_painter_base.cc
+++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -558,9 +558,7 @@
   const FloatSize intrinsic_tile_size =
       !has_intrinsic_size
           ? image_tile.Size()
-          : FloatSize(info.respect_image_orientation && image->IsBitmapImage()
-                          ? ToBitmapImage(image)->SizeRespectingOrientation()
-                          : image->Size());
+          : FloatSize(image->Size(info.respect_image_orientation));
   // Subset computation needs the same location as was used with
   // ComputePhaseForBackground above, but needs the unsnapped destination
   // size to correctly calculate sprite subsets in the presence of zoom. But if
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
index 8d5848d..84a3aec 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -781,7 +781,9 @@
 }
 
 const NGPaintFragment* NGPaintFragment::Root() const {
-  DCHECK(PhysicalFragment().IsInline());
+  // Because of this function can be called during |LayoutObject::Destroy()|,
+  // we use |physical_fragment_| to avoid calling |IsAlive()|.
+  DCHECK(physical_fragment_->IsInline());
   const NGPaintFragment* root = this;
   for (const NGPaintFragment* fragment :
        NGPaintFragmentTraversal::InclusiveAncestorsOf(*this)) {
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 2a4e27a..ea5741e1 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -1681,14 +1681,6 @@
   }
 }
 
-static bool ImageWasTransposed(const LayoutImage& layout_image,
-                               const Image& image) {
-  return LayoutObject::ShouldRespectImageOrientation(&layout_image) ==
-             kRespectImageOrientation &&
-         image.IsBitmapImage() &&
-         ToBitmapImage(image).CurrentFrameOrientation().UsesWidthAsHeight();
-}
-
 static AffineTransform RectToRect(const FloatRect& src_rect,
                                   const FloatRect& dst_rect) {
   float x_scale = dst_rect.Width() / src_rect.Width();
@@ -1717,9 +1709,9 @@
       scoped_refptr<Image> image =
           layout_image.ImageResource()->GetImage(replaced_rect.Size());
       if (image && !image->IsNull()) {
-        IntRect src_rect = image->Rect();
-        if (ImageWasTransposed(layout_image, *image))
-          src_rect = src_rect.TransposedRect();
+        IntRect src_rect(
+            IntPoint(), image->Size(LayoutObject::ShouldRespectImageOrientation(
+                            &layout_image)));
         content_to_parent_space =
             RectToRect(FloatRect(src_rect), FloatRect(replaced_rect));
       }
diff --git a/third_party/blink/renderer/core/streams/underlying_sink_base.h b/third_party/blink/renderer/core/streams/underlying_sink_base.h
index 900dcbf..5e2a020 100644
--- a/third_party/blink/renderer/core/streams/underlying_sink_base.h
+++ b/third_party/blink/renderer/core/streams/underlying_sink_base.h
@@ -13,6 +13,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ScriptValue;
 class ScriptState;
 
@@ -26,22 +27,29 @@
   // |controller| and are called from IDL. Also we define virtual |start| and
   // |write| which take WritableStreamDefaultController.
   virtual ScriptPromise start(ScriptState*,
-                              WritableStreamDefaultController*) = 0;
+                              WritableStreamDefaultController*,
+                              ExceptionState&) = 0;
   virtual ScriptPromise write(ScriptState*,
                               ScriptValue chunk,
-                              WritableStreamDefaultController*) = 0;
-  virtual ScriptPromise close(ScriptState*) = 0;
-  virtual ScriptPromise abort(ScriptState*, ScriptValue reason) = 0;
+                              WritableStreamDefaultController*,
+                              ExceptionState&) = 0;
+  virtual ScriptPromise close(ScriptState*, ExceptionState&) = 0;
+  virtual ScriptPromise abort(ScriptState*,
+                              ScriptValue reason,
+                              ExceptionState&) = 0;
 
-  ScriptPromise start(ScriptState* script_state, ScriptValue controller) {
+  ScriptPromise start(ScriptState* script_state,
+                      ScriptValue controller,
+                      ExceptionState& exception_state) {
     controller_ = WritableStreamDefaultController::From(controller);
-    return start(script_state, controller_);
+    return start(script_state, controller_, exception_state);
   }
   ScriptPromise write(ScriptState* script_state,
                       ScriptValue chunk,
-                      ScriptValue controller) {
+                      ScriptValue controller,
+                      ExceptionState& exception_state) {
     DCHECK(controller_);
-    return write(script_state, chunk, controller_);
+    return write(script_state, chunk, controller_, exception_state);
   }
 
   void Trace(Visitor* visitor) override {
diff --git a/third_party/blink/renderer/core/streams/underlying_sink_base.idl b/third_party/blink/renderer/core/streams/underlying_sink_base.idl
index 288fd47..250a8ac 100644
--- a/third_party/blink/renderer/core/streams/underlying_sink_base.idl
+++ b/third_party/blink/renderer/core/streams/underlying_sink_base.idl
@@ -10,8 +10,8 @@
     NoInterfaceObject
 ]
 interface UnderlyingSinkBase {
-    [CallWith=ScriptState] Promise<void> start(any controller);
-    [CallWith=ScriptState] Promise<void> write(any chunk, any controller);
-    [CallWith=ScriptState] Promise<void> close();
-    [CallWith=ScriptState] Promise<void> abort(any reason);
+    [CallWith=ScriptState, RaisesException] Promise<void> start(any controller);
+    [CallWith=ScriptState, RaisesException] Promise<void> write(any chunk, any controller);
+    [CallWith=ScriptState, RaisesException] Promise<void> close();
+    [CallWith=ScriptState, RaisesException] Promise<void> abort(any reason);
 };
diff --git a/third_party/blink/renderer/core/style/style_fetched_image.cc b/third_party/blink/renderer/core/style/style_fetched_image.cc
index 544ac22..91860f7 100644
--- a/third_party/blink/renderer/core/style/style_fetched_image.cc
+++ b/third_party/blink/renderer/core/style/style_fetched_image.cc
@@ -119,9 +119,7 @@
                                 default_object_size);
   }
 
-  FloatSize size(respect_orientation && image->IsBitmapImage()
-                     ? ToBitmapImage(image)->SizeRespectingOrientation()
-                     : image->Size());
+  FloatSize size(image->Size(respect_orientation));
   return ApplyZoom(size, multiplier);
 }
 
diff --git a/third_party/blink/renderer/core/style/style_fetched_image_set.cc b/third_party/blink/renderer/core/style/style_fetched_image_set.cc
index 2ab8636..3aab696a 100644
--- a/third_party/blink/renderer/core/style/style_fetched_image_set.cc
+++ b/third_party/blink/renderer/core/style/style_fetched_image_set.cc
@@ -103,10 +103,7 @@
     return ImageSizeForSVGImage(ToSVGImage(image), multiplier,
                                 default_object_size);
   }
-  FloatSize natural_size(respect_orientation == kRespectImageOrientation &&
-                                 image->IsBitmapImage()
-                             ? ToBitmapImage(image)->SizeRespectingOrientation()
-                             : image->Size());
+  FloatSize natural_size(image->Size(respect_orientation));
   FloatSize scaled_image_size(ApplyZoom(natural_size, multiplier));
   scaled_image_size.Scale(1 / image_scale_factor_);
   return scaled_image_size;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 9f65d1e..c8e1129a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -961,14 +961,14 @@
   ImageBitmap* image_bitmap = nullptr;
   Document* document = &node->GetDocument();
   if (auto* image = DynamicTo<HTMLImageElement>(node)) {
-    image_bitmap = ImageBitmap::Create(image, base::Optional<IntRect>(),
-                                       document, options);
+    image_bitmap = MakeGarbageCollected<ImageBitmap>(
+        image, base::Optional<IntRect>(), document, options);
   } else if (auto* canvas = DynamicTo<HTMLCanvasElement>(node)) {
-    image_bitmap =
-        ImageBitmap::Create(canvas, base::Optional<IntRect>(), options);
+    image_bitmap = MakeGarbageCollected<ImageBitmap>(
+        canvas, base::Optional<IntRect>(), options);
   } else if (auto* video = DynamicTo<HTMLVideoElement>(node)) {
-    image_bitmap = ImageBitmap::Create(video, base::Optional<IntRect>(),
-                                       document, options);
+    image_bitmap = MakeGarbageCollected<ImageBitmap>(
+        video, base::Optional<IntRect>(), document, options);
   }
   if (!image_bitmap)
     return String();
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
index 0acec00..210029b 100644
--- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
+++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -129,7 +129,6 @@
 
   int group = 0;
   base::Optional<double> start_time = base::nullopt;
-  double time_offset = 0;
 
   // Normally the playback rate of a blink animation gets translated into
   // equivalent playback rate of cc::KeyframeModels.
@@ -143,7 +142,7 @@
   // it on animation. https://crbug.com/925373.
   double playback_rate = 1;
 
-  effect->StartAnimationOnCompositor(group, start_time, time_offset,
+  effect->StartAnimationOnCompositor(group, start_time, base::TimeDelta(),
                                      playback_rate, animation);
 }
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
index 0885b5b..ac465e5 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -585,13 +585,13 @@
     const ImageBitmapOptions* default_options = ImageBitmapOptions::Create();
     base::Optional<IntRect> crop_rect =
         IntRect(0, 0, canvas->width(), canvas->height());
-    ImageBitmap* image_bitmap_from_canvas =
-        ImageBitmap::Create(canvas, crop_rect, default_options);
+    auto* image_bitmap_from_canvas =
+        MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, default_options);
     ASSERT_TRUE(image_bitmap_from_canvas);
 
     crop_rect = IntRect(0, 0, 20, 20);
-    image_bitmap_derived = ImageBitmap::Create(image_bitmap_from_canvas,
-                                               crop_rect, default_options);
+    image_bitmap_derived = MakeGarbageCollected<ImageBitmap>(
+        image_bitmap_from_canvas, crop_rect, default_options);
     ASSERT_TRUE(image_bitmap_derived);
   }
   CanvasContextCreationAttributesCore attributes;
@@ -894,7 +894,8 @@
     options->setColorSpaceConversion(
         ColorCorrectionTestUtils::ColorSpaceConversionToString(
             static_cast<ColorSpaceConversion>(conversion_iterator)));
-    ImageBitmap* image_bitmap = ImageBitmap::Create(canvas, crop_rect, options);
+    ImageBitmap* image_bitmap =
+        MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, options);
     ASSERT_TRUE(image_bitmap);
     sk_sp<SkImage> converted_image =
         image_bitmap->BitmapImage()->PaintImageForCurrentFrame().GetSkImage();
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
index 90bcad5e..d6cd4077 100644
--- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
+++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_rendering_context.cc
@@ -52,7 +52,7 @@
     return nullptr;
 
   image->Transfer();
-  return ImageBitmap::Create(std::move(image));
+  return MakeGarbageCollected<ImageBitmap>(std::move(image));
 }
 
 CanvasRenderingContext* ImageBitmapRenderingContext::Factory::Create(
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
index 089d969..54893ca 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -268,7 +268,7 @@
   Host()->DiscardResourceProvider();
   RestoreMatrixClipStack(recorder_->getRecordingCanvas());
 
-  return ImageBitmap::Create(std::move(image));
+  return MakeGarbageCollected<ImageBitmap>(std::move(image));
 }
 
 scoped_refptr<StaticBitmapImage> OffscreenCanvasRenderingContext2D::GetImage(
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc
index bc657535..48bfce6e 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.cc
@@ -30,18 +30,16 @@
 
 ScriptPromise NativeFileSystemUnderlyingSink::start(
     ScriptState* script_state,
-    WritableStreamDefaultController* controller) {
+    WritableStreamDefaultController* controller,
+    ExceptionState& exception_state) {
   return ScriptPromise::CastUndefined(script_state);
 }
 
 ScriptPromise NativeFileSystemUnderlyingSink::write(
     ScriptState* script_state,
     ScriptValue chunk,
-    WritableStreamDefaultController* controller) {
-  ExceptionState exception_state(script_state->GetIsolate(),
-                                 ExceptionState::kExecutionContext,
-                                 "NativeFileSystemUnderlyingSink", "write");
-
+    WritableStreamDefaultController* controller,
+    ExceptionState& exception_state) {
   v8::Local<v8::Value> value = chunk.V8Value();
 
   ArrayBufferOrArrayBufferViewOrBlobOrUSVStringOrWriteParams input;
@@ -49,7 +47,7 @@
       script_state->GetIsolate(), value, input,
       UnionTypeConversionMode::kNotNullable, exception_state);
   if (exception_state.HadException())
-    return ScriptPromise::Reject(script_state, exception_state);
+    return ScriptPromise();
 
   if (input.IsNull()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
@@ -57,25 +55,28 @@
     return ScriptPromise();
   }
 
-  if (input.IsWriteParams())
-    return HandleParams(script_state, std::move(*input.GetAsWriteParams()));
+  if (input.IsWriteParams()) {
+    return HandleParams(script_state, std::move(*input.GetAsWriteParams()),
+                        exception_state);
+  }
 
   ArrayBufferOrArrayBufferViewOrBlobOrUSVString write_data;
   V8ArrayBufferOrArrayBufferViewOrBlobOrUSVString::ToImpl(
       script_state->GetIsolate(), value, write_data,
       UnionTypeConversionMode::kNotNullable, exception_state);
   if (exception_state.HadException())
-    return ScriptPromise::Reject(script_state, exception_state);
-  return WriteData(script_state, offset_, std::move(write_data));
+    return ScriptPromise();
+  return WriteData(script_state, offset_, std::move(write_data),
+                   exception_state);
 }
 
-ScriptPromise NativeFileSystemUnderlyingSink::close(ScriptState* script_state) {
+ScriptPromise NativeFileSystemUnderlyingSink::close(
+    ScriptState* script_state,
+    ExceptionState& exception_state) {
   if (!writer_remote_ || pending_operation_) {
-    return ScriptPromise::Reject(
-        script_state,
-        V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(),
-                                           DOMExceptionCode::kInvalidStateError,
-                                           "Object reached an invalid state"));
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "Object reached an invalid state");
+    return ScriptPromise();
   }
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -86,8 +87,10 @@
   return result;
 }
 
-ScriptPromise NativeFileSystemUnderlyingSink::abort(ScriptState* script_state,
-                                                    ScriptValue reason) {
+ScriptPromise NativeFileSystemUnderlyingSink::abort(
+    ScriptState* script_state,
+    ScriptValue reason,
+    ExceptionState& exception_state) {
   // The specification guarantees that this will only be called after all
   // pending writes have been aborted. Terminating the remote connection
   // will ensure that the writes are not closed successfully.
@@ -98,52 +101,49 @@
 
 ScriptPromise NativeFileSystemUnderlyingSink::HandleParams(
     ScriptState* script_state,
-    const WriteParams& params) {
+    const WriteParams& params,
+    ExceptionState& exception_state) {
   if (params.type() == "truncate") {
     if (!params.hasSize()) {
-      return ScriptPromise::Reject(
-          script_state,
-          V8ThrowDOMException::CreateOrEmpty(
-              script_state->GetIsolate(), DOMExceptionCode::kSyntaxError,
-              "Invalid params passed. truncate requires a size argument"));
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kSyntaxError,
+          "Invalid params passed. truncate requires a size argument");
+      return ScriptPromise();
     }
-    return Truncate(script_state, params.size());
+    return Truncate(script_state, params.size(), exception_state);
   }
 
   if (params.type() == "seek") {
     if (!params.hasPosition()) {
-      return ScriptPromise::Reject(
-          script_state,
-          V8ThrowDOMException::CreateOrEmpty(
-              script_state->GetIsolate(), DOMExceptionCode::kSyntaxError,
-              "Invalid params passed. seek requires a position argument"));
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kSyntaxError,
+          "Invalid params passed. seek requires a position argument");
+      return ScriptPromise();
     }
-    return Seek(script_state, params.position());
+    return Seek(script_state, params.position(), exception_state);
   }
 
   if (params.type() == "write") {
     uint64_t position = params.hasPosition() ? params.position() : offset_;
     if (!params.hasData()) {
-      return ScriptPromise::Reject(
-          script_state,
-          V8ThrowDOMException::CreateOrEmpty(
-              script_state->GetIsolate(), DOMExceptionCode::kSyntaxError,
-              "Invalid params passed. write requires a data argument"));
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kSyntaxError,
+          "Invalid params passed. write requires a data argument");
+      return ScriptPromise();
     }
-    return WriteData(script_state, position, params.data());
+    return WriteData(script_state, position, params.data(), exception_state);
   }
 
-  return ScriptPromise::Reject(
-      script_state,
-      V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(),
-                                         DOMExceptionCode::kInvalidStateError,
-                                         "Object reached an invalid state"));
+  exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                    "Object reached an invalid state");
+  return ScriptPromise();
 }
 
 ScriptPromise NativeFileSystemUnderlyingSink::WriteData(
     ScriptState* script_state,
     uint64_t position,
-    const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data) {
+    const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data,
+    ExceptionState& exception_state) {
   DCHECK(!data.IsNull());
 
   auto blob_data = std::make_unique<BlobData>();
@@ -170,19 +170,18 @@
         BlobDataHandle::Create(std::move(blob_data), size));
   }
 
-  return WriteBlob(script_state, position, blob);
+  return WriteBlob(script_state, position, blob, exception_state);
 }
 
 ScriptPromise NativeFileSystemUnderlyingSink::WriteBlob(
     ScriptState* script_state,
     uint64_t position,
-    Blob* blob) {
+    Blob* blob,
+    ExceptionState& exception_state) {
   if (!writer_remote_ || pending_operation_) {
-    return ScriptPromise::Reject(
-        script_state,
-        V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(),
-                                           DOMExceptionCode::kInvalidStateError,
-                                           "Object reached an invalid state"));
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "Object reached an invalid state");
+    return ScriptPromise();
   }
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -196,13 +195,12 @@
 
 ScriptPromise NativeFileSystemUnderlyingSink::Truncate(
     ScriptState* script_state,
-    uint64_t size) {
+    uint64_t size,
+    ExceptionState& exception_state) {
   if (!writer_remote_ || pending_operation_) {
-    return ScriptPromise::Reject(
-        script_state,
-        V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(),
-                                           DOMExceptionCode::kInvalidStateError,
-                                           "Object reached an invalid state"));
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "Object reached an invalid state");
+    return ScriptPromise();
   }
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -213,14 +211,14 @@
   return result;
 }
 
-ScriptPromise NativeFileSystemUnderlyingSink::Seek(ScriptState* script_state,
-                                                   uint64_t offset) {
+ScriptPromise NativeFileSystemUnderlyingSink::Seek(
+    ScriptState* script_state,
+    uint64_t offset,
+    ExceptionState& exception_state) {
   if (!writer_remote_ || pending_operation_) {
-    return ScriptPromise::Reject(
-        script_state,
-        V8ThrowDOMException::CreateOrEmpty(script_state->GetIsolate(),
-                                           DOMExceptionCode::kInvalidStateError,
-                                           "Object reached an invalid state"));
+    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+                                      "Object reached an invalid state");
+    return ScriptPromise();
   }
   offset_ = offset;
   return ScriptPromise::CastUndefined(script_state);
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h
index a934793..4fcf3bf 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_underlying_sink.h
@@ -14,6 +14,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ScriptPromiseResolver;
 class WriteParams;
 
@@ -27,25 +28,34 @@
       mojo::PendingRemote<mojom::blink::NativeFileSystemFileWriter>);
 
   // UnderlyingSinkBase
-  ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override;
+  ScriptPromise start(ScriptState*,
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
   ScriptPromise write(ScriptState*,
                       ScriptValue chunk,
-                      WritableStreamDefaultController*) override;
-  ScriptPromise close(ScriptState*) override;
-  ScriptPromise abort(ScriptState*, ScriptValue reason) override;
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
+  ScriptPromise close(ScriptState*, ExceptionState&) override;
+  ScriptPromise abort(ScriptState*,
+                      ScriptValue reason,
+                      ExceptionState&) override;
 
   void Trace(Visitor*) override;
   void ContextDestroyed(ExecutionContext*) override;
 
  private:
-  ScriptPromise HandleParams(ScriptState*, const WriteParams&);
+  ScriptPromise HandleParams(ScriptState*, const WriteParams&, ExceptionState&);
   ScriptPromise WriteData(
       ScriptState*,
       uint64_t position,
-      const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data);
-  ScriptPromise WriteBlob(ScriptState*, uint64_t position, Blob*);
-  ScriptPromise Truncate(ScriptState*, uint64_t size);
-  ScriptPromise Seek(ScriptState*, uint64_t offset);
+      const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data,
+      ExceptionState&);
+  ScriptPromise WriteBlob(ScriptState*,
+                          uint64_t position,
+                          Blob*,
+                          ExceptionState&);
+  ScriptPromise Truncate(ScriptState*, uint64_t size, ExceptionState&);
+  ScriptPromise Seek(ScriptState*, uint64_t offset, ExceptionState&);
   void WriteComplete(mojom::blink::NativeFileSystemErrorPtr result,
                      uint64_t bytes_written);
   void TruncateComplete(uint64_t to_size,
diff --git a/third_party/blink/renderer/modules/nfc/README.md b/third_party/blink/renderer/modules/nfc/README.md
new file mode 100644
index 0000000..4d6f599
--- /dev/null
+++ b/third_party/blink/renderer/modules/nfc/README.md
@@ -0,0 +1,20 @@
+# Web NFC Blink Module
+
+`renderer/modules/nfc` implements the renderer process details and bindings for
+the [Web NFC specification]. It communicates with the browser process through the
+[Web NFC Mojo interface]. The platform-specific parts of the
+implementation are located in `services/device/nfc`.
+
+[Web NFC specification]: https://w3c.github.io/web-nfc/
+[Web NFC Mojo interface]: ../../../../../services/device/public/mojom/nfc.mojom
+
+
+## Testing
+
+Web NFC is primarily tested in [Web Platform Tests](https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/web_tests/external/wpt/web-nfc/).
+
+
+## Design Documents
+
+Please refer to the [design documentation](https://sites.google.com/a/chromium.org/dev/developers/design-documents/web-nfc)
+for more details.
\ No newline at end of file
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc
index 3505661..6ba143f 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include <memory>
 
-#include "base/bind.h"
 #include "base/location.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
@@ -19,6 +18,7 @@
 #include "third_party/blink/renderer/modules/mediastream/media_stream_constraints_util.h"
 #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h"
 #include "third_party/blink/renderer/platform/peerconnection/webrtc_video_track_source.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
 #include "third_party/webrtc/api/video_track_source_proxy.h"
@@ -188,14 +188,15 @@
     scoped_refptr<media::VideoFrame> frame,
     base::TimeTicks estimated_capture_time) {
   DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_);
-  render_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebRtcVideoSourceAdapter::ResetRefreshTimerOnMainThread,
-                     this));
-  libjingle_worker_thread_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread,
-                     this, std::move(frame)));
+  PostCrossThreadTask(
+      *render_task_runner_.get(), FROM_HERE,
+      CrossThreadBindOnce(
+          &WebRtcVideoSourceAdapter::ResetRefreshTimerOnMainThread,
+          WrapRefCounted(this)));
+  PostCrossThreadTask(
+      *libjingle_worker_thread_.get(), FROM_HERE,
+      CrossThreadBindOnce(&WebRtcVideoSourceAdapter::OnVideoFrameOnWorkerThread,
+                          WrapRefCounted(this), std::move(frame)));
 }
 
 void MediaStreamVideoWebRtcSink::WebRtcVideoSourceAdapter::
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
index ffa4726..9cc1e57 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -461,9 +461,8 @@
 
   std::unique_ptr<rtc::NetworkManager> network_manager;
   if (port_config.enable_multiple_routes) {
-    network_manager = std::make_unique<blink::FilteringNetworkManager>(
-        network_manager_.get(), requesting_origin, media_permission,
-        allow_mdns_obfuscation);
+    network_manager = std::make_unique<FilteringNetworkManager>(
+        network_manager_.get(), media_permission, allow_mdns_obfuscation);
   } else {
     network_manager =
         std::make_unique<blink::EmptyNetworkManager>(network_manager_.get());
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
index 731c009..15b80fa 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -117,7 +117,7 @@
   return result.ToString();
 }
 
-String SerializeMediaStreamIds(const blink::WebVector<String>& stream_ids) {
+String SerializeMediaStreamIds(const Vector<String>& stream_ids) {
   if (!stream_ids.size())
     return "[]";
   StringBuilder result;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
index 235041b1..0660d0e7 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
@@ -142,7 +142,7 @@
     DispatchEvent(*event.Release());
     return;
   }
-  WebString this_tone = tone_buffer_.Substring(0, 1);
+  String this_tone = tone_buffer_.Substring(0, 1);
   tone_buffer_ = tone_buffer_.Substring(1, tone_buffer_.length() - 1);
   // InsertDTMF handles both tones and ",", and calls DidPlayTone after
   // the specified delay.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
index 5c7d4f26..3790579 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
@@ -318,7 +318,7 @@
 
 static WebVector<webrtc::PeerConnectionInterface::IceServer> ConvertIceServers(
     const HeapVector<Member<RTCIceServer>>& ice_servers) {
-  Vector<webrtc::PeerConnectionInterface::IceServer> converted_ice_servers;
+  WebVector<webrtc::PeerConnectionInterface::IceServer> converted_ice_servers;
   for (const RTCIceServer* ice_server : ice_servers) {
     converted_ice_servers.emplace_back(ConvertIceServer(ice_server));
   }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
index 020455f46..5ffcbd0 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
@@ -2369,7 +2369,7 @@
                                    kSetLocalDescription
                              : PeerConnectionTracker::TransceiverUpdatedReason::
                                    kSetRemoteDescription;
-  blink::WebVector<uintptr_t> ids(transceiver_states.size());
+  Vector<uintptr_t> ids(SafeCast<wtf_size_t>(transceiver_states.size()));
   for (WTF::wtf_size_t i = 0; i < transceiver_states.size(); ++i) {
     // Figure out if this transceiver is new or if setting the state modified
     // the transceiver such that it should be logged by the
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
index 3b5815c..bf8af535 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
@@ -378,7 +378,7 @@
   std::vector<std::unique_ptr<blink::RTCRtpTransceiverImpl>> rtp_transceivers_;
   // A snapshot of transceiver ids taken before the last transition, used to
   // detect any removals during rollback.
-  blink::WebVector<uintptr_t> previous_transceiver_ids_;
+  Vector<uintptr_t> previous_transceiver_ids_;
 
   base::WeakPtr<PeerConnectionTracker> peer_connection_tracker_;
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
index 57a27fe..519f5d5 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -394,7 +394,7 @@
     // TODO(orphis): Forward missing fields from the WebRTC library:
     // codecPayloadType, dtx, ptime, maxFramerate, scaleResolutionDownBy.
     RTCRtpEncodingParameters* encoding = RTCRtpEncodingParameters::Create();
-    encoding->setRid(WebString::FromUTF8(webrtc_encoding.rid));
+    encoding->setRid(String::FromUTF8(webrtc_encoding.rid));
     encoding->setActive(webrtc_encoding.active);
     if (webrtc_encoding.max_bitrate_bps) {
       encoding->setMaxBitrate(webrtc_encoding.max_bitrate_bps.value());
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
index 75ab1a75..8dd8c35 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -27,7 +27,7 @@
     std::unique_ptr<RTCStatsMember> member = stats->GetMember(i);
     if (!member->IsDefined())
       continue;
-    WebString name = member->GetName();
+    String name = member->GetName();
     switch (member->GetType()) {
       case webrtc::RTCStatsMemberInterface::kBool:
         builder.AddBoolean(name, member->ValueBool());
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
index 87ff711c..439c6c99 100644
--- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.cc
@@ -25,14 +25,16 @@
 
 ScriptPromise SerialPortUnderlyingSink::start(
     ScriptState* script_state,
-    WritableStreamDefaultController* controller) {
+    WritableStreamDefaultController* controller,
+    ExceptionState& exception_state) {
   return ScriptPromise::CastUndefined(script_state);
 }
 
 ScriptPromise SerialPortUnderlyingSink::write(
     ScriptState* script_state,
     ScriptValue chunk,
-    WritableStreamDefaultController* controller) {
+    WritableStreamDefaultController* controller,
+    ExceptionState& exception_state) {
   // There can only be one call to write() in progress at a time.
   DCHECK(buffer_source_.IsNull());
   DCHECK_EQ(0u, offset_);
@@ -42,18 +44,15 @@
     DOMException* exception = pending_exception_;
     pending_exception_ = nullptr;
     serial_port_->UnderlyingSinkClosed();
-    return ScriptPromise::RejectWithDOMException(script_state, exception);
+    exception_state.RethrowV8Exception(ToV8(exception, script_state));
+    return ScriptPromise();
   }
 
-  ExceptionState exception_state(script_state->GetIsolate(),
-                                 ExceptionState::kExecutionContext,
-                                 "SerialPortUnderlyingSink", "write");
-
   V8ArrayBufferOrArrayBufferView::ToImpl(
       script_state->GetIsolate(), chunk.V8Value(), buffer_source_,
       UnionTypeConversionMode::kNotNullable, exception_state);
   if (exception_state.HadException())
-    return ScriptPromise::Reject(script_state, exception_state);
+    return ScriptPromise();
 
   pending_write_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = pending_write_->Promise();
@@ -62,7 +61,8 @@
   return promise;
 }
 
-ScriptPromise SerialPortUnderlyingSink::close(ScriptState* script_state) {
+ScriptPromise SerialPortUnderlyingSink::close(ScriptState* script_state,
+                                              ExceptionState& exception_state) {
   // The specification guarantees that this will only be called after all
   // pending writes have been completed.
   DCHECK(!pending_write_);
@@ -74,7 +74,8 @@
   if (pending_exception_) {
     DOMException* exception = pending_exception_;
     pending_exception_ = nullptr;
-    return ScriptPromise::RejectWithDOMException(script_state, exception);
+    exception_state.RethrowV8Exception(ToV8(exception, script_state));
+    return ScriptPromise();
   }
 
   // TODO(crbug.com/989656): close() should wait for data to be flushed before
@@ -83,12 +84,13 @@
 }
 
 ScriptPromise SerialPortUnderlyingSink::abort(ScriptState* script_state,
-                                              ScriptValue reason) {
+                                              ScriptValue reason,
+                                              ExceptionState& exception_state) {
   // The specification guarantees that this will only be called after all
   // pending writes have been completed.
   // TODO(crbug.com/969653): abort() should trigger a purge of the serial write
   // buffers.
-  return close(script_state);
+  return close(script_state, exception_state);
 }
 
 void SerialPortUnderlyingSink::SignalErrorOnClose(DOMException* exception) {
diff --git a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
index 2719dc4..4b1ef65 100644
--- a/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
+++ b/third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h
@@ -12,6 +12,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ScriptPromiseResolver;
 class SerialPort;
 
@@ -20,12 +21,17 @@
   SerialPortUnderlyingSink(SerialPort*, mojo::ScopedDataPipeProducerHandle);
 
   // UnderlyingSinkBase
-  ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override;
+  ScriptPromise start(ScriptState*,
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
   ScriptPromise write(ScriptState*,
                       ScriptValue chunk,
-                      WritableStreamDefaultController*) override;
-  ScriptPromise close(ScriptState*) override;
-  ScriptPromise abort(ScriptState*, ScriptValue reason) override;
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
+  ScriptPromise close(ScriptState*, ExceptionState&) override;
+  ScriptPromise abort(ScriptState*,
+                      ScriptValue reason,
+                      ExceptionState&) override;
 
   // After |data_pipe_| has closed calls to write() will return a Promise
   // rejected with this DOMException.
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
index dc257e5..970fabf9 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -19,20 +19,19 @@
 
 VideoDecoder::VideoDecoder() = default;
 
-ScriptPromise VideoDecoder::Initialize(
-    ScriptState* script_state,
-    const VideoDecoderInitParameters* params) {
-  return ScriptPromise::RejectWithDOMException(
-      script_state,
-      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
-                                         "Not implemented yet."));
+ScriptPromise VideoDecoder::Initialize(ScriptState* script_state,
+                                       const VideoDecoderInitParameters* params,
+                                       ExceptionState& exception_state) {
+  exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
+                                    "Not implemented yet.");
+  return ScriptPromise();
 }
 
-ScriptPromise VideoDecoder::Flush(ScriptState* script_state) {
-  return ScriptPromise::RejectWithDOMException(
-      script_state,
-      MakeGarbageCollected<DOMException>(DOMExceptionCode::kNotSupportedError,
-                                         "Not implemented yet."));
+ScriptPromise VideoDecoder::Flush(ScriptState* script_state,
+                                  ExceptionState& exception_state) {
+  exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
+                                    "Not implemented yet.");
+  return ScriptPromise();
 }
 
 void VideoDecoder::Close() {}
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.h b/third_party/blink/renderer/modules/webcodecs/video_decoder.h
index 71026ca0..94e11e0 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder.h
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.h
@@ -11,6 +11,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ScriptState;
 class ReadableStream;
 class VideoDecoderInitParameters;
@@ -22,8 +23,10 @@
  public:
   static VideoDecoder* Create();
   VideoDecoder();
-  ScriptPromise Initialize(ScriptState*, const VideoDecoderInitParameters*);
-  ScriptPromise Flush(ScriptState*);
+  ScriptPromise Initialize(ScriptState*,
+                           const VideoDecoderInitParameters*,
+                           ExceptionState&);
+  ScriptPromise Flush(ScriptState*, ExceptionState&);
   void Close();
 
   // video_decoder.idl implementation.
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.idl b/third_party/blink/renderer/modules/webcodecs/video_decoder.idl
index a3d05ac..35d9026 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder.idl
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.idl
@@ -6,8 +6,8 @@
     RuntimeEnabled=WebCodecs
 ] interface VideoDecoder {
     constructor();
-    [CallWith=ScriptState] Promise<void> Initialize(VideoDecoderInitParameters params);
-    [CallWith=ScriptState] Promise<void> Flush();
+    [CallWith=ScriptState, RaisesException] Promise<void> Initialize(VideoDecoderInitParameters params);
+    [CallWith=ScriptState, RaisesException] Promise<void> Flush();
     void Close();
 
     readonly attribute WritableStream writable;  // of EncodedVideoFrame
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 7cfd680..18c96ea 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -735,7 +735,7 @@
     ScriptState* script_state) {
   WebFeature feature = WebFeature::kOffscreenCanvasTransferToImageBitmapWebGL;
   UseCounter::Count(ExecutionContext::From(script_state), feature);
-  return ImageBitmap::Create(
+  return MakeGarbageCollected<ImageBitmap>(
       GetDrawingBuffer()->TransferToStaticBitmapImage(nullptr));
 }
 
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.cc b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
index 48dea29..e2b7af21 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_stream.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
@@ -68,12 +68,17 @@
   explicit UnderlyingSink(WebSocketStream* creator) : creator_(creator) {}
 
   // UnderlyingSinkBase implementation.
-  ScriptPromise start(ScriptState*, WritableStreamDefaultController*) override;
+  ScriptPromise start(ScriptState*,
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
   ScriptPromise write(ScriptState*,
                       ScriptValue chunk,
-                      WritableStreamDefaultController*) override;
-  ScriptPromise close(ScriptState*) override;
-  ScriptPromise abort(ScriptState*, ScriptValue reason) override;
+                      WritableStreamDefaultController*,
+                      ExceptionState&) override;
+  ScriptPromise close(ScriptState*, ExceptionState&) override;
+  ScriptPromise abort(ScriptState*,
+                      ScriptValue reason,
+                      ExceptionState&) override;
 
   // API for WebSocketStream.
   void DidStartClosingHandshake();
@@ -93,7 +98,8 @@
   void SendAny(ScriptState*,
                v8::Local<v8::Value> v8chunk,
                ScriptPromiseResolver*,
-               base::OnceClosure callback);
+               base::OnceClosure callback,
+               ExceptionState&);
   void SendArrayBuffer(ScriptState*,
                        DOMArrayBuffer*,
                        size_t offset,
@@ -178,7 +184,8 @@
 
 ScriptPromise WebSocketStream::UnderlyingSink::start(
     ScriptState* script_state,
-    WritableStreamDefaultController*) {
+    WritableStreamDefaultController*,
+    ExceptionState& exception_state) {
   DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " start()";
   return ScriptPromise::CastUndefined(script_state);
 }
@@ -186,7 +193,8 @@
 ScriptPromise WebSocketStream::UnderlyingSink::write(
     ScriptState* script_state,
     ScriptValue chunk,
-    WritableStreamDefaultController*) {
+    WritableStreamDefaultController*,
+    ExceptionState& exception_state) {
   DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " write()";
   is_writing_ = true;
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
@@ -195,12 +203,16 @@
       WTF::Bind(&UnderlyingSink::FinishWriteCallback, WrapWeakPersistent(this),
                 WrapPersistent(resolver));
   v8::Local<v8::Value> v8chunk = chunk.V8Value();
-  SendAny(script_state, v8chunk, resolver, std::move(callback));
+  SendAny(script_state, v8chunk, resolver, std::move(callback),
+          exception_state);
+  if (exception_state.HadException())
+    return ScriptPromise();
   return result;
 }
 
 ScriptPromise WebSocketStream::UnderlyingSink::close(
-    ScriptState* script_state) {
+    ScriptState* script_state,
+    ExceptionState& exception_state) {
   DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " close()";
   closed_ = true;
   creator_->CloseWithUnspecifiedCode();
@@ -209,8 +221,10 @@
   return close_resolver_->Promise();
 }
 
-ScriptPromise WebSocketStream::UnderlyingSink::abort(ScriptState* script_state,
-                                                     ScriptValue reason) {
+ScriptPromise WebSocketStream::UnderlyingSink::abort(
+    ScriptState* script_state,
+    ScriptValue reason,
+    ExceptionState& exception_state) {
   DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " abort()";
 
   closed_ = true;
@@ -288,7 +302,8 @@
 void WebSocketStream::UnderlyingSink::SendAny(ScriptState* script_state,
                                               v8::Local<v8::Value> v8chunk,
                                               ScriptPromiseResolver* resolver,
-                                              base::OnceClosure callback) {
+                                              base::OnceClosure callback,
+                                              ExceptionState& exception_state) {
   DVLOG(1) << "WebSocketStream::UnderlyingSink " << this << " SendAny()";
   auto* isolate = script_state->GetIsolate();
   if (v8chunk->IsArrayBuffer()) {
@@ -299,15 +314,12 @@
   }
 
   if (v8chunk->IsArrayBufferView()) {
-    ExceptionState exception_state(isolate, ExceptionState::kUnknownContext, "",
-                                   "");
     NotShared<DOMArrayBufferView> data =
         ToNotShared<NotShared<DOMArrayBufferView>>(isolate, v8chunk,
                                                    exception_state);
     if (exception_state.HadException()) {
       closed_ = true;
       is_writing_ = false;
-      resolver->Reject(exception_state);
       return;
     }
 
diff --git a/third_party/blink/renderer/platform/graphics/image.cc b/third_party/blink/renderer/platform/graphics/image.cc
index aee2360..21a1f9af 100644
--- a/third_party/blink/renderer/platform/graphics/image.cc
+++ b/third_party/blink/renderer/platform/graphics/image.cc
@@ -326,13 +326,19 @@
   return true;
 }
 
+IntSize Image::Size(RespectImageOrientationEnum respect_image_orientation) {
+  if (respect_image_orientation == kRespectImageOrientation && IsBitmapImage())
+    return ToBitmapImage(this)->SizeRespectingOrientation();
+  return Size();
+}
+
 SkBitmap Image::AsSkBitmapForCurrentFrame(
-    RespectImageOrientationEnum should_respect_image_orientation) {
+    RespectImageOrientationEnum respect_image_orientation) {
   PaintImage paint_image = PaintImageForCurrentFrame();
   if (!paint_image)
     return {};
 
-  if (should_respect_image_orientation == kRespectImageOrientation &&
+  if (respect_image_orientation == kRespectImageOrientation &&
       IsBitmapImage()) {
     ImageOrientation orientation =
         ToBitmapImage(this)->CurrentFrameOrientation();
diff --git a/third_party/blink/renderer/platform/graphics/image.h b/third_party/blink/renderer/platform/graphics/image.h
index 5072e7b2..165d4ee2 100644
--- a/third_party/blink/renderer/platform/graphics/image.h
+++ b/third_party/blink/renderer/platform/graphics/image.h
@@ -109,6 +109,7 @@
   virtual bool HasIntrinsicSize() const { return true; }
 
   virtual IntSize Size() const = 0;
+  IntSize Size(RespectImageOrientationEnum);
   virtual FloatSize SizeAsFloat() const { return FloatSize(Size()); }
   IntRect Rect() const { return IntRect(IntPoint(), Size()); }
   int width() const { return Size().Width(); }
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index fbc63e1..7842798b 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1082,21 +1082,6 @@
     DCHECK(!static_persistents_.Contains(persistent_node));
 }
 
-void ThreadState::RegisterPreFinalizer(void* object,
-                                       PreFinalizerCallback callback) {
-#if DCHECK_IS_ON()
-  DCHECK(CheckThread());
-#endif
-  DCHECK(!SweepForbidden());
-
-  HeapObjectHeader* header = HeapObjectHeader::FromInnerAddress(object);
-  DCHECK(ordered_pre_finalizers_.end() ==
-         std::find(ordered_pre_finalizers_.begin(),
-                   ordered_pre_finalizers_.end(),
-                   PreFinalizer{header, object, callback}));
-  ordered_pre_finalizers_.push_back(PreFinalizer{header, object, callback});
-}
-
 void ThreadState::InvokePreFinalizers() {
   DCHECK(CheckThread());
   DCHECK(!SweepForbidden());
@@ -1104,22 +1089,23 @@
   ThreadHeapStatsCollector::Scope stats_scope(
       Heap().stats_collector(), ThreadHeapStatsCollector::kInvokePreFinalizers);
   SweepForbiddenScope sweep_forbidden(this);
-  // Pre finalizers are forbidden from allocating objects.
+  // Pre finalizers are forbidden from allocating objects
   NoAllocationScope no_allocation_scope(this);
 
   // Call the prefinalizers in the opposite order to their registration.
+  //
+  // LinkedHashSet does not support modification during iteration, so
+  // copy items first.
+  //
+  // The prefinalizer callback wrapper returns |true| when its associated
+  // object is unreachable garbage and the prefinalizer callback has run.
+  // The registered prefinalizer entry must then be removed and deleted.
   Deque<PreFinalizer> remaining_ordered_pre_finalizers;
   for (auto rit = ordered_pre_finalizers_.rbegin();
        rit != ordered_pre_finalizers_.rend(); ++rit) {
     const PreFinalizer& pre_finalizer = *rit;
-    // Check if pre-finalizer should be executed.
-    if (pre_finalizer.header->IsMarked()) {
-      // Re-queue for checking in next garbage collection.
+    if (!(pre_finalizer.second)(pre_finalizer.first))
       remaining_ordered_pre_finalizers.push_front(pre_finalizer);
-    } else {
-      // Execute pre-finalizer.
-      pre_finalizer.callback(pre_finalizer.object);
-    }
   }
 
   ordered_pre_finalizers_ = std::move(remaining_ordered_pre_finalizers);
diff --git a/third_party/blink/renderer/platform/heap/thread_state.h b/third_party/blink/renderer/platform/heap/thread_state.h
index 29db6e8..77ba4df 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.h
+++ b/third_party/blink/renderer/platform/heap/thread_state.h
@@ -62,7 +62,6 @@
 }  // namespace incremental_marking_test
 
 class CancelableTaskScheduler;
-class HeapObjectHeader;
 class MarkingVisitor;
 class PersistentNode;
 class PersistentRegion;
@@ -94,13 +93,17 @@
 //     Member<Bar> bar_;
 //   };
 #define USING_PRE_FINALIZER(Class, preFinalizer)                          \
- private:                                                                 \
-  static void PreFinalizerDispatch(void* object) {                        \
-    reinterpret_cast<Class*>(object)->Class::preFinalizer();              \
+ public:                                                                  \
+  static bool InvokePreFinalizer(void* object) {                          \
+    Class* self = reinterpret_cast<Class*>(object);                       \
+    if (ThreadHeap::IsHeapObjectAlive(self))                              \
+      return false;                                                       \
+    self->Class::preFinalizer();                                          \
+    return true;                                                          \
   }                                                                       \
                                                                           \
-  friend class ThreadState::PreFinalizerRegistration<Class>;              \
-  ThreadState::PreFinalizerRegistration<Class> prefinalizer_dummy_{this}; \
+ private:                                                                 \
+  ThreadState::PrefinalizerRegistration<Class> prefinalizer_dummy_{this}; \
   using UsingPreFinalizerMacroNeedsTrailingSemiColon = char
 
 class PLATFORM_EXPORT BlinkGCObserver {
@@ -130,16 +133,24 @@
   // Register the pre-finalizer for the |self| object. The class T be using
   // USING_PRE_FINALIZER() macro.
   template <typename T>
-  class PreFinalizerRegistration final {
+  class PrefinalizerRegistration final {
     DISALLOW_NEW();
 
    public:
-    PreFinalizerRegistration(T* self) {
-      static_assert(sizeof(&T::PreFinalizerDispatch) > 0,
+    PrefinalizerRegistration(T* self) {
+      static_assert(sizeof(&T::InvokePreFinalizer) > 0,
                     "USING_PRE_FINALIZER(T) must be defined.");
       ThreadState* state =
           ThreadStateFor<ThreadingTrait<T>::kAffinity>::GetState();
-      state->RegisterPreFinalizer(self, T::PreFinalizerDispatch);
+#if DCHECK_IS_ON()
+      DCHECK(state->CheckThread());
+#endif
+      DCHECK(!state->SweepForbidden());
+      DCHECK(std::find(state->ordered_pre_finalizers_.begin(),
+                       state->ordered_pre_finalizers_.end(),
+                       PreFinalizer(self, T::InvokePreFinalizer)) ==
+             state->ordered_pre_finalizers_.end());
+      state->ordered_pre_finalizers_.emplace_back(self, T::InvokePreFinalizer);
     }
   };
 
@@ -368,17 +379,6 @@
  private:
   class IncrementalMarkingScheduler;
 
-  using PreFinalizerCallback = void (*)(void*);
-  struct PreFinalizer {
-    HeapObjectHeader* header;
-    void* object;
-    PreFinalizerCallback callback;
-
-    bool operator==(const PreFinalizer& other) const {
-      return object == other.object && callback == other.callback;
-    }
-  };
-
   // Duration of one incremental marking step. Should be short enough that it
   // doesn't cause jank even though it is scheduled as a normal task.
   static constexpr base::TimeDelta kDefaultIncrementalMarkingStepDuration =
@@ -518,7 +518,6 @@
 
   void SynchronizeAndFinishConcurrentSweeping();
 
-  void RegisterPreFinalizer(void*, PreFinalizerCallback);
   void InvokePreFinalizers();
 
   // Adds the given observer to the ThreadState's observer list. This doesn't
@@ -567,6 +566,9 @@
   BlinkGC::GCReason reason_for_scheduled_gc_ =
       BlinkGC::GCReason::kForcedGCForTesting;
 
+  using PreFinalizerCallback = bool (*)(void*);
+  using PreFinalizer = std::pair<void*, PreFinalizerCallback>;
+
   // Pre-finalizers are called in the reverse order in which they are
   // registered by the constructors (including constructors of Mixin objects)
   // for an object, by processing the ordered_pre_finalizers_ back-to-front.
@@ -615,7 +617,7 @@
   friend class IncrementalMarkingTestDriver;
   friend class HeapAllocator;
   template <typename T>
-  friend class PreFinalizerRegistration;
+  friend class PrefinalizerRegistration;
   friend class TestGCScope;
   friend class TestSupportingGC;
   friend class ThreadStateSchedulingTest;
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
index fc13ef4..d240762 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
@@ -16,12 +16,10 @@
 
 FilteringNetworkManager::FilteringNetworkManager(
     rtc::NetworkManager* network_manager,
-    const GURL& requesting_origin,
     media::MediaPermission* media_permission,
     bool allow_mdns_obfuscation)
     : network_manager_(network_manager),
       media_permission_(media_permission),
-      requesting_origin_(requesting_origin),
       allow_mdns_obfuscation_(allow_mdns_obfuscation) {
   DETACH_FROM_THREAD(thread_checker_);
   set_enumeration_permission(ENUMERATION_BLOCKED);
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
index 1bc2156..8243e2f 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
@@ -13,7 +13,6 @@
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/webrtc/rtc_base/network.h"
 #include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h"
-#include "url/gurl.h"
 
 namespace media {
 class MediaPermission;
@@ -34,8 +33,6 @@
 // rtc::NetworkManagerBase to have the same implementation of
 // GetAnyAddressNetworks(). We can't mark the whole class PLATFORM_EXPORT
 // as it requires all super classes to be PLATFORM_EXPORT as well.
-//
-// TODO(crbug.com/787254): Also, move it away from url/gurl.h.
 class FilteringNetworkManager : public rtc::NetworkManagerBase,
                                 public sigslot::has_slots<> {
  public:
@@ -43,7 +40,6 @@
   // worker thread |task_runner|.
   PLATFORM_EXPORT FilteringNetworkManager(
       rtc::NetworkManager* network_manager,
-      const GURL& requesting_origin,
       media::MediaPermission* media_permission,
       bool allow_mdns_obfuscation);
 
@@ -116,8 +112,6 @@
   // the setup time.
   base::TimeTicks start_updating_time_;
 
-  GURL requesting_origin_;
-
   // When the mDNS obfuscation is allowed, access to the mDNS responder provided
   // by the base network manager is provided to conceal IPs with mDNS hostnames.
   bool allow_mdns_obfuscation_ = true;
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
index 6b2da1ad..177722f 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
@@ -171,7 +171,7 @@
     SetNewNetworkForBaseNetworkManager();
     if (multiple_routes_requested) {
       network_manager_ = std::make_unique<FilteringNetworkManager>(
-          base_network_manager_.get(), GURL(), media_permission_.get(),
+          base_network_manager_.get(), media_permission_.get(),
           allow_mdns_obfuscation_);
       network_manager_->Initialize();
     } else {
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index cc42cf6..1f638a8 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -319,6 +319,7 @@
             'url::.+',
 
             # Nested namespaces under the blink namespace
+            'bindings::.+',
             'canvas_heuristic_parameters::.+',
             'compositor_target_property::.+',
             'cors::.+',
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
index d7cf7f6..f9b360a 100644
--- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
+++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -20,9 +20,9 @@
 crbug.com/982194 accessibility/table-with-empty-thead-causes-crash.html [ Failure ]
 crbug.com/982194 compositing/geometry/limit-layer-bounds-opacity-transition.html [ Failure ]
 crbug.com/982194 compositing/geometry/limit-layer-bounds-positioned.html [ Failure ]
-crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ]
-crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Pass ]
-crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure Pass ]
+crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Failure Pass ]
+crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Failure Pass ]
 crbug.com/982194 compositing/squashing/selection-repaint-with-gaps.html [ Failure ]
 crbug.com/982194 compositing/squashing/squash-transform-repainting-child.html [ Failure ]
 crbug.com/982194 compositing/squashing/squash-transform-repainting-transformed-child.html [ Failure ]
@@ -32,16 +32,16 @@
 crbug.com/982194 css3/selectors3/xml/css3-modsel-3.xml [ Failure Pass ]
 crbug.com/663585 editing/pasteboard/data-transfer-items-image-png.html [ Pass ]
 crbug.com/982194 editing/pasteboard/dragstart-contains-default-content.html [ Failure ]
-crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Failure ]
+crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Failure Pass ]
 crbug.com/982194 editing/selection/anchor-focus2.html [ Failure ]
 crbug.com/982194 editing/selection/anchor-focus3.html [ Failure ]
 crbug.com/982194 editing/selection/android-longtap-not-select-empty.html [ Failure ]
 crbug.com/982194 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ]
 crbug.com/982194 editing/selection/drag-select-rapidly.html [ Failure ]
 crbug.com/982194 editing/selection/drag-selection-nodes.html [ Failure ]
-crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Failure ]
+crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Failure Pass ]
 crbug.com/982194 editing/selection/first-letter-mouse-select-full-text.html [ Failure ]
-crbug.com/982194 editing/selection/focus-and-display-none.html [ Failure ]
+crbug.com/982194 editing/selection/focus-and-display-none.html [ Failure Pass ]
 crbug.com/982194 editing/selection/last-empty-inline.html [ Failure ]
 crbug.com/245154 editing/selection/modify_move/move-by-character-brute-force.html [ Pass ]
 crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Pass ]
@@ -52,11 +52,11 @@
 crbug.com/982194 editing/selection/mouse/mouse-selection-horizontal.html [ Failure ]
 crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-lr.html [ Failure ]
 crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-rl.html [ Failure ]
-crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure ]
+crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure Pass ]
 crbug.com/982194 editing/selection/mouse/select_across_readonly_input.html [ Failure ]
 crbug.com/982194 editing/selection/offset-from-point-complex-scripts.html [ Failure ]
 crbug.com/982194 editing/selection/offset-from-point.html [ Failure ]
-crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ]
+crbug.com/591099 editing/selection/paint-hyphen.html [ Failure Pass ]
 crbug.com/741259 editing/selection/select-bidi-run.html [ Failure ]
 crbug.com/982194 editing/selection/select-line-break-with-opposite-directionality.html [ Failure ]
 crbug.com/982194 editing/selection/select-out-of-floated-contenteditable.html [ Failure ]
@@ -71,40 +71,38 @@
 crbug.com/626703 external/wpt/acid/acid3/test.html [ Pass ]
 crbug.com/986282 external/wpt/client-hints/accept-ch-lifetime.tentative.https.html [ Crash Pass ]
 crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-non-replaced-height-001.xht [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-149.xht [ Failure Pass ]
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule3-outside-left-002.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule3-outside-right-002.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule7-outside-left-001.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/floats-rule7-outside-right-001.xht [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/floats/hit-test-floats-001.html [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-float-with-inline-container.html [ Crash Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-float-with-inline-container.html [ Failure ]
 crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-repeat-notation.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-overflow/overflow-inline-transform-relative.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Failure ]
 crbug.com/984438 external/wpt/css/css-scroll-snap/snap-at-user-scroll-end-manual.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-color.html [ Pass ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Failure ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Failure ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Failure Pass ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht [ Failure ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Pass ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Pass ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Pass ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Pass ]
-crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht [ Failure Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Failure Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht [ Failure Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht [ Failure Pass ]
+crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht [ Failure Pass ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-filled-001.xht [ Failure ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-open-001.xht [ Failure ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-shape-001.xht [ Failure ]
 crbug.com/949909 external/wpt/css/css-text-decor/text-emphasis-style-string-001.xht [ Failure ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-018.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-019.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-text/white-space/white-space-intrinsic-size-003.html [ Failure ]
-crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Pass ]
+crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-ui/text-overflow-ruby.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-writig-modes/sizing-orthog-htb-in-vlr-011.xht [ Failure ]
 crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-003.xht [ Failure ]
@@ -118,47 +116,47 @@
 crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-ltr.html [ Failure ]
 crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Failure ]
 crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-simple.html [ Failure ]
-crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-trailing-space-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-trailing-space-inline.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/csui/text-overflow-002.html [ Failure ]
 crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-applies-to-float.html [ Failure ]
 crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ]
 crbug.com/846656 external/wpt/css/selectors/focus-visible-002-manual.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/dependent-builtin.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/name-case-sensitivity.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/dependent-builtin.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-pad.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-prefix.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-range.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols-invalid.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-symbols.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/name-case-sensitivity.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends.html [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-symbolic.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001a.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001b.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-002.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-002.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-005.xhtml [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-002.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-vert-006.xhtml [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-wmvert-001.xhtml [ Failure ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-safe-overflow-position-001.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outde-padding-box-border-radius-001.html [ Failure ]
 crbug.com/982194 external/wpt/dom/ranges/Range-set.html [ Pass ]
@@ -189,13 +187,13 @@
 crbug.com/626703 external/wpt/infrastructure/testdriver/actions/eventOrder.html [ Timeout ]
 crbug.com/982194 external/wpt/intersection-observe/v2/scaled-target.html [ Failure ]
 crbug.com/982194 external/wpt/intersection-observer/v2/drop-shadow-filter-vertical-rl.html [ Failure ]
-crbug.com/982194 external/wpt/intersection-observer/v2/inline-occlusion.html [ Failure ]
+crbug.com/982194 external/wpt/intersection-observer/v2/inline-occlusion.html [ Failure Pass ]
 crbug.com/982194 external/wpt/largest-contentful-paint/larger-text.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/observe-text.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/text-with-display-style.html [ Timeout ]
-crbug.com/982194 external/wpt/payment-request/payment-request-abort-method.https.html [ Failure ]
-crbug.com/982194 external/wpt/payment-request/payment-request-canmakepayment-method.https.html [ Failure ]
-crbug.com/982194 external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https.html [ Failure ]
+crbug.com/982194 external/wpt/payment-request/payment-request-abort-method.https.html [ Failure Pass ]
+crbug.com/982194 external/wpt/payment-request/payment-request-canmakepayment-method.https.html [ Failure Pass ]
+crbug.com/982194 external/wpt/payment-request/payment-request-hasenrolledinstrument-method.tentative.https.html [ Failure Pass ]
 crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-down-css_touch.html [ Timeout ]
 crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-left-css_touch.html [ Timeout ]
 crbug.com/982194 external/wpt/pointerevents/extension/pointerevent_touch-action-pan-right-css_touch.html [ Timeout ]
@@ -209,10 +207,10 @@
 crbug.com/645988 external/wpt/uievents/order-of-events/focus-events/focus-manual.html [ Failure ]
 crbug.com/1002514 external/wpt/web-share/share-sharePromise-internal-slot.https.html [ Pass ]
 crbug.com/982194 external/wpt/webrtc/RTCPeerConnection-ondatachannel.html [ Failure Pass ]
-crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_properties.html [ Pass ]
-crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html [ Pass ]
-crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_properties.html [ Pass ]
-crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_shorthand.html [ Pass ]
+crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_properties.html [ Failure Pass ]
+crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html [ Failure Pass ]
+crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_properties.html [ Failure Pass ]
+crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/outline_shorthand.html [ Failure Pass ]
 crbug.com/982194 external/wpt/webxr/events_referenceSpace_reset_inline.https.html [ Timeout ]
 crbug.com/982194 fast/backgrounds/background-clip-text-multiline-linebreak.html [ Failure ]
 crbug.com/982194 fast/backgrounds/background-clip-text-multiline.html [ Crash ]
@@ -222,19 +220,17 @@
 crbug.com/982194 fast/block/float/float-in-float-hit-testing.html [ Failure ]
 crbug.com/982194 fast/block/float/overhanging-float-container-add-compositing.html [ Failure ]
 crbug.com/982194 fast/block/float/relative-painted-twice.html [ Failure ]
-crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure Pass ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ]
 crbug.com/982194 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ]
 crbug.com/982194 fast/block/positioning/rel-positioned-inline-changes-width.html [ Failure ]
 crbug.com/982194 fast/css-generated-content/table-parts-before-and-after.html [ Failure ]
 crbug.com/982194 fast/css/area-computedStyle.html [ Timeout ]
 crbug.com/982194 fast/css/first-line-hover-001.html [ Failure ]
 crbug.com/982194 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ]
-crbug.com/982194 fast/css/hover-active-quirks.html [ Failure ]
-crbug.com/982194 fast/css/invalidation-errors-2.html [ Failure Pass ]
-crbug.com/982194 fast/css/invalidation-errors.html [ Failure Pass ]
+crbug.com/982194 fast/css/hover-active-quirks.html [ Failure Pass ]
 crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ]
 crbug.com/982194 fast/css/pseudo-element-hit-test.html [ Crash ]
-crbug.com/982194 fast/css/unknown-pseudo-element-matching.html [ Failure ]
+crbug.com/982194 fast/css/unknown-pseudo-element-matching.html [ Failure Pass ]
 crbug.com/982194 fast/dnd/link-dragging-draggable-div-with-dragged-link.html [ Timeout ]
 crbug.com/982194 fast/dnd/link-dragging-draggable-div-with-link.html [ Timeout ]
 crbug.com/982194 fast/dnd/link-dragging-draggable-link.html [ Timeout ]
@@ -253,23 +249,23 @@
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-child-frame-content.html [ Failure ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inline-with-linebreak.html [ Failure ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings-bidi.html [ Failure ]
-crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure ]
+crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure Pass ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-culled-inlines.html [ Failure ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-embedded-frame-content.html [ Failure ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ]
 crbug.com/982194 fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ]
-crbug.com/982194 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure ]
-crbug.com/982194 fast/dom/shadow/touch-event.html [ Failure ]
+crbug.com/982194 fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure Pass ]
+crbug.com/982194 fast/dom/shadow/touch-event.html [ Failure Pass ]
 crbug.com/874695 fast/events/autoscroll-iframe-no-scrolling.html [ Pass ]
 crbug.com/982194 fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ]
-crbug.com/982194 fast/events/content-changed-during-drop.html [ Failure ]
-crbug.com/663847 fast/events/context-no-deselect.html [ Pass ]
+crbug.com/982194 fast/events/content-changed-during-drop.html [ Failure Pass ]
+crbug.com/663847 fast/events/context-no-deselect.html [ Failure Pass ]
 crbug.com/982194 fast/events/drag-in-frames.html [ Failure ]
 crbug.com/346473 fast/events/drag-on-mouse-move-cancelled.html [ Failure ]
-crbug.com/982194 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ]
+crbug.com/982194 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ]
 crbug.com/982194 fast/events/event-on-culled-inline-with-pseudo.html [ Failure ]
 crbug.com/874695 fast/events/frame-detached-in-mousedown.html [ Pass ]
-crbug.com/982194 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure ]
+crbug.com/982194 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure Pass ]
 crbug.com/982194 fast/events/open-window-from-another-frame.html [ Timeout ]
 crbug.com/982194 fast/events/pointerevents/mouse-node-remove.html [ Failure ]
 crbug.com/982194 fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Failure ]
@@ -282,16 +278,16 @@
 crbug.com/982194 fast/events/pointerevents/touch-pointer-events.html [ Failure ]
 crbug.com/874695 fast/events/popup-blocking-timers4.html [ Pass ]
 crbug.com/982194 fast/events/selectstart-by-single-click-with-shift.html [ Failure ]
-crbug.com/982194 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ]
-crbug.com/982194 fast/events/simulated-click-coords.html [ Failure ]
+crbug.com/982194 fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ]
+crbug.com/982194 fast/events/simulated-click-coords.html [ Failure Pass ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/982194 fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ]
 crbug.com/982194 fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
 crbug.com/874695 fast/forms/color/color-suggestion-picker-one-row-appearance.html [ Failure ]
 crbug.com/874695 fast/forms/color/color-suggestion-picker-two-row-appearance.html [ Failure ]
-crbug.com/982194 fast/forms/focus-selection-input.html [ Failure ]
-crbug.com/982194 fast/forms/focus-selection-textarea.html [ Failure ]
-crbug.com/982194 fast/forms/label/label-click.html [ Failure ]
+crbug.com/982194 fast/forms/focus-selection-input.html [ Failure Pass ]
+crbug.com/982194 fast/forms/focus-selection-textarea.html [ Failure Pass ]
+crbug.com/982194 fast/forms/label/label-click.html [ Failure Pass ]
 crbug.com/982194 fast/forms/label/label-selection-by-dragging.html [ Failure ]
 crbug.com/982194 fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ]
 crbug.com/874695 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Pass ]
@@ -304,33 +300,33 @@
 crbug.com/889721 fast/inline/outline-continuations.html [ Failure ]
 crbug.com/982194 fast/inline/relative-positioned-overflow.html [ Failure ]
 crbug.com/982194 fast/inline/styledEmptyInlinesWithBRs.html [ Failure ]
-crbug.com/982194 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Pass ]
-crbug.com/982194 fast/multicol/span/vertical-lr.html [ Pass ]
-crbug.com/982194 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ]
-crbug.com/982194 fast/multicol/vertical-lr/nested-columns.html [ Pass ]
+crbug.com/982194 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure Pass ]
+crbug.com/982194 fast/multicol/span/vertical-lr.html [ Failure Pass ]
+crbug.com/982194 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure Pass ]
+crbug.com/982194 fast/multicol/vertical-lr/nested-columns.html [ Failure Pass ]
 crbug.com/982194 fast/replaced/absolute-position-percentage-height.html [ Failure ]
 crbug.com/814953 fast/replaced/no-focus-ring-iframe.html [ Failure ]
 crbug.com/986018 fast/scroll-snap/snaps-for-different-key-granularity.html [ Pass ]
-crbug.com/889952 fast/selectors/selection-window-inactive.html [ Pass ]
+crbug.com/889952 fast/selectors/selection-window-inactive.html [ Failure Pass ]
 crbug.com/591099 fast/selectors/shadow-host-div-with-span.html [ Failure ]
 crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure ]
 crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-clip-path-selection.html [ Failure ]
 crbug.com/982194 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-fragmented-link.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-horizontally.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-iframe-nested.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-iframe-no-scrollable-content.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-iframe-recursive-offset-parent.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-iframe-with-outside-focusable-element.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-ignore-hidden-or-transparent.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-media-elements.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-only-clipped-overflow-content.html [ Failure ]
+crbug.com/982194 fast/spatial-navigation/snav-fragmented-link.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-horizontally.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-hidden-focusable-element.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe-zero-size.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-hidden-iframe.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-iframe-nested.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-iframe-no-scrollable-content.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-iframe-recursive-offset-parent.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-iframe-with-outside-focusable-element.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-ignore-hidden-or-transparent.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-media-elements.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-only-clipped-overflow-content.html [ Failure Pass ]
 crbug.com/982194 fast/spatial-navigation/snav-stay-in-overflow-div.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-tiny-table-traversal.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-zero-margin-content.html [ Failure ]
+crbug.com/982194 fast/spatial-navigation/snav-tiny-table-traversal.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-zero-margin-content.html [ Failure Pass ]
 crbug.com/874695 fast/table/multiple-captions-crash3.html [ Pass ]
 crbug.com/982194 fast/text-autosizing/layout-after-append.html [ Failure ]
 crbug.com/982194 fast/writing-mode/border-image-vertical-lr.html [ Failure ]
@@ -339,23 +335,23 @@
 crbug.com/718155 fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
 crbug.com/982194 hittesting/culled-inline-crash.html [ Failure ]
 crbug.com/982194 hittesting/inline-with-clip-path.html [ Failure ]
-crbug.com/982194 html/sections/body-legacy-colors.html [ Timeout ]
+crbug.com/982194 html/sections/body-legacy-colors.html [ Crash Pass Timeout ]
 crbug.com/591099 virtual/text-antialias/selection/inline-block-in-selection-root.html [ Pass ]
-crbug.com/591099 virtual/text-antialias/selection/selection-rect-line-height-too-small.html [ Pass ]
+crbug.com/591099 virtual/text-antialias/selection/selection-rect-line-height-too-small.html [ Failure Pass ]
 crbug.com/869364 crbug.com/874695 http/tests/devtools/console/console-correct-suggestions.js [ Crash Pass Timeout ]
 crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-dir-es6.js [ Crash Failure Pass Timeout ]
 crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-format-es6-2.js [ Crash Failure Pass Timeout ]
 crbug.com/451577 crbug.com/916975 http/tests/devtools/console/console-repeat-count.js [ Crash Failure Pass Timeout ]
 crbug.com/451577 http/tests/devtools/console/console-search.js [ Pass ]
-crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Pass ]
+crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Failure Pass ]
 crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Pass Timeout ]
 crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout ]
-crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Timeout ]
+crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Pass Timeout ]
 crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Timeout ]
 crbug.com/846982 crbug.com/874695 http/tests/devtools/editor/text-editor-formatter.js [ Crash Pass Timeout ]
 crbug.com/420008 crbug.com/749738 http/tests/devtools/editor/text-editor-word-jumps.js [ Crash Pass Timeout ]
 crbug.com/596486 http/tests/devtools/elements/insert-node.js [ Pass ]
-crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass ]
+crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Timeout ]
 crbug.com/937811 http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-3.js [ Pass Timeout ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js [ Crash Pass Timeout ]
 crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Pass Timeout ]
@@ -363,7 +359,7 @@
 crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Pass ]
 crbug.com/528419 http/tests/devtools/elements/styles-2/pseudo-elements.js [ Pass ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-3/style-autocomplete.js [ Crash Pass Timeout ]
-crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout ]
+crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Timeout ]
 crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Failure Timeout ]
 crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Timeout ]
 crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Failure ]
@@ -375,14 +371,14 @@
 crbug.com/982116 http/tests/devtools/elements/styles-4/styles-new-API.js [ Pass Timeout ]
 crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Timeout ]
 crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Crash Pass Timeout ]
-crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure ]
+crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure Pass ]
 crbug.com/451577 http/tests/devtools/elements/user-properties.js [ Pass ]
 crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Pass ]
 crbug.com/246190 crbug.com/989860 http/tests/devtools/indexeddb/live-update-indexeddb-list.js [ Crash Failure Pass Timeout ]
-crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Pass ]
+crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Failure Pass ]
 crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Pass ]
-crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout ]
+crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Timeout ]
 crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Failure ]
 crbug.com/679833 crbug.com/762529 http/tests/devtools/network/network-datareceived.js [ Crash Failure Timeout ]
 crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Failure ]
@@ -395,7 +391,7 @@
 crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Timeout ]
 crbug.com/874695 crbug.com/954319 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-in-multiple-workers.js [ Crash Pass Timeout ]
 crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Pass ]
-crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Pass ]
+crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Crash Pass ]
 crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Crash Failure Pass Timeout ]
 crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Pass ]
 crbug.com/450493 crbug.com/916975 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Crash Failure Pass Timeout ]
@@ -411,17 +407,17 @@
 crbug.com/982194 http/tests/input/discard-events-to-unstable-iframe.html [ Failure ]
 crbug.com/982194 http/tests/inspector-protocol/target/target-expose-devtools-protocol.js [ Failure ]
 crbug.com/982194 http/tests/media/video-frame-size-change.html [ Failure Pass ]
-crbug.com/24182 http/tests/misc/acid3.html [ Pass ]
+crbug.com/24182 http/tests/misc/acid3.html [ Failure Pass ]
 crbug.com/874695 http/tests/misc/drag-not-loaded-image.html [ Pass ]
-crbug.com/982194 http/tests/navigation/ping-cookie.html [ Timeout ]
-crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ]
-crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Timeout ]
-crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Timeout ]
+crbug.com/982194 http/tests/navigation/ping-cookie.html [ Pass Timeout ]
+crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Pass Timeout ]
+crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Pass Timeout ]
+crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Pass Timeout ]
 crbug.com/874695 http/tests/permissions/chromium/test-request-worker.html [ Pass Timeout ]
-crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Timeout ]
-crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Timeout ]
-crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Timeout ]
-crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Timeout ]
+crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Pass Timeout ]
+crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Pass Timeout ]
+crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Pass Timeout ]
+crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Pass Timeout ]
 crbug.com/982194 http/tests/security/mixedContent/insecure-css-resources.html [ Failure Pass ]
 crbug.com/24182 images/png-suite/test.html [ Pass ]
 crbug.com/982194 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Failure ]
@@ -429,9 +425,9 @@
 crbug.com/874695 crbug.com/936165 media/autoplay-muted.html [ Crash Pass Timeout ]
 crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ]
 crbug.com/942951 media/controls/controls-layout-in-different-size.html [ Pass ]
-crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure Timeout ]
+crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure ]
 crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Failure ]
-crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure Timeout ]
+crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure ]
 crbug.com/874695 media/remoteplayback/prompt-twice-throws.html [ Pass ]
 crbug.com/982194 paint/invalidation/background/background-misaligned.html [ Failure ]
 crbug.com/982194 paint/invalidation/block-layout-inline-children-replaced.html [ Failure ]
@@ -442,7 +438,6 @@
 crbug.com/982194 paint/invalidation/bugzilla-5699.html [ Failure ]
 crbug.com/982194 paint/invalidation/bugzilla-6278.html [ Failure ]
 crbug.com/982194 paint/invalidation/bugzilla-7235.html [ Failure ]
-crbug.com/982194 paint/invalidation/clip/subtree-root-clip-2.html [ Failure Pass ]
 crbug.com/982194 paint/invalidation/compositing/iframe-inside-squashed-layer.html [ Failure ]
 crbug.com/982194 paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer.html [ Failure ]
 crbug.com/982194 paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer.html [ Failure ]
@@ -558,906 +553,907 @@
 crbug.com/919789 paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos.html [ Failure ]
 crbug.com/919789 paint/invalidation/window-resize/window-resize-vertical-writing-mode.html [ Failure ]
 crbug.com/676229 plugins/mouse-click-plugin-clears-selection.html [ Failure ]
-crbug.com/982194 tables/mozilla/bugs/bug26553.html [ Failure Pass ]
-crbug.com/982194 touchadjustment/disabled-formelements.html [ Failure ]
-crbug.com/982194 touchadjustment/html-label.html [ Failure ]
-crbug.com/982194 touchadjustment/stylus-generated-gesture-tap.html [ Failure ]
-crbug.com/982194 touchadjustment/touch-inlines.html [ Failure ]
+crbug.com/982194 touchadjustment/disabled-formelements.html [ Failure Pass ]
+crbug.com/982194 touchadjustment/html-label.html [ Failure Pass ]
+crbug.com/982194 touchadjustment/stylus-generated-gesture-tap.html [ Failure Pass ]
+crbug.com/982194 touchadjustment/touch-inlines.html [ Failure Pass ]
 crbug.com/982194 touchadjustment/touch-links-longpress.html [ Failure ]
-crbug.com/982194 touchadjustment/touch-links-two-finger-tap.html [ Failure ]
+crbug.com/982194 touchadjustment/touch-links-two-finger-tap.html [ Failure Pass ]
 crbug.com/718155 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
 crbug.com/982194 virtual/audio-service/http/tests/media/video-frame-size-change.html [ Failure Pass ]
 crbug.com/874695 crbug.com/936165 virtual/audio-service/media/autoplay-muted.html [ Crash Pass Timeout ]
-crbug.com/982194 accessibility/dimensions-include-descendants.html [ Failure Pass ]
 crbug.com/982194 accessibility/selection-affinity.html [ Failure ]
-crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text.html [ Failure Pass ]
-crbug.com/982194 compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ]
-crbug.com/982194 compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ]
-crbug.com/982194 css3/filters/backdrop-filter-svg.html [ Pass ]
-crbug.com/982194 css3/tab-size-complex-path.html [ Failure Pass ]
+crbug.com/982194 animations/rotate-transform-equivalent.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-nested.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-squashing.html [ Failure ]
+crbug.com/982194 compositing/overflow/composited-scroll-with-fractional-translation.html [ Failure Pass ]
+crbug.com/982194 css2.1/t100801-c544-valgn-00-a-ag.html [ Failure ]
+crbug.com/982194 css2.1/t100801-c544-valgn-03-d-agi.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-overlapping-accelerated-elements.html [ Failure ]
+crbug.com/982194 css3/filters/backdrop-filter-svg.html [ Failure Pass ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-170b.xml [ Failure Pass ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-175a.xml [ Failure Pass ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184d.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184f.xml [ Failure Pass ]
 crbug.com/982194 custom-elements/form-submission-file.html [ Crash Pass ]
-crbug.com/982194 custom-elements/form-validation-bubble-appearance.html [ Failure Pass ]
-crbug.com/982194 editing/selection/extend-to-line-boundary.html [ Failure Pass ]
-crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-005.html [ Pass ]
+crbug.com/982194 editing/selection/5232159.html [ Failure ]
+crbug.com/982194 editing/selection/inline-closest-leaf-child.html [ Failure ]
+crbug.com/982194 editing/selection/subpixel-positioned-selection.html [ Failure ]
+crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-005.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/CSS2/abspos/abspos-in-block-in-inline-in-relpos-inline.html [ Failure ]
-crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-8.html [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-width-applies-to-014.xht [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-001.xht [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-002.xht [ Pass ]
-crbug.com/982194 external/wpt/css/CSS2/text/white-space-nowrap-attribute-001.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-number.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-text.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-break/avoid-border-break.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-b.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-multiple-boxes-c.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-015.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-016.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003b.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003c.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/counter-scoping-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/counter-scoping-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/counter-scoping-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/quote-scoping-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/quote-scoping-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/quote-scoping-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-contain/quote-scoping-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-021.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-022.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-025.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-content/quotes-033.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-details.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-table-001-inline.html [ Pass ]
+crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-123.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-8.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-width-applies-to-014.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-007.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/position-absolute-007.xht [ Crash Failure ]
+crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-001.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/text/text-decoration-va-length-002.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/CSS2/text/white-space-nowrap-attribute-001.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-number.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-align/baseline-rules/grid-item-input-type-text.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-image-5.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-image-first-line.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-break/avoid-border-break.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-b.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-color/t425-hsla-onscreen-multiple-boxes-c.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-replaced-003c.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/counter-scoping-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/counter-scoping-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/counter-scoping-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/quote-scoping-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/quote-scoping-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/quote-scoping-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-contain/quote-scoping-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-021.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-022.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-025.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-content/quotes-033.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-details.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-table-001-inline.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-display/display-flow-root-list-item-001.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-flexbox/negative-margins-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-feature-resolution-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-feature-settings-descriptor-01.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-kerning-03.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-05.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-06.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-03.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-04.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-05.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-06.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-07.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-09.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-10.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-11.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-12.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-13.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-14.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-15.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-16.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-17.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-18.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-descriptor-01.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-position-01.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/font-variant-position.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-fonts/variations/font-descriptor-range-reversed.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-columns-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-grid/grid-child-percent-basis-resize-1.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-flexbox/negative-margins-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-feature-resolution-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-feature-settings-descriptor-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-kerning-03.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-05.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-06.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-03.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-04.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-05.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-06.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-07.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-09.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-10.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-11.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-12.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-13.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-14.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-15.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-16.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-17.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-alternates-18.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-descriptor-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-position-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/font-variant-position.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-fonts/variations/font-descriptor-range-reversed.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-columns-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/animation/grid-template-rows-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-child-percent-basis-resize-1.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-grid/grid-layout-properties.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-images/tiled-gradients.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-ignores-first-letter-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-images/tiled-gradients.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-intrinsic-size/intrinsic-size-015.html [ Crash Pass ]
-crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-circle.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-disc.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-square.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/counter-set-001.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-circle.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-disc.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/content-property/marker-text-matches-square.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/counter-set-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-lists/inline-block-list-marker.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-lists/inline-block-list.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-lists/inline-list-marker.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-lists/inline-list-with-table-child.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-lists/inline-list-with-table-child.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-lists/inline-list.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-lists/li-list-item-counter.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/li-value-counter-reset-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-lists/list-item-definition.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-lists/li-list-item-counter.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/li-value-counter-reset-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/li-value-reversed-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/list-item-definition.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-002.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-003.html [ Failure ]
-crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-005b.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-005b.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-lists/list-style-type-string-007.html [ Failure ]
 crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-recursion-002.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-003.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-004.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-005.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip-transform.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip.svg [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-path-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-polygon-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-000.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-009.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-010.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-011.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/multicol-width-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-009.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-010.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-012.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-014.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-024.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-center-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-position/position-absolute-center-002.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/first-letter-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-child-marker.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-marker.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-before-after.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-out-of-flow.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/grammar-error-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-008.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-009.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-010.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-011.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-content-014.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-font-variant-numeric-normal.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/marker-list-style-position.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-pseudo/spelling-error-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-scrollbars/textarea-scrollbar-width-none.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-001.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-002.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-003.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-004.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/clone-intrinsic-size.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/anonymous-table-ws-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/subpixel-collapsed-borders-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-height-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/subpixel-table-width-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/table-has-box-sizing-border-box-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/toggle-row-display-property-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-overline-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-underline-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-010.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-012.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-021.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-span-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/hyphens/shy-styling-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-in-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-control-chars-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-end-of-line-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-016.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-017.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-normal-keep-all-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size-spacing-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-align/text-align-last-empty-inline.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-indent/text-indent-tab-positions-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-auto-002.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-bold-script-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-initial-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-looped-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-sans-serif-italic-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-script-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-stretched-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-tailed-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-026.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-033.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-tailoring-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-upperlower-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-012.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-019.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-012.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-009.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-my-000.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-text/writing-system/writing-system-text-transform-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-transforms/perspective-transforms-equivalence.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/appearance-textfield-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/box-sizing-014.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/box-sizing-019.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/box-sizing-024.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/box-sizing-025.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/outline-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/outline-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/text-overflow-015.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/text-overflow-021.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/text-overflow-026.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/text-overflow-028.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-menulist-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-textfield-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-values/ch-unit-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-values/ch-unit-014.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-values/ch-unit-015.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-values/ch-unit-017.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-values/ch-unit-018.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-dynamic-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/available-size-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/available-size-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/available-size-013.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/available-size-014.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/direction-upright-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001a.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001b.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001c.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001d.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001e.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001f.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001g.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001i.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001k.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001m.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001o.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001p.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-003.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-004.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/clip-path-shape-circle-005.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip-transform.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-circle-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-ellipse-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-path-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-masking/clip-path/clip-path-polygon-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-nested-balancing-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-009.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-width-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-009.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-010.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-overflow/webkit-line-clamp-024.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-center-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-center-002.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-position/position-sticky-nested-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-letter-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-child-marker.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-letter-exclude-inline-marker.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-line-change-inline-color-nested.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-line-change-inline-color.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-before-after.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-line-with-out-of-flow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/grammar-error-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-007.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-008.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-009.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-010.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-011.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-content-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-font-variant-numeric-normal.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/marker-list-style-position.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-pseudo/spelling-error-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-scrollbars/textarea-scrollbar-width-none.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/clone-intrinsic-size.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/image-min-max-content-intrinsic-size-change-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/anonymous-table-ws-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/subpixel-collapsed-borders-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-height-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/subpixel-table-cell-width-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/subpixel-table-width-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/table-has-box-sizing-border-box-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/toggle-row-display-property-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-tables/visibility-collapse-colspan-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-shorthands-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-subelements-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-overline-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-underline-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-010.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text-decor/text-emphasis-style-021.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/hyphens/hyphens-span-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/hyphens/shy-styling-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-control-chars-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-end-of-line-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/letter-spacing/letter-spacing-nesting-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-016.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-017.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-inline-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-normal-keep-all-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size-spacing-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-indent/text-indent-tab-positions-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-auto-002.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-bold-script-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-initial-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-looped-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-sans-serif-italic-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-script-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-stretched-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/math/text-transform-math-tailed-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-026.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-capitalize-033.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-tailoring-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-upperlower-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/pre-wrap-019.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/textarea-pre-wrap-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/trailing-ideographic-space-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-inline-009.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-my-000.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-text/writing-system/writing-system-text-transform-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-transforms/perspective-transforms-equivalence.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/appearance-textfield-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/box-sizing-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/box-sizing-019.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/box-sizing-024.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/box-sizing-025.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/outline-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/outline-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-015.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-021.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-026.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-028.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-menulist-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-ui/webkit-appearance-textfield-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-values/ch-unit-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-values/ch-unit-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-values/ch-unit-015.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-values/ch-unit-017.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-values/ch-unit-018.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-will-change/will-change-abspos-cb-dynamic-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/available-size-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/available-size-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/available-size-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/available-size-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/direction-upright-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-013.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-008.xht [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint-mixed-font-sizes.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/cssom-view/getBoundingClientRect-empty-inline.html [ Failure Pass ]
-crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline-inline-child.html [ Failure ]
-crbug.com/982194 external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Pass ]
-crbug.com/982194 external/wpt/css/motion/offset-path-ray-009.html [ Pass ]
-crbug.com/982194 external/wpt/css/motion/offset-path-ray-contain-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-align-content-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-008.xht [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/css-writing-modes/text-combine-upright-value-all-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline-inline-child.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/mediaqueries/viewport-script-dynamic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/motion/offset-path-ray-009.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/motion/offset-path-ray-contain-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-rtl-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-content-vertWM-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-rtl-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-align-self-vertWM-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-align-content-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-rtl-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-content-vertWM-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-img-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-rtl-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-img-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-rtl-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/disclosure-styles.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function-invalid.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/symbols-function.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-additive-invalid.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-additive.html [ Failure ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-alphabetic-invalid.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-cyclic-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends-invalid.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-extends-invalid.html [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed-invalid.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-numeric-invalid.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-symbolic-invalid.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-006.xhtml [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-baseline-horiz-006.xhtml [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Failure Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-010.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-013.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-014.html [ Pass ]
 crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-015.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03b.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-007.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-009.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-010.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-012.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-037.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-043.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-046.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-047.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-048.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-049.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-022.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/logical-physical-mapping-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-001.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-002.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-003.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-004.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005a.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Pass ]
-crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006a.html [ Pass ]
-crbug.com/982194 external/wpt/encoding/eof-utf-8-three.html [ Pass ]
-crbug.com/982194 external/wpt/encoding/eof-utf-8-two.html [ Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-03b.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-007.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-009.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-010.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-037.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-043.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-046.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-047.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-048.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-049.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-022.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-declaration-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-reference-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-external-supports-01.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/logical-physical-mapping-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-005a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Failure Pass ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006a.html [ Failure Pass ]
+crbug.com/982194 external/wpt/encoding/eof-utf-8-three.html [ Failure Pass ]
+crbug.com/982194 external/wpt/encoding/eof-utf-8-two.html [ Failure Pass ]
 crbug.com/982194 external/wpt/fetch/metadata/download.tentative.https.sub.html [ Failure ]
+crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-05.html [ Failure Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-17.html [ Failure Pass ]
 crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-19.html [ Failure ]
-crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-1.html [ Pass ]
+crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-23.html [ Failure Pass ]
+crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-1.html [ Failure Pass ]
 crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3q.html [ Failure ]
 crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3s.html [ Failure ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/width.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1i.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1j.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1k.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1l.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/anonymous-button-content-box.html [ Pass ]
-crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/inline-level.html [ Pass ]
-crbug.com/982194 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html [ Pass ]
-crbug.com/982194 external/wpt/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html [ Pass ]
-crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Pass ]
-crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/width.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1i.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1j.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1k.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-1l.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/anonymous-button-content-box.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/rendering/widgets/button-layout/inline-level.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-non-snap-to-lines.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Failure Pass ]
+crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Failure Pass ]
 crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html [ Pass ]
 crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html [ Pass ]
 crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ]
 crbug.com/982194 external/wpt/html/user-activation/activation-hierarchy-parent-manual.sub.tentative.html [ Timeout ]
 crbug.com/982194 external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Pass Timeout ]
-crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Pass ]
-crbug.com/982194 external/wpt/infrastructure/assumptions/document-fonts-ready.html [ Failure Pass ]
-crbug.com/982194 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Pass ]
-crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Pass ]
-crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Pass ]
-crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Pass ]
-crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Pass ]
-crbug.com/982194 external/wpt/intersection-observer/inline-client-rect.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/reftest/legacy/reftest_fuzzy_chain_ini.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_full.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_ref_only.html [ Failure Pass ]
+crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_ini_short.html [ Failure Pass ]
 crbug.com/982194 external/wpt/intersection-observer/v2/blur-filter.html [ Failure ]
 crbug.com/982194 external/wpt/intersection-observer/v2/delay-test.html [ Failure Pass ]
 crbug.com/982194 external/wpt/largest-contentful-paint/element-only-when-fully-active.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/first-paint-equals-lcp-text.html [ Timeout ]
 crbug.com/982194 external/wpt/largest-contentful-paint/toJSON.html [ Timeout ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-008.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-overall.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-color-002.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-2.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-3.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-default-padding.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-legacy-bevelled-attribute.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-001.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-004.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-mrow-001.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-numalign-denomalign-001.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-008.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/direction/direction-overall.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-color-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-2.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically-3.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-created-dynamically.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-default-padding.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-legacy-bevelled-attribute.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-linethickness-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-mrow-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-numalign-denomalign-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-rendering-from-in-flow.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-visibility-001.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mfenced-element-001.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mrow-like-elements-002.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-dynamic.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-fallback.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-minus-plus.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-default.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-dynamic.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/fractions/frac-visibility-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/menclose/legacy-menclose-radical-notation.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mfenced-element-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/mrow/legacy-mrow-like-elements-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-dynamic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-fallback.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form-minus-plus.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-form.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-default.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-dynamic.html [ Failure Pass ]
 crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits-from-in-flow.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-paint-lspace-rspace.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-movablelimits.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/operators/mo-paint-lspace-rspace.html [ Failure Pass ]
 crbug.com/982194 external/wpt/mathml/presentation-markup/radicals/radical-rendering-from-in-flow.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/subsup-legacy-scriptshift-attributes-001.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/underover-legacy-align-attribute-001.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/subsup-legacy-scriptshift-attributes-001.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/scripts/underover-legacy-align-attribute-001.html [ Failure Pass ]
 crbug.com/982194 external/wpt/mathml/presentation-markup/spaces/mspace-children.html [ Failure ]
 crbug.com/982194 external/wpt/mathml/presentation-markup/tables/table-001.html [ Crash ]
-crbug.com/982194 external/wpt/mathml/presentation-markup/tokens/ms-001.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/color-002.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/color-003.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/color-004.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/display-1.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-011.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-012.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-013.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-014.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-015.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-auto.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-fraktur.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-italic.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-sans-serif.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-script.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-case-sensitivity.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-double-struck.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-fraktur.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-initial.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-italic.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-looped.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-monospace.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-italic.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-script.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-stretched.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-tailed.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-002.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-003.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-004.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/html5-tree/display-2.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/presentation-markup/tokens/ms-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/color-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/color-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/color-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/display-1.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-011.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-012.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-013.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-014.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/displaystyle-015.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-auto.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-fraktur.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-italic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-sans-serif.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold-script.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-bold.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-case-sensitivity.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-double-struck.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-fraktur.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-initial.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-italic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-looped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-monospace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif-italic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-sans-serif.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-script.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-stretched.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/mathvariant-tailed.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-002.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-003.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/css-styling/visibility-004.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/html5-tree/display-2.html [ Failure Pass ]
 crbug.com/982194 external/wpt/mathml/relations/html5-tree/href-click-3.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-2.html [ Pass ]
-crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-3.html [ Pass ]
+crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-2.html [ Failure Pass ]
+crbug.com/982194 external/wpt/mathml/relations/html5-tree/integration-point-3.html [ Failure Pass ]
 crbug.com/982194 external/wpt/media-source/mediasource-getvideoplaybackquality.html [ Pass ]
-crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort.tentative.https.window.html [ Timeout ]
+crbug.com/982194 external/wpt/mediacapture-record/MediaRecorder-destroy-script-execution.html [ Pass ]
+crbug.com/982194 external/wpt/mediacapture-record/MediaRecorder-stop.html [ Pass ]
+crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort.tentative.https.window.html [ Pass Timeout ]
 crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage.tentative.https.window.html [ Timeout ]
 crbug.com/982194 external/wpt/payment-method-basic-card/apply_the_modifiers.html [ Timeout ]
 crbug.com/982194 external/wpt/payment-method-basic-card/steps_for_selecting_the_payment_handler.html [ Timeout ]
-crbug.com/982194 external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch.html [ Pass Timeout ]
-crbug.com/982194 external/wpt/pointerevents/pointerevent_touch-action-span-none-test_touch.html [ Pass Timeout ]
-crbug.com/982194 external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Pass ]
-crbug.com/982194 external/wpt/quirks/text-decoration-doesnt-propagate-into-tables/quirks.html [ Pass ]
+crbug.com/982194 external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Failure Pass ]
+crbug.com/982194 external/wpt/quirks/text-decoration-doesnt-propagate-into-tables/quirks.html [ Failure Pass ]
 crbug.com/982194 external/wpt/screen-orientation/onchange-event-subframe.html [ Pass ]
-crbug.com/982194 external/wpt/svg/painting/marker-005.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/painting/marker-006.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/path/bearing/zero.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/path/closepath/segment-completing.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/rendering/order/z-index.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/text/reftests/text-complex-002.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/text/reftests/text-inline-size-003.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/text/reftests/text-multiline-003.svg [ Pass ]
-crbug.com/982194 external/wpt/svg/text/reftests/text-xml-space-001.svg [ Pass ]
+crbug.com/982194 external/wpt/svg/painting/marker-005.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/painting/marker-006.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/path/bearing/zero.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/path/closepath/segment-completing.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/rendering/order/z-index.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/text/reftests/text-complex-002.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/text/reftests/text-inline-size-003.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/text/reftests/text-multiline-003.svg [ Failure Pass ]
+crbug.com/982194 external/wpt/svg/text/reftests/text-xml-space-001.svg [ Failure Pass ]
 crbug.com/982194 external/wpt/trusted-types/eval-csp-no-tt.tentative.html [ Failure ]
 crbug.com/982194 external/wpt/trusted-types/eval-no-csp-no-tt-default-policy.tentative.html [ Failure ]
 crbug.com/982194 external/wpt/trusted-types/eval-no-csp-no-tt.tentative.html [ Failure ]
-crbug.com/982194 external/wpt/uievents/click/click_event_target_child_parent.html [ Pass Timeout ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_50.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50_size_gt_maximum_size.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50_size_gt_maximum_size.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_end.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_start.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/basic.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_LF_u05D0.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2028_u05D0.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2029_u05D0.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0628_first.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u06E9_no_strong_dir.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_align_position_line_size_while_paused.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_line.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text_while_paused.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely_all_cues_have_same_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/media_height_19.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/single_quote.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_90.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_-2_wrapped_cue_grow_upwards.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_0_is_top.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_1_wrapped_cue_grow_downwards.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_50_percent.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/navigate_cue_position.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/one_line_cue_plus_wrapped_cue.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/repaint.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand_css_relative_url.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hex.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_rgba.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/cue_selector_single_colon.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/inherit_values_from_media_element.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline_underline_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_underline.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_text-combine-upright.html [ Crash Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_normal_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_nowrap_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-line_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-wrap_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand_css_relative_url.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_future.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_past.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_transition_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_normal_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_nowrap.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-line_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-wrap_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class_object_specific_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_future.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_past.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_vertical_text-combine-upright.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_nowrap.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class_object_specific_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hex.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/cue_func_selector_single_colon.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_animation_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_future.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_past.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_transition_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_nowrap.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class_object_specific_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline_underline_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_underline.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/type_selector_root.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_animation_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_future.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_past.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_transition_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_nowrap.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class_object_specific_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_animation_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_color.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_namespace.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-decoration_line-through.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-shadow.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_future.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_past.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_transition_with_timestamp.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_voice_attribute.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_nowrap.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class_object_specific_selector.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-line_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-wrap_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre_wrapped.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/bold_object_default_font-style.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/italic_object_default_font-style.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/underline_object_default_font-style.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/size_50.html [ Pass ]
-crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html [ Pass ]
-crbug.com/982194 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Pass ]
+crbug.com/982194 external/wpt/web-animations/interfaces/Animation/style-change-events.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_50.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_gt_50_size_gt_maximum_size.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_lt_50_size_gt_maximum_size.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_end.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_start.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/basic.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/bidi_ruby.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_LF_u05D0.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2028_u05D0.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u002E_u2029_u05D0.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0628_first.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u06E9_no_strong_dir.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_lr.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/vertical_rl.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/cue_too_long.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_align_position_line_size_while_paused.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_line.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_text_while_paused.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely_all_cues_have_same_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/media_height_19.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/single_quote.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_90.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_-2_wrapped_cue_grow_upwards.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_0_is_top.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_1_wrapped_cue_grow_downwards.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_50_percent.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/navigate_cue_position.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/one_line_cue_plus_wrapped_cue.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_x_50_percent.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/regionanchor_y_50_percent.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/viewportanchor_x_50_percent.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/regions/width_50_percent.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/repaint.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/background_shorthand_css_relative_url.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hex.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_rgba.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/cue_selector_single_colon.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/inherit_values_from_media_element.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_overline_underline_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-decoration_underline.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_ruby-position.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/vertical_text-combine-upright.html [ Crash Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_normal_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_nowrap_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-line_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-wrap_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand_css_relative_url.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_outline_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_future.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_timestamp_past.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_transition_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_normal_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_nowrap.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-line_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre-wrap_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_with_class_object_specific_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_font_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_future.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_timestamp_past.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_vertical_text-combine-upright.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_nowrap.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_with_class_object_specific_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hex.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/cue_func_selector_single_colon.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_animation_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_font_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_outline_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_future.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_timestamp_past.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_transition_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_nowrap.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_with_class_object_specific_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline_underline_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_underline.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/type_selector_root.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_animation_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_font_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_outline_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_future.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_timestamp_past.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_transition_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_nowrap.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/underline_object/underline_with_class_object_specific_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_animation_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_background_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_color.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_font_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_namespace.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_shorthand.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-decoration_line-through.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_text-shadow.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_future.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_timestamp_past.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_transition_with_timestamp.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_voice_attribute.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_nowrap.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_with_class_object_specific_selector.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-line_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre-wrap_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_pre_wrapped.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/bold_object_default_font-style.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/italic_object_default_font-style.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/default_styles/underline_object_default_font-style.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/size_50.html [ Failure Pass ]
+crbug.com/982194 external/wpt/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html [ Failure Pass ]
+crbug.com/982194 fast/backgrounds/border-radius-split-background.html [ Failure ]
+crbug.com/982194 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure Pass ]
+crbug.com/982194 fast/block/float/clear-negative-margin-top.html [ Failure ]
+crbug.com/982194 fast/block/float/float-not-removed-from-next-sibling2.html [ Failure ]
 crbug.com/982194 fast/block/float/hittest-float-in-anchor.html [ Failure ]
-crbug.com/982194 fast/borders/border-image-outset-split-inline-vertical-lr.html [ Pass ]
+crbug.com/982194 fast/block/float/overhanging-float-remove-from-absolute-position-block.html [ Failure ]
+crbug.com/982194 fast/block/float/overhanging-float-remove-from-absolute-position-block2.html [ Failure ]
+crbug.com/982194 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ]
+crbug.com/982194 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ]
+crbug.com/982194 fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Failure ]
+crbug.com/982194 fast/block/positioning/058.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-2.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr-3.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-ltr.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-2.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-rtl.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-short-ltr.html [ Failure ]
+crbug.com/982194 fast/block/positioning/absolute-in-inline-short-rtl.html [ Failure ]
+crbug.com/982194 fast/block/positioning/hiding-inside-relpositioned-inline.html [ Failure ]
+crbug.com/982194 fast/borders/border-image-outset-split-inline-vertical-lr.html [ Failure Pass ]
+crbug.com/982194 fast/borders/border-image-outset-split-inline.html [ Failure ]
+crbug.com/982194 fast/borders/border-styles-split.html [ Failure ]
 crbug.com/982194 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ]
-crbug.com/982194 fast/borders/outline-alpha-inline.html [ Failure Pass ]
-crbug.com/982194 fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ]
-crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Pass ]
-crbug.com/982194 fast/dom/Element/client-rect-list-argument.html [ Failure Pass ]
-crbug.com/982194 fast/dom/Element/getBoundingClientRect.html [ Failure Pass ]
-crbug.com/982194 fast/dom/Element/getClientRects.html [ Failure Pass ]
-crbug.com/982194 fast/dom/Range/getClientRects.html [ Failure Pass ]
-crbug.com/982194 fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure Pass ]
+crbug.com/982194 fast/css-generated-content/visibleContentHiddenParent.html [ Failure ]
+crbug.com/982194 fast/css/clip-text-in-scaled-div.html [ Failure ]
+crbug.com/982194 fast/css/first-line-change-color-direct.html [ Failure ]
+crbug.com/982194 fast/css/first-line-change-color.html [ Failure ]
+crbug.com/982194 fast/css/outline-auto-empty-rects.html [ Failure ]
+crbug.com/982194 fast/css/text-overflow-ellipsis-vertical-hittest.html [ Failure ]
+crbug.com/982194 fast/css3-text/css3-text-decoration/repaint/repaint-text-decoration-style.html [ Failure ]
+crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-dynamic.html [ Failure ]
+crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure Pass ]
 crbug.com/982194 fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Pass ]
 crbug.com/982194 fast/dom/rtl-scroll-to-leftmost-and-resize.html [ Pass Timeout ]
-crbug.com/982194 fast/dom/shadow/gesture-tapHighlight-shadow-tree.html [ Failure Pass ]
 crbug.com/982194 fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/982194 fast/events/tabindex-focus-blur-all.html [ Pass ]
 crbug.com/982194 fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ]
-crbug.com/982194 fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ]
-crbug.com/982194 fast/inline/br-client-rect.html [ Failure Pass ]
-crbug.com/982194 fast/inline/continuation-outlines-with-layers.html [ Failure Pass ]
-crbug.com/982194 fast/inline/continuation-outlines.html [ Failure Pass ]
-crbug.com/982194 fast/loader/document-with-fragment-url-1.html [ Pass Timeout ]
-crbug.com/982194 fast/loader/document-with-fragment-url-3.html [ Pass Timeout ]
-crbug.com/982194 fast/loader/document-with-fragment-url-4.html [ Pass Timeout ]
+crbug.com/982194 fast/events/updateLayoutForHitTest.html [ Failure Pass ]
+crbug.com/982194 fast/hidpi/clip-text-in-hidpi.html [ Failure ]
+crbug.com/982194 fast/history/visited-link-hover-emphasis-color.html [ Failure ]
+crbug.com/982194 fast/history/visited-link-hover-text-decoration-color.html [ Failure ]
+crbug.com/982194 fast/history/visited-link-hover-text-fill-color.html [ Failure ]
+crbug.com/982194 fast/history/visited-link-hover-text-stroke-color.html [ Failure ]
+crbug.com/982194 fast/history/visited-link-hover.html [ Failure ]
+crbug.com/982194 fast/layers/normal-flow-hit-test.html [ Failure Pass ]
+crbug.com/982194 fast/lists/markers-in-selection.html [ Failure Pass ]
 crbug.com/982194 fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/column-rules.html [ Failure ]
-crbug.com/982194 fast/multicol/vertical-lr/float-avoidance.html [ Pass ]
+crbug.com/982194 fast/multicol/vertical-lr/float-avoidance.html [ Failure Pass ]
 crbug.com/982194 fast/multicol/vertical-lr/float-big-line.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/float-break.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/float-content-break.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/float-edge.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/float-paginate.html [ Failure ]
 crbug.com/982194 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
-crbug.com/982194 fast/multicol/vertical-rl/nested-columns.html [ Pass ]
+crbug.com/982194 fast/multicol/vertical-rl/nested-columns.html [ Failure Pass ]
 crbug.com/982194 fast/overflow/scrollbar-click-retains-focus.html [ Failure ]
 crbug.com/982194 fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Failure ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius-001.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon.html [ Crash Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-image-margin-001.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-image-margin-002.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-001.html [ Failure Pass ]
-crbug.com/982194 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-002.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-1st-stop.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-container-only-white-space.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-container-white-space.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-date.html [ Failure Pass ]
 crbug.com/982194 fast/spatial-navigation/snav-expandable-sub-menu.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-first-fragment-offscreen.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-first-rtl-fragment-offscreen.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-focus-rect-contains-links.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-fragmented-link-partially-offscreen.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-fully-aligned-vertically.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-iframe-no-focusable-content.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-input.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-keyboard-scrollers-search-origin-bug.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-first-fragment-offscreen.html [ Failure Pass ]
+crbug.com/982194 fast/spatial-navigation/snav-first-rtl-fragment-offscreen.html [ Failure Pass ]
 crbug.com/982194 fast/spatial-navigation/snav-more-aligned-at-top.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-multiple-select.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-navigate-visible-elements-only2.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-offscreen-content.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-radio-group.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-radio.html [ Failure Pass ]
 crbug.com/982194 fast/spatial-navigation/snav-search-focused-scroller-first.html [ Failure ]
-crbug.com/982194 fast/spatial-navigation/snav-single-select-list.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-single-select.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-skippable-candidate.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-table-traversal.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-textarea.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-two-elements-one-line.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-unit-overflow-and-scroll-in-direction.html [ Failure Pass ]
-crbug.com/982194 fast/spatial-navigation/snav-use-visual-viewport.html [ Failure Pass ]
-crbug.com/982194 fast/sub-pixel/size-of-span-with-different-positions.html [ Failure Pass ]
-crbug.com/982194 fast/sub-pixel/width-of-inline-in-float.html [ Failure Pass ]
-crbug.com/982194 fast/writing-mode/flipped-blocks-text-map-local-to-container.html [ Failure Pass ]
-crbug.com/982194 fragmentation/repeating-thead-under-repeating-thead.html [ Pass ]
-crbug.com/982194 hittesting/border-hittest-inlineFlowBox.html [ Failure Pass ]
-crbug.com/982194 hittesting/culled-inline.html [ Failure Pass ]
-crbug.com/982194 http/tests/css/css-image-valued-shape.html [ Failure Pass ]
+crbug.com/982194 fast/sub-pixel/inline-block-baseline.html [ Failure ]
+crbug.com/982194 fast/writing-mode/background-vertical-lr.html [ Failure ]
+crbug.com/982194 fast/writing-mode/background-vertical-rl.html [ Failure ]
+crbug.com/982194 fragmentation/repeating-thead-under-repeating-thead.html [ Failure Pass ]
+crbug.com/982194 html/details_summary/details-writing-mode-align-center.html [ Failure ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Pass Timeout ]
 crbug.com/982194 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Pass Timeout ]
-crbug.com/982194 http/tests/devtools/console/console-prompt-keyboard.js [ Failure Pass ]
-crbug.com/982194 http/tests/devtools/editor/text-editor-accessibility.js [ Failure Pass ]
-crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/cache-storage/cache-data.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-ctrl-d-2.js [ Timeout ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-reveal-line.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Timeout ]
 crbug.com/982194 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Pass Timeout ]
-crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Failure Pass ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Timeout ]
 crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Timeout ]
 crbug.com/982194 http/tests/devtools/indexeddb/database-refresh-view.js [ Pass ]
-crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass ]
+crbug.com/982194 http/tests/devtools/network/network-search.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-navigator.js [ Pass Timeout ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass Timeout ]
 crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-location.js [ Pass ]
 crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-crafted-frame-add.js [ Pass ]
 crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-in-crafted-frame.js [ Pass ]
-crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass ]
+crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass Timeout ]
 crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-htmlimports.js [ Pass ]
 crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Pass Timeout ]
 crbug.com/982194 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Pass ]
@@ -1468,11 +1464,8 @@
 crbug.com/982194 http/tests/devtools/sources/debugger/navigator-view.js [ Crash Pass ]
 crbug.com/982194 http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Pass ]
 crbug.com/982194 http/tests/history/client-redirect-after-push-state.html [ Failure Pass ]
-crbug.com/982194 http/tests/navigation/anchor-frames-same-origin.html [ Failure Pass ]
+crbug.com/982194 http/tests/uri/css-href.php [ Failure ]
 crbug.com/982194 ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ]
-crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-captureSnapshot-pseudo-element.js [ Failure Pass ]
-crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element.js [ Failure Pass ]
-crbug.com/982194 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Failure Pass ]
 crbug.com/982194 jquery/attributes.html [ Pass ]
 crbug.com/982194 jquery/core.html [ Pass ]
 crbug.com/982194 jquery/css.html [ Pass ]
@@ -1483,17 +1476,37 @@
 crbug.com/982194 jquery/offset.html [ Pass ]
 crbug.com/982194 jquery/traversing.html [ Pass ]
 crbug.com/982194 media/video-canvas-draw.html [ Failure Pass ]
-crbug.com/982194 paint/inline/outline-offset.html [ Failure Pass ]
+crbug.com/982194 overflow/overflow-inline-003.html [ Failure ]
+crbug.com/982194 paint/background/background-clip-text-inline.html [ Failure ]
 crbug.com/982194 paint/invalidation/compositing/float-under-composited-inline.html [ Failure ]
 crbug.com/982194 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ]
+crbug.com/982194 paint/invalidation/forms/slider-thumb-float.html [ Failure ]
 crbug.com/982194 paint/invalidation/multi-layout-one-frame.html [ Failure ]
+crbug.com/982194 paint/invalidation/outline/focus-layers.html [ Failure ]
 crbug.com/982194 paint/invalidation/position/absolute-position-moved.html [ Failure ]
+crbug.com/982194 paint/invalidation/selection/selection-repaint.html [ Failure ]
 crbug.com/982194 paint/invalidation/svg/scroll-hit-test.xhtml [ Failure ]
+crbug.com/982194 paint/invalidation/text-decoration-invalidation.html [ Failure ]
+crbug.com/982194 paint/overflow/composited-rounded-clip-floating-element.html [ Failure ]
+crbug.com/982194 paint/selection/first_letter/first_letter_1fr.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2ff.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2fn.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2fr.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2nf.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2nr.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2rf.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2rn.html [ Failure Pass ]
+crbug.com/982194 paint/selection/first_letter/first_letter_2rr.html [ Failure Pass ]
+crbug.com/982194 paint/selection/text-selection-inline-block-rtl.html [ Failure ]
+crbug.com/982194 paint/selection/text-selection-inline-block.html [ Failure ]
+crbug.com/982194 paint/selection/text-selection-newline-span-across-line.html [ Failure Pass ]
 crbug.com/982194 svg/custom/visibility-enable-on-svg-element-contained-border-radius.html [ Failure ]
 crbug.com/982194 svg/custom/visibility-enable-on-svg-element-contained-viewport-size.html [ Failure ]
 crbug.com/982194 svg/custom/visibility-enable-on-svg-element.html [ Failure ]
-crbug.com/982194 touchadjustment/event-triggered-widgets.html [ Failure Pass ]
-crbug.com/982194 touchadjustment/touch-links-active.html [ Failure Pass ]
+crbug.com/982194 svg/zoom/page/zoom-svg-through-object-with-override-size.html [ Failure ]
+crbug.com/982194 tables/layering/paint-test-layering-1.html [ Failure ]
+crbug.com/982194 tables/layering/paint-test-layering-2.html [ Failure ]
+crbug.com/982194 transforms/3d/point-mapping/3d-point-mapping-deep.html [ Pass ]
 crbug.com/982194 virtual/android/url-bar/bottom-and-top-fixed-sticks-to-top.html [ Failure ]
 crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ]
 crbug.com/942951 virtual/audio-service/media/controls/controls-layout-in-different-size.html [ Pass ]
@@ -1504,373 +1517,410 @@
 crbug.com/982194 virtual/audio-service/media/stable/video-object-fit-stable.html [ Pass ]
 crbug.com/982194 virtual/audio-service/media/video-canvas-draw.html [ Failure ]
 crbug.com/982194 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/udate-bytecheck.https.html [ Timeout ]
-crbug.com/982194 virtual/composite-after-paint/compositing/gestures/gesture-tapHighlight-img.html [ Failure Pass ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ]
+crbug.com/982194 virtual/composite-after-paint/paint/background/background-clip-text-inline.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ]
 crbug.com/982194 virtual/controls-refresh/color-scheme/file/file-appearance-basic.html [ Failure ]
-crbug.com/982194 virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter.html [ Failure ]
-crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Failure Pass ]
-crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Failure Pass ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/range/range-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/text/input-basic-box-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/color-scheme/time/time-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/yuv-decode-eligible/color-profile-layer-filter.html [ Failure Pass ]
+crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Pass ]
+crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Pass ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-cascade/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ]
 crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-input.html [ Failure ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-textarea.html [ Failure ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-click.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/fast/css/forced-colors-mode/backplate/forced-colors-mode-backplate-07.html [ Failure ]
+crbug.com/982194 virtual/forced-high-contrast-colors/fast/css/forced-colors-mode/forced-colors-mode-15.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/date/date-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/floating-textfield-relayout.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-input.html [ Failure Pass ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/focus-selection-textarea.html [ Failure Pass ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-click.html [ Failure Pass ]
 crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-selection-by-dragging.html [ Failure ]
 crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/label/label-selection-by-textSelection-and-click.html [ Failure ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/date-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/month-suggestion-picker-appearance.html [ Failure ]
 crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew.html [ Failure Pass ]
 crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl.html [ Failure Pass ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl.html [ Failure Pass ]
-crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar.html [ Failure Pass ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/time-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/suggestion-picker/week-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/form-controls-refresh-disabled/fast/forms/text/input-readonly-autoscroll.html [ Failure ]
 crbug.com/956736 virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Pass ]
 crbug.com/982194 virtual/gpu/fast/canvas/OffscreenCanvas-zero-size-readback.html [ Crash ]
-crbug.com/982194 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ Pass ]
-crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Pass ]
-crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Pass ]
-crbug.com/982194 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure Pass ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ Failure Pass ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Failure Pass ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Failure Pass ]
 crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-001.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-002.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-003.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-004.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure Pass ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multcol-gap-000.xht [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-003.html [ Failure ]
 crbug.com/481431 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-003.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-005.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-000.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Crash Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-001.xht [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-margin-002.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-000.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-color-inherit-001.xht [ Pass ]
-crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Pass ]
-crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-color-inherit-001.xht [ Failure Pass ]
+crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure Pass ]
+crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-002.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-003.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-004.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-007.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-in-inline.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-2.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-3.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/break-in-scrollable.html [ Pass ]
-crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/break-in-scrollable.html [ Failure Pass ]
+crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/column-break-with-balancing.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-count-with-rules.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-rules.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/columns-shorthand-parsing.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset-complex-tree.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/fixedpos-child-becomes-static.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-avoidance.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-big-line.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-break.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-content-break.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-edge.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-paginate.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inline-getclientrects.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/layers-in-multicol.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-pushed-down-by-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-3-multicols-fixed-height.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance-2.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ]
 crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Failure Pass ]
 crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/regular-block-becomes-multicol.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/relayout-and-push-float.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ]
+crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/shadow-breaking.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-exact-fit.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-extra-height.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-some-extra-height.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-and-after-spanner.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-spanner-extra-height.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-exact-fit.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-hard-breaks.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-transform.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-img.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-last.html [ Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-with-margin.html [ Pass ]
 crbug.com/824918 virtual/layout_ng_block_frag/fast/multicol/span/trailing-margin-around-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/svg-change-column-crash.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Pass ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/tall-float2.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unsplittable-inline-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-rules.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-avoidance.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-big-line.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-break.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-content-break.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-edge.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-paginate.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Pass ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/column-break-with-balancing.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-big-line.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/unsplittable-inline-block.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/widows.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/auto-scrollbar-shrink-to-fit.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-inline-float.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-line-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_block_frag/printing/setPrinting.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-021.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-015.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-016.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-021.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-015.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-clip-016.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-flexbox-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003c.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-replaced-003c.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-size-scrollbars-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-002.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-002.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/counter-scoping-003.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-002.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-003.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/quote-scoping-004.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-ignored-cases-ruby-stacking-and-clipping-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-002.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-flex-001.html [ Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-inline-flex-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-formatting-context.html [ Crash ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item-numbering.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item-numbering.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng_flex_box/css3/flexbox/flexbox-baseline.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/css3/flexbox/relpos-with-percentage-top.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-004.htm [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-baseline-overflow-non-visible.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-015.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_inline.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-004.htm [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/align-items-baseline-overflow-non-visible.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-015.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-007.xht [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_inline.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_visibility-collapse.html [ Failure Pass ]
 crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/hittest-overlapping-margin.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/negative-margins-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-align-self-baseline-horiz-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/negative-margins-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-block.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-004.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-align-self-baseline-horiz-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-horiz-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-horiz-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-003.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-001b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-004a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-001v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-002v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-007v.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001a.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-justify-content-horiz-001b.xhtml [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002c.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002a.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-002c.html [ Failure Pass ]
+crbug.com/982194 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-002.xhtml [ Failure Pass ]
 crbug.com/982194 virtual/lazyload-image/http/tests/lazyload/style-dimension.html [ Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ]
 crbug.com/779170 virtual/mouseevent_fractional/fast/events/clientXY-in-zoom-and-scroll.html [ Pass ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure ]
-crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Pass ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure Pass ]
+crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Failure Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ]
 crbug.com/346473 virtual/mouseevent_fractional/fast/events/drag-on-mouse-move-cancelled.html [ Failure ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled-inline-with-pseudo.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/open-window-from-another-frame.html [ Timeout ]
@@ -1883,30 +1933,31 @@
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Failure ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Failure Pass ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Failure Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click.html [ Pass ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ]
 crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
-crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ]
 crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/touch-slider-no-js-touch-listener.html [ Pass ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest.html [ Failure Pass ]
 crbug.com/779170 virtual/mouseevent_fractional/fast/events/zoom-dblclick.html [ Failure ]
 crbug.com/982194 virtual/not-site-per-process/http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout ]
+crbug.com/982194 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-alpha.https.html [ Pass ]
 crbug.com/982194 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-pending-script.https.html [ Pass ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/download.tentative.https.sub.html [ Failure ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/iframe.tentative.https.sub.html [ Timeout ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/frame.tentative.https.sub.html [ Timeout ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html [ Timeout ]
 crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html [ Timeout ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbars-invisible.html [ Pass ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html [ Pass ]
-crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested.html [ Pass ]
-crbug.com/982194 virtual/scalefactor200/css3/filters/effect-blur-hw.html [ Pass ]
-crbug.com/982194 virtual/scalefactor200/css3/filters/filterRegions.html [ Pass ]
-crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Pass ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-scroll-with-fractional-translation.html [ Failure Pass ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/hidden-scrollbars-invisible.html [ Failure Pass ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html [ Failure Pass ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested.html [ Failure Pass ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/effect-blur-hw.html [ Failure Pass ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/filterRegions.html [ Failure Pass ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/css-filters-animation-combined-001.html [ Failure Pass ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filters-test-brightness-003.html [ Pass ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
@@ -1925,7 +1976,7 @@
 crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/text-with-display-style.html [ Timeout ]
 crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/toJSON.html [ Timeout ]
 crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Pass ]
-crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Pass ]
+crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure Pass ]
 crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
 crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/css-generated-text.html [ Timeout ]
 crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ]
@@ -1945,28 +1996,27 @@
 crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Failure ]
 crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
-crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-result.html [ Failure Pass ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-mousedown-mouseup.html [ Crash Pass ]
 crbug.com/982194 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechSynthesis-speak-without-activation-fails.tentative.html [ Pass ]
-crbug.com/982194 virtual/stable/http/tests/navigation/anchor-frames-same-origin.html [ Failure Pass ]
-crbug.com/982194 virtual/stable/http/tests/navigation/ping-cookie.html [ Timeout ]
-crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Timeout ]
-crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin.html [ Timeout ]
-crbug.com/982194 virtual/stable/http/tests/navigation/ping-same-origin.html [ Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/ping-cookie.html [ Pass Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Pass Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin.html [ Pass Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/ping-same-origin.html [ Pass Timeout ]
 crbug.com/982194 virtual/stable/media/stable/video-object-fit-stable.html [ Pass ]
 crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Pass ]
 crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Failure Pass ]
 crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/font-fallback-synthetic-italics.html [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2-vertical.html [ Pass ]
-crbug.com/982194 virtual/text-antialias/font-ligature-letter-spacing.html [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/font-variant-width.html [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/international/listbox-width-rtl.html [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/international/shape-across-elements.html [ Failure Pass ]
+crbug.com/982194 virtual/text-antialias/descent-clip-in-scaled-page.html [ Failure ]
+crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2-vertical.html [ Failure Pass ]
 crbug.com/982194 virtual/text-antialias/remove-zero-length-run.html [ Failure ]
-crbug.com/982194 virtual/text-antialias/sub-pixel/text-scaling-pixel.html [ Failure Pass ]
-crbug.com/982194 virtual/text-antialias/tab-min-size.html [ Failure Pass ]
+crbug.com/982194 virtual/text-antialias/selection/emphasis.html [ Failure Pass ]
+crbug.com/982194 virtual/text-antialias/selection/flexbox-selection.html [ Failure Pass ]
+crbug.com/982194 virtual/text-antialias/selection/khmer-selection.html [ Failure ]
+crbug.com/982194 virtual/text-antialias/selection/repaint-glyph-bounds.html [ Failure ]
+crbug.com/982194 virtual/text-antialias/selection/selection-painting-hidpi.html [ Failure Pass ]
+crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/rotate-transform-equivalent.html [ Failure ]
 crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/animation-duration-infinite.html [ Failure Pass ]
-crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html [ Failure Pass ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-disabled-tentative.sub.html [ Failure ]
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ]
 crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ]
 crbug.com/982194 virtual/threaded/fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Timeout ]
@@ -1977,6 +2027,7 @@
 crbug.com/982194 virtual/threaded/http/tests/devtools/tracing/timeline-worker-events.js [ Failure Pass ]
 crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ]
 crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ]
+crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/html/semantics/document-metadata/the-link-element/stylesheet-change-href.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ]
 crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/shadow-dom/DocumentOrShadowRoot-prototype-elementFromPoint.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/basic.html [ Failure ]
@@ -1988,22 +2039,18 @@
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/hittest-empty-line.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/hittest-outside-image.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/replace-element.html [ Failure ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/client-rect-list-argument.html [ Failure Pass ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/getBoundingClientRect.html [ Failure Pass ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Element/getClientRects.html [ Failure Pass ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Range/getClientRects.html [ Failure Pass ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Range/range-spanning-elements-bounding-client-rect.html [ Failure Pass ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/elementsFromPoint/elementsFromPoint-inline.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/elementsFromPoint/elementsFromPoint-simple.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-child-frame-content.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inline-with-linebreak.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings-bidi.html [ Failure ]
-crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure ]
+crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines-between-silblings.html [ Failure Pass ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-culled-inlines.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-embedded-frame-content.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/shadow/gesture-tapHighlight-shadow-tree.html [ Pass ]
 crbug.com/982194 virtual/web-components-v0-disabled/fast/html/draggable-controls.html [ Failure ]
-crbug.com/982194 virtual/web-components-v0-disabled/html/sections/body-legacy-colors.html [ Timeout ]
+crbug.com/982194 virtual/web-components-v0-disabled/html/details_summary/details-writing-mode-align-center.html [ Failure ]
+crbug.com/982194 virtual/web-components-v0-disabled/html/sections/body-legacy-colors.html [ Pass Timeout ]
 crbug.com/982194 wpt_internal/css/css-intrinsic-size/intrinsic-size-015.html [ Crash ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 3f5bd019..bd8c8639 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -117757,6 +117757,18 @@
      {}
     ]
    ],
+   "html/rendering/the-details-element/summary-display-list-item.html": [
+    [
+     "html/rendering/the-details-element/summary-display-list-item.html",
+     [
+      [
+       "/html/rendering/the-details-element/summary-display-list-item-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "html/rendering/widgets/button-layout/anonymous-button-content-box.html": [
     [
      "html/rendering/widgets/button-layout/anonymous-button-content-box.html",
@@ -164352,6 +164364,9 @@
    "html/rendering/the-details-element/single-summary.html": [
     []
    ],
+   "html/rendering/the-details-element/summary-display-list-item-ref.html": [
+    []
+   ],
    "html/rendering/unmapped-attributes-expected.txt": [
     []
    ],
@@ -165372,6 +165387,12 @@
    "html/semantics/forms/constraints/form-validation-validity-patternMismatch-expected.txt": [
     []
    ],
+   "html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt": [
+    []
+   ],
+   "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt": [
+    []
+   ],
    "html/semantics/forms/constraints/form-validation-validity-valid-expected.txt": [
     []
    ],
@@ -180672,9 +180693,6 @@
    "trusted-types/support/worker.js": [
     []
    ],
-   "trusted-types/trusted-types-createHTMLDocument.tentative-expected.txt": [
-    []
-   ],
    "trusted-types/trusted-types-duplicate-names-list-report-only.tentative.html.headers": [
     []
    ],
@@ -212389,6 +212407,12 @@
      {}
     ]
    ],
+   "css/css-color/animation/color-composition.html": [
+    [
+     "css/css-color/animation/color-composition.html",
+     {}
+    ]
+   ],
    "css/css-color/animation/color-interpolation.html": [
     [
      "css/css-color/animation/color-interpolation.html",
@@ -212709,6 +212733,12 @@
      {}
     ]
    ],
+   "css/css-flexbox/animation/flex-basis-composition.html": [
+    [
+     "css/css-flexbox/animation/flex-basis-composition.html",
+     {}
+    ]
+   ],
    "css/css-flexbox/animation/flex-basis-interpolation.html": [
     [
      "css/css-flexbox/animation/flex-basis-interpolation.html",
@@ -216295,12 +216325,6 @@
      {}
     ]
    ],
-   "css/css-images/animations/object-position-interpolation.html": [
-    [
-     "css/css-images/animations/object-position-interpolation.html",
-     {}
-    ]
-   ],
    "css/css-images/gradient/color-stops-parsing.html": [
     [
      "css/css-images/gradient/color-stops-parsing.html",
@@ -217213,6 +217237,12 @@
      {}
     ]
    ],
+   "css/css-masking/animations/clip-path-composition.html": [
+    [
+     "css/css-masking/animations/clip-path-composition.html",
+     {}
+    ]
+   ],
    "css/css-masking/animations/clip-path-interpolation-001.html": [
     [
      "css/css-masking/animations/clip-path-interpolation-001.html",
@@ -217849,9 +217879,9 @@
      {}
     ]
    ],
-   "css/css-position/animation/position-interpolation.html": [
+   "css/css-position/animations/bottom-composition.html": [
     [
-     "css/css-position/animation/position-interpolation.html",
+     "css/css-position/animations/bottom-composition.html",
      {}
     ]
    ],
@@ -217861,18 +217891,42 @@
      {}
     ]
    ],
+   "css/css-position/animations/left-composition.html": [
+    [
+     "css/css-position/animations/left-composition.html",
+     {}
+    ]
+   ],
    "css/css-position/animations/left-interpolation.html": [
     [
      "css/css-position/animations/left-interpolation.html",
      {}
     ]
    ],
+   "css/css-position/animations/position-interpolation.html": [
+    [
+     "css/css-position/animations/position-interpolation.html",
+     {}
+    ]
+   ],
+   "css/css-position/animations/right-composition.html": [
+    [
+     "css/css-position/animations/right-composition.html",
+     {}
+    ]
+   ],
    "css/css-position/animations/right-interpolation.html": [
     [
      "css/css-position/animations/right-interpolation.html",
      {}
     ]
    ],
+   "css/css-position/animations/top-composition.html": [
+    [
+     "css/css-position/animations/top-composition.html",
+     {}
+    ]
+   ],
    "css/css-position/animations/top-interpolation.html": [
     [
      "css/css-position/animations/top-interpolation.html",
@@ -223125,6 +223179,12 @@
      {}
     ]
    ],
+   "css/css-transforms/animation/perspective-composition.html": [
+    [
+     "css/css-transforms/animation/perspective-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/perspective-interpolation.html": [
     [
      "css/css-transforms/animation/perspective-interpolation.html",
@@ -223137,18 +223197,36 @@
      {}
     ]
    ],
+   "css/css-transforms/animation/rotate-composition.html": [
+    [
+     "css/css-transforms/animation/rotate-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/rotate-interpolation.html": [
     [
      "css/css-transforms/animation/rotate-interpolation.html",
      {}
     ]
    ],
+   "css/css-transforms/animation/scale-composition.html": [
+    [
+     "css/css-transforms/animation/scale-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/scale-interpolation.html": [
     [
      "css/css-transforms/animation/scale-interpolation.html",
      {}
     ]
    ],
+   "css/css-transforms/animation/transform-composition.html": [
+    [
+     "css/css-transforms/animation/transform-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/transform-interpolation-001.html": [
     [
      "css/css-transforms/animation/transform-interpolation-001.html",
@@ -223185,12 +223263,54 @@
      {}
     ]
    ],
+   "css/css-transforms/animation/transform-matrix-composition.html": [
+    [
+     "css/css-transforms/animation/transform-matrix-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/transform-origin-interpolation.html": [
     [
      "css/css-transforms/animation/transform-origin-interpolation.html",
      {}
     ]
    ],
+   "css/css-transforms/animation/transform-perspective-composition.html": [
+    [
+     "css/css-transforms/animation/transform-perspective-composition.html",
+     {}
+    ]
+   ],
+   "css/css-transforms/animation/transform-rotate-composition.html": [
+    [
+     "css/css-transforms/animation/transform-rotate-composition.html",
+     {}
+    ]
+   ],
+   "css/css-transforms/animation/transform-scale-composition.html": [
+    [
+     "css/css-transforms/animation/transform-scale-composition.html",
+     {}
+    ]
+   ],
+   "css/css-transforms/animation/transform-skew-composition.html": [
+    [
+     "css/css-transforms/animation/transform-skew-composition.html",
+     {}
+    ]
+   ],
+   "css/css-transforms/animation/transform-translate-composition.html": [
+    [
+     "css/css-transforms/animation/transform-translate-composition.html",
+     {}
+    ]
+   ],
+   "css/css-transforms/animation/translate-composition.html": [
+    [
+     "css/css-transforms/animation/translate-composition.html",
+     {}
+    ]
+   ],
    "css/css-transforms/animation/translate-interpolation.html": [
     [
      "css/css-transforms/animation/translate-interpolation.html",
@@ -223497,6 +223617,12 @@
      {}
     ]
    ],
+   "css/css-transitions/animations/vertical-align-composition.html": [
+    [
+     "css/css-transitions/animations/vertical-align-composition.html",
+     {}
+    ]
+   ],
    "css/css-transitions/animations/vertical-align-interpolation.html": [
     [
      "css/css-transitions/animations/vertical-align-interpolation.html",
@@ -257053,12 +257179,24 @@
      {}
     ]
    ],
+   "html/semantics/forms/the-input-element/input-valueasdate.html": [
+    [
+     "html/semantics/forms/the-input-element/input-valueasdate.html",
+     {}
+    ]
+   ],
    "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
     [
      "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html",
      {}
     ]
    ],
+   "html/semantics/forms/the-input-element/input-valueasnumber.html": [
+    [
+     "html/semantics/forms/the-input-element/input-valueasnumber.html",
+     {}
+    ]
+   ],
    "html/semantics/forms/the-input-element/input-width.html": [
     [
      "html/semantics/forms/the-input-element/input-width.html",
@@ -310186,6 +310324,12 @@
      {}
     ]
    ],
+   "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [
+    [
+     "trusted-types/DOMParser-parseFromString-regression.tentative.https.html",
+     {}
+    ]
+   ],
    "trusted-types/DOMParser-parseFromString.tentative.html": [
     [
      "trusted-types/DOMParser-parseFromString.tentative.html",
@@ -375702,6 +375846,10 @@
    "e282c4fb98224c0827f24ed9ecdfe95abb1ffbcd",
    "support"
   ],
+  "css/css-color/animation/color-composition.html": [
+   "c3e481830b6155114e6e6f543acc27c02c59c687",
+   "testharness"
+  ],
   "css/css-color/animation/color-interpolation.html": [
    "4b39fdcf796083ace917f0a021a697c6e4eb7214",
    "testharness"
@@ -378838,6 +378986,10 @@
    "f16d29835f7aef92f278fa5bc28317dc913f3544",
    "reftest"
   ],
+  "css/css-flexbox/animation/flex-basis-composition.html": [
+   "122761e47679945d000623b6ae6fbe6d13cd5fba",
+   "testharness"
+  ],
   "css/css-flexbox/animation/flex-basis-interpolation.html": [
    "d66e81d4924f6b419a0e467119e5ce6dd27e2966",
    "testharness"
@@ -393878,10 +394030,6 @@
    "8d3b9472b2c9a2ee88dc97f907f9d16eb4fa3755",
    "support"
   ],
-  "css/css-images/animations/object-position-interpolation.html": [
-   "055cbc8421b6af58e636729268f7323e1710458c",
-   "testharness"
-  ],
   "css/css-images/css-image-fallbacks-and-annotations-ref.html": [
    "f3193036766e428bf946e81b7df72bfc7f4901db",
    "support"
@@ -396250,6 +396398,10 @@
    "322ebd724e8524e85d8afe369b6bafaabbec8c79",
    "testharness"
   ],
+  "css/css-masking/animations/clip-path-composition.html": [
+   "2275ae70a330e06214f3c612acdba186efde99cd",
+   "testharness"
+  ],
   "css/css-masking/animations/clip-path-interpolation-001.html": [
    "21c34f1f2b75ec7345a97b00db62a49b038cf026",
    "testharness"
@@ -400538,22 +400690,38 @@
    "8f03d3c62fd0cefb11a22b1a4a8d2c06fed97308",
    "support"
   ],
-  "css/css-position/animation/position-interpolation.html": [
-   "a4ad50240a40674afe76b4c76a08feb9c4e27b12",
+  "css/css-position/animations/bottom-composition.html": [
+   "68a830dfbda2e4f15372ccc89be65d67602bf4b1",
    "testharness"
   ],
   "css/css-position/animations/bottom-interpolation.html": [
    "272e79fc05b0267afe696c11ea0572299559d223",
    "testharness"
   ],
+  "css/css-position/animations/left-composition.html": [
+   "14b3dfda76dc219bda706e48f7e6846b20e242cf",
+   "testharness"
+  ],
   "css/css-position/animations/left-interpolation.html": [
    "33ed0b4ec3b961bc0f71fc1b784b51201f50ebfa",
    "testharness"
   ],
+  "css/css-position/animations/position-interpolation.html": [
+   "a4ad50240a40674afe76b4c76a08feb9c4e27b12",
+   "testharness"
+  ],
+  "css/css-position/animations/right-composition.html": [
+   "995bb8d6bec8056c1e72ddbaa05b624a1072c9a8",
+   "testharness"
+  ],
   "css/css-position/animations/right-interpolation.html": [
    "284d435e56eac5370edd570d2f67b0dfeaa6bbf6",
    "testharness"
   ],
+  "css/css-position/animations/top-composition.html": [
+   "47782e8536fa2895d67fc4f91a182899f5da0d50",
+   "testharness"
+  ],
   "css/css-position/animations/top-interpolation.html": [
    "f5af530c387a7b52a78a4ca13b27d976f60b2dc9",
    "testharness"
@@ -414878,6 +415046,10 @@
    "a326e7c92f21aca39613c6964055b9592b35b034",
    "testharness"
   ],
+  "css/css-transforms/animation/perspective-composition.html": [
+   "6fa745d6ed2266cd4535a114a073e386eeb07488",
+   "testharness"
+  ],
   "css/css-transforms/animation/perspective-interpolation.html": [
    "a27f84a11bdc3999eb5183dc3251878053c43bac",
    "testharness"
@@ -414886,6 +415058,10 @@
    "0a1e74cb8ec6d0539fe04f0be765ec67b3d78b7e",
    "testharness"
   ],
+  "css/css-transforms/animation/rotate-composition.html": [
+   "fa0118d50f457b3021a28a7e12a21c96c1c5a23c",
+   "testharness"
+  ],
   "css/css-transforms/animation/rotate-interpolation-expected.txt": [
    "6952453f7a3e8fbf8d15286d6d914ea18707cf32",
    "support"
@@ -414894,6 +415070,10 @@
    "eff60ba72f72c126ce442a02e89a6b1875190297",
    "testharness"
   ],
+  "css/css-transforms/animation/scale-composition.html": [
+   "6fc4de61132cd2b3c887f9a932c2e820fd5cdb38",
+   "testharness"
+  ],
   "css/css-transforms/animation/scale-interpolation-expected.txt": [
    "05b835c0dce6b10915040dfab647df818dd10d40",
    "support"
@@ -414902,6 +415082,10 @@
    "0e33371955bb7ea630939de5c0333355f9830586",
    "testharness"
   ],
+  "css/css-transforms/animation/transform-composition.html": [
+   "928da71a9b9c0ff8d5552976ee2b635f1f3567b6",
+   "testharness"
+  ],
   "css/css-transforms/animation/transform-interpolation-001-expected.txt": [
    "dd58e6a649dfd745225f2f84b1214187e1ca4405",
    "support"
@@ -414930,10 +415114,38 @@
    "c69bad7c93b8448b763e7f98d0ed6b50783ed7d2",
    "testharness"
   ],
+  "css/css-transforms/animation/transform-matrix-composition.html": [
+   "2586ff3d4a577b9c4b43a2841884c6f490d7ccf3",
+   "testharness"
+  ],
   "css/css-transforms/animation/transform-origin-interpolation.html": [
    "02b8b59b0b92cb37c4cce43a06ff1e9eff2b41e4",
    "testharness"
   ],
+  "css/css-transforms/animation/transform-perspective-composition.html": [
+   "82f8dad59b6590c325ae7b4d2de7cf7b72959c71",
+   "testharness"
+  ],
+  "css/css-transforms/animation/transform-rotate-composition.html": [
+   "e062860e72937121ed290c81a1e14276899ec383",
+   "testharness"
+  ],
+  "css/css-transforms/animation/transform-scale-composition.html": [
+   "87c33a85ed672612ec60570001f1b9a2bf4f05c9",
+   "testharness"
+  ],
+  "css/css-transforms/animation/transform-skew-composition.html": [
+   "cda44b60c0ed9683291ee6341d14c28cf327a4af",
+   "testharness"
+  ],
+  "css/css-transforms/animation/transform-translate-composition.html": [
+   "49214c4a93c8c1d16416c131a6780564e474e723",
+   "testharness"
+  ],
+  "css/css-transforms/animation/translate-composition.html": [
+   "3abdb4522b07094ca689acee9fc7e252f18438ec",
+   "testharness"
+  ],
   "css/css-transforms/animation/translate-interpolation-expected.txt": [
    "0499ca03b5ee21961e69a72ab904c4110d35d9d9",
    "support"
@@ -419298,6 +419510,10 @@
    "c007816ecb04236421ff0aea8861da19c244338a",
    "testharness"
   ],
+  "css/css-transitions/animations/vertical-align-composition.html": [
+   "222a511679b999cc684d26fc3c5e73bfc1d0ee46",
+   "testharness"
+  ],
   "css/css-transitions/animations/vertical-align-interpolation.html": [
    "c81c83239354cc3c179612f26f95891dac8e3676",
    "testharness"
@@ -464066,6 +464282,14 @@
    "1f09e7e75f9126982a07902ae0693f9ea2fd5823",
    "support"
   ],
+  "html/rendering/the-details-element/summary-display-list-item-ref.html": [
+   "31e98d3fdca8fff9fe88929c8075643fca3abb40",
+   "support"
+  ],
+  "html/rendering/the-details-element/summary-display-list-item.html": [
+   "c2e96e987ea943e29626e0cfd013ef6d6cae3bbc",
+   "reftest"
+  ],
   "html/rendering/unmapped-attributes-expected.txt": [
    "4179bfbb0420e5141741be44c2c7ea211b24247d",
    "support"
@@ -467934,12 +468158,20 @@
    "4ca64aac68983c50297fe48b5cb9423baabab4a4",
    "testharness"
   ],
+  "html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt": [
+   "c33b68b346418f55917cf50d82718fd77e0ac117",
+   "support"
+  ],
   "html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html": [
-   "fedf2ea4e4f0aa5018db5bb24ec3bf0e15333992",
+   "2f69407592ecf0502a75782f6094beaf9310986d",
    "testharness"
   ],
+  "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt": [
+   "2afd27b370ed9f691caa540502cf608f0a08c598",
+   "support"
+  ],
   "html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html": [
-   "8ac3aae1279c0f6df2203251aae26854ba551b57",
+   "c939a94c37e160f374445ec1def14137764e54d4",
    "testharness"
   ],
   "html/semantics/forms/constraints/form-validation-validity-stepMismatch.html": [
@@ -467959,7 +468191,7 @@
    "testharness"
   ],
   "html/semantics/forms/constraints/form-validation-validity-valid-expected.txt": [
-   "b0da38305f70073516805dba54b8fb5f0fda8413",
+   "85f81beb88241b6f1b4f15467dcc7ee06bcf8a2c",
    "support"
   ],
   "html/semantics/forms/constraints/form-validation-validity-valid.html": [
@@ -467967,11 +468199,11 @@
    "testharness"
   ],
   "html/semantics/forms/constraints/form-validation-validity-valueMissing-expected.txt": [
-   "b4497dd9a754b12ba2d3a1e76ca03f00b828572c",
+   "6e95bca5f8a4650a7d349c07a86444ffde3b2c27",
    "support"
   ],
   "html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [
-   "2e1c666436a19bc759026ebf55df4a17073ecb5d",
+   "3229527fabc00880bd2f95d7aa4f494ce9884fa3",
    "testharness"
   ],
   "html/semantics/forms/constraints/form-validation-willValidate-expected.txt": [
@@ -468722,10 +468954,18 @@
    "bd49a15fc82136105c17818561cc1e8f7fbfe7ee",
    "testharness"
   ],
+  "html/semantics/forms/the-input-element/input-valueasdate.html": [
+   "a958e991ec53a22413bc311d832bc28b3b4baccf",
+   "testharness"
+  ],
   "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
    "a3187ff3fbca4252d701b30c761819f5075611cc",
    "testharness"
   ],
+  "html/semantics/forms/the-input-element/input-valueasnumber.html": [
+   "321c981c74d2293694fecf18284126b089aca1c2",
+   "testharness"
+  ],
   "html/semantics/forms/the-input-element/input-width.html": [
    "5278ff77e1e7523a74970c5b85a94e29e66ea8e4",
    "testharness"
@@ -468791,7 +469031,7 @@
    "testharness"
   ],
   "html/semantics/forms/the-input-element/radio.html": [
-   "c37fa7acd0c705e4711be719b9f99ce4db929560",
+   "7dcc9a14a8980898917d8d771041bd691e99785f",
    "testharness"
   ],
   "html/semantics/forms/the-input-element/range-2.html": [
@@ -468883,7 +469123,7 @@
    "testharness"
   ],
   "html/semantics/forms/the-input-element/valueMode.html": [
-   "9525d3ca1feedb651b18fefed8391d3584f36189",
+   "5502011794fcfdcfae5161ca861448ceb503dc54",
    "testharness"
   ],
   "html/semantics/forms/the-input-element/week.html": [
@@ -520542,6 +520782,10 @@
    "1b723b7bb3c5cebc0701e2393e334a1e99ce2ef3",
    "testharness"
   ],
+  "trusted-types/DOMParser-parseFromString-regression.tentative.https.html": [
+   "30986e45d2671caec84879314b43891664dd10ae",
+   "testharness"
+  ],
   "trusted-types/DOMParser-parseFromString.tentative.html": [
    "2dfc37686bca15431c216a50d29f9f9eed2782e0",
    "testharness"
@@ -520822,10 +521066,6 @@
    "4079f7e9c7933cf9ee195fe0e7a54e0f56f184ab",
    "support"
   ],
-  "trusted-types/trusted-types-createHTMLDocument.tentative-expected.txt": [
-   "000dc2bbc56f39e6adc7a90b5a76796434278818",
-   "support"
-  ],
   "trusted-types/trusted-types-createHTMLDocument.tentative.html": [
    "6ab5f42d5ffd82ccc3bf5c9ea8916c2b2f810987",
    "testharness"
@@ -535059,7 +535299,7 @@
    "testharness"
   ],
   "webxr/xrInputSource_add_remove.https.html": [
-   "4c50670c70ec87754a777cc0bcfe8272e794ca07",
+   "33264ddd68ab09e2ed6a596614116bd1225f2665",
    "testharness"
   ],
   "webxr/xrInputSource_emulatedPosition.https.html": [
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html
new file mode 100644
index 0000000..31e98d3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference: summary with 'display: list-item'</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<style>
+details {
+  margin-left: 50px;
+}
+.inside {
+  list-style-position: inside;
+}
+</style>
+<details>
+  <summary>summary</summary>
+  content
+</details>
+<details>
+  <summary class="inside">summary</summary>
+  content
+</details>
+<details open>
+  <summary>summary</summary>
+  content
+</details>
+<details open>
+  <summary class="inside">summary</summary>
+  content
+</details>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html
new file mode 100644
index 0000000..c2e96e98
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/the-details-element/summary-display-list-item.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: summary with 'display: list-item'</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="match" href="summary-display-list-item-ref.html">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements">
+<meta name="assert" content="Checks that styling a <summary> with 'display: list-item' has no effect since it should already be a list item by default.">
+<style>
+summary {
+  display: list-item;
+}
+details {
+  margin-left: 50px;
+}
+.inside {
+  list-style-position: inside;
+}
+</style>
+<details>
+  <summary>summary</summary>
+  content
+</details>
+<details>
+  <summary class="inside">summary</summary>
+  content
+</details>
+<details open>
+  <summary>summary</summary>
+  content
+</details>
+<details open>
+  <summary class="inside">summary</summary>
+  content
+</details>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt
new file mode 100644
index 0000000..c33b68b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow-expected.txt
@@ -0,0 +1,72 @@
+This is a testharness.js-based test.
+Found 68 tests; 66 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS [INPUT in DATETIME-LOCAL status] The max attribute is not set
+PASS [INPUT in DATETIME-LOCAL status] Value is empty string
+PASS [INPUT in DATETIME-LOCAL status] The max attribute is an invalid local date time string
+PASS [INPUT in DATETIME-LOCAL status] The max attribute is greater than the value attribute
+PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(hour is greater than 23)
+PASS [INPUT in DATETIME-LOCAL status] The value if an invalid local date time string(year is two digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 1 digit)
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 2 digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(with millisecond in 3 digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max(Year is 10000 should be valid)
+PASS [INPUT in DATE status] The max attribute is not set
+PASS [INPUT in DATE status] Value is empty string
+PASS [INPUT in DATE status] The max attribute is an invalid date
+PASS [INPUT in DATE status] The value attribute is an invalid date
+PASS [INPUT in DATE status] The value is an invalid date(year is three digits)
+PASS [INPUT in DATE status] The value is an invalid date(month is greater than 12)
+PASS [INPUT in DATE status] The value is an invalid date(date is greater than 29 for Feb)
+PASS [INPUT in DATE status] The max attribute is greater than value attribute
+PASS [INPUT in DATE status] The value attribute is greater than max attribute
+PASS [INPUT in DATE status] The value attribute is greater than max attribute(Year is 10000 should be valid)
+PASS [INPUT in MONTH status] The max attribute is not set
+PASS [INPUT in MONTH status] Value is empty string
+PASS [INPUT in MONTH status] The max attribute is an invalid month string
+PASS [INPUT in MONTH status] The value attribute is an invalid month string
+PASS [INPUT in MONTH status] The value is an invalid month string(year is three digits)
+PASS [INPUT in MONTH status] The value is an invalid month string(month is greater than 12)
+PASS [INPUT in MONTH status] The max attribute is greater than value attribute
+PASS [INPUT in MONTH status] The value attribute is greater than max attribute
+PASS [INPUT in MONTH status] The value attribute is greater than max attribute(Year is 10000 should be valid)
+PASS [INPUT in WEEK status] The max attribute is not set
+PASS [INPUT in WEEK status] Value is empty string
+PASS [INPUT in WEEK status] The max attribute is an invalid week string
+PASS [INPUT in WEEK status] The value attribute is an invalid week string
+PASS [INPUT in WEEK status] The value attribute is an invalid week string(w is in lowercase)
+PASS [INPUT in WEEK status] The value is an invalid week string(year is three digits)
+PASS [INPUT in WEEK status] The value is an invalid week string(week is too greater)
+PASS [INPUT in WEEK status] The max attribute is greater than value attribute
+PASS [INPUT in WEEK status] The value attribute is greater than max attribute
+PASS [INPUT in WEEK status] The value attribute is greater than max attribute(Year is 10000 should be valid)
+PASS [INPUT in TIME status] The max attribute is not set
+PASS [INPUT in TIME status] Value is empty string
+PASS [INPUT in TIME status] The max attribute is an invalid time string
+PASS [INPUT in TIME status] The value attribute is an invalid time string
+PASS [INPUT in TIME status] The value attribute is an invalid time string(hour is greater than 23)
+PASS [INPUT in TIME status] The value attribute is an invalid time string(minute is greater than 59)
+PASS [INPUT in TIME status] The value attribute is an invalid time string(second is greater than 59)
+PASS [INPUT in TIME status] The max attribute is greater than value attribute
+PASS [INPUT in TIME status] The time missing second and minute parts is invalid
+PASS [INPUT in TIME status] The value attribute is greater than max attribute
+PASS [INPUT in TIME status] The value is greater than max(with millisecond in 1 digit)
+PASS [INPUT in TIME status] The value is greater than max(with millisecond in 2 digit)
+PASS [INPUT in TIME status] The value is greater than max(with millisecond in 3 digit)
+PASS [INPUT in TIME status] The time missing second part is valid
+PASS [INPUT in TIME status] The time is max for reversed range
+PASS [INPUT in TIME status] The time is outside the accepted range for reversed range
+FAIL [INPUT in TIME status] The time is min for reversed range assert_false: The validity.rangeOverflow should be false. expected false got true
+FAIL [INPUT in TIME status] The time is inside the accepted range for reversed range assert_false: The validity.rangeOverflow should be false. expected false got true
+PASS [INPUT in NUMBER status] The max attribute is not set
+PASS [INPUT in NUMBER status] Value is empty string
+PASS [INPUT in NUMBER status] The max is greater than value(integer)
+PASS [INPUT in NUMBER status] The max is greater than value(floating number)
+PASS [INPUT in NUMBER status] The max equals to value
+PASS [INPUT in NUMBER status] The value is not a number
+PASS [INPUT in NUMBER status] The value is greater than max(integer)
+PASS [INPUT in NUMBER status] The value is greater than max(floating number)
+PASS [INPUT in NUMBER status] The value is greater than max(special floating number)
+PASS [INPUT in NUMBER status] The value is greater than max(scientific notation)
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
index fedf2ea..2f69407 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeOverflow.html
@@ -91,7 +91,11 @@
         {conditions: {max: "12:00:00.1", value: "12:00:00.2"}, expected: true, name: "[target] The value is greater than max(with millisecond in 1 digit)"},
         {conditions: {max: "12:00:00.01", value: "12:00:00.02"}, expected: true, name: "[target] The value is greater than max(with millisecond in 2 digit)"},
         {conditions: {max: "12:00:00.001", value: "12:00:00.002"}, expected: true, name: "[target] The value is greater than max(with millisecond in 3 digit)"},
-        {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"}
+        {conditions: {max: "12:00:00", value: "12:01"}, expected: true, name: "[target] The time missing second part is valid"},
+        {conditions: {max: "12:00:00", min: "14:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"},
+        {conditions: {max: "12:00:00", min: "14:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"},
+        {conditions: {max: "12:00:00", min: "14:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"},
+        {conditions: {max: "12:00:00", min: "14:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"},
       ]
     },
     {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt
new file mode 100644
index 0000000..2afd27b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow-expected.txt
@@ -0,0 +1,70 @@
+This is a testharness.js-based test.
+Found 66 tests; 65 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS [INPUT in DATETIME-LOCAL status] The min attribute is not set
+PASS [INPUT in DATETIME-LOCAL status] Value is empty string
+PASS [INPUT in DATETIME-LOCAL status] The min attribute is an invalid local date time string
+PASS [INPUT in DATETIME-LOCAL status] The min attribute is less than the value attribute
+PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(hour is greater than 23)
+PASS [INPUT in DATETIME-LOCAL status] The value is an invalid local date time string(year is two digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is less than min
+PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 1 digit)
+PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 2 digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is less than min(with millisecond in 3 digits)
+PASS [INPUT in DATETIME-LOCAL status] The value is less than min(Year is 10000 should be valid)
+PASS [INPUT in DATETIME-LOCAL status] The value is greater than max
+PASS [INPUT in DATE status] The min attribute is not set
+PASS [INPUT in DATE status] Value is empty string
+PASS [INPUT in DATE status] The min attribute is an invalid date
+PASS [INPUT in DATE status] The value attribute is an invalid date
+PASS [INPUT in DATE status] The value is an invalid date(year is three digits)
+PASS [INPUT in DATE status] The value is an invalid date(month is less than 12)
+PASS [INPUT in DATE status] The value is an invalid date(date is less than 29 for Feb)
+PASS [INPUT in DATE status] The min attribute is less than value attribute
+PASS [INPUT in DATE status] The value attribute is less than min attribute
+PASS [INPUT in DATE status] The value attribute is less than min attribute(Year is 10000 should be valid)
+PASS [INPUT in MONTH status] The min attribute is not set
+PASS [INPUT in MONTH status] Value is empty string
+PASS [INPUT in MONTH status] The min attribute is an invalid month string
+PASS [INPUT in MONTH status] The value attribute is an invalid month string
+PASS [INPUT in MONTH status] The value is an invalid month string(year is three digits)
+PASS [INPUT in MONTH status] The value is an invalid month string(month is less than 12)
+PASS [INPUT in MONTH status] The min attribute is less than value attribute
+PASS [INPUT in MONTH status] The value attribute is less than min attribute
+PASS [INPUT in MONTH status] The value attribute is less than min attribute(Year is 10000 should be valid)
+PASS [INPUT in WEEK status] The min attribute is not set
+PASS [INPUT in WEEK status] Value is empty string
+PASS [INPUT in WEEK status] The min attribute is an invalid week string
+PASS [INPUT in WEEK status] The value attribute is an invalid week string
+PASS [INPUT in WEEK status] The value attribute is an invalid week string(w is in lowercase)
+PASS [INPUT in WEEK status] The value is an invalid week string(year is three digits)
+PASS [INPUT in WEEK status] The value is an invalid week string(week is too greater)
+PASS [INPUT in WEEK status] The min attribute is less than value attribute
+PASS [INPUT in WEEK status] The value attribute is less than min attribute
+PASS [INPUT in WEEK status] The value attribute is less than min attribute(Year is 10000 should be valid)
+PASS [INPUT in TIME status] The min attribute is not set
+PASS [INPUT in TIME status] Value is empty string
+PASS [INPUT in TIME status] The min attribute is an invalid time string
+PASS [INPUT in TIME status] The value attribute is an invalid time string
+PASS [INPUT in TIME status] The min attribute is less than value attribute
+PASS [INPUT in TIME status] The time missing second and minute parts is invalid
+PASS [INPUT in TIME status] The value attribute is less than min attribute
+PASS [INPUT in TIME status] The value is less than min(with millisecond in 1 digit)
+PASS [INPUT in TIME status] The value is less than min(with millisecond in 2 digit)
+PASS [INPUT in TIME status] The value is less than min(with millisecond in 3 digit)
+PASS [INPUT in TIME status] The time missing second part is valid
+FAIL [INPUT in TIME status] The time is max for reversed range assert_false: The validity.rangeUnderflow should be false. expected false got true
+PASS [INPUT in TIME status] The time is outside the accepted range for reversed range
+PASS [INPUT in TIME status] The time is min for reversed range
+PASS [INPUT in TIME status] The time is inside the accepted range for reversed range
+PASS [INPUT in NUMBER status] The min attribute is not set
+PASS [INPUT in NUMBER status] Value is empty string
+PASS [INPUT in NUMBER status] The min is less than value(integer)
+PASS [INPUT in NUMBER status] The min is less than value(floating number)
+PASS [INPUT in NUMBER status] The min equals to value
+PASS [INPUT in NUMBER status] The value is not a number
+PASS [INPUT in NUMBER status] The value is less than min(integer)
+PASS [INPUT in NUMBER status] The value is less than min(floating number)
+PASS [INPUT in NUMBER status] The value is less than min(special floating number)
+PASS [INPUT in NUMBER status] The value is less than min(scientific notation)
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
index 8ac3aae1..c939a94 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/constraints/form-validation-validity-rangeUnderflow.html
@@ -89,7 +89,11 @@
         {conditions: {min: "12:00:00.2", value: "12:00:00.1"}, expected: true, name: "[target] The value is less than min(with millisecond in 1 digit)"},
         {conditions: {min: "12:00:00.02", value: "12:00:00.01"}, expected: true, name: "[target] The value is less than min(with millisecond in 2 digit)"},
         {conditions: {min: "12:00:00.002", value: "12:00:00.001"}, expected: true, name: "[target] The value is less than min(with millisecond in 3 digit)"},
-        {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"}
+        {conditions: {min: "12:00:00", value: "11:59"}, expected: true, name: "[target] The time missing second part is valid"},
+        {conditions: {min: "14:00:00", max: "12:00:00", value: "12:00:00"}, expected: false, name: "[target] The time is max for reversed range"},
+        {conditions: {min: "14:00:00", max: "12:00:00", value: "13:00:00"}, expected: true, name: "[target] The time is outside the accepted range for reversed range"},
+        {conditions: {min: "14:00:00", max: "12:00:00", value: "14:00:00"}, expected: false, name: "[target] The time is min for reversed range"},
+        {conditions: {min: "14:00:00", max: "12:00:00", value: "15:00:00"}, expected: false, name: "[target] The time is inside the accepted range for reversed range"},
       ]
     },
     {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html
new file mode 100644
index 0000000..a958e99
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasdate.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<html>
+ <head>
+  <title>HTMLInputElement valueAsDate</title>
+  <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com">
+  <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasdate">
+
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+  <h3>input_valueAsDate</h3>
+  <hr>
+  <div id="log"></div>
+
+  <input id="input_date" type="date" />
+  <input id="input_month" type="month" />
+  <input id="input_week" type="week" />
+  <input id="input_time" type="time" />
+
+  <script>
+   "use strict";
+
+   function testValueAsDateGetter(type, element, cases) {
+     for (const [actualValue, expectedValueAsDate] of cases) {
+       test(
+         () => {
+           element.value = actualValue;
+
+           const actualValueAsDate = element.valueAsDate;
+           if (actualValueAsDate instanceof Date) {
+             assert_equals(
+               actualValueAsDate.getTime(),
+               expectedValueAsDate.getTime(),
+               `valueAsDate returns an invalid date (actual: ${actualValueAsDate.toISOString()}, ` +
+               `expected: ${expectedValueAsDate.toISOString()})`
+             );
+           } else {
+             assert_equals(actualValueAsDate, expectedValueAsDate);
+           }
+         },
+         `valueAsDate getter on type ${type} (actual value: ${actualValue}, ` +
+         `expected valueAsDate: ${expectedValueAsDate})`
+       );
+     }
+   }
+
+   function testValueAsDateSetter(type, element, cases) {
+     for (const [valueAsDate, expectedValue] of cases) {
+       test(() => {
+         element.valueAsDate = valueAsDate;
+         assert_equals(element.value, expectedValue);
+       }, `valueAsDate setter on type ${type} (actual valueAsDate: ${valueAsDate}, expected value: ${expectedValue})`);
+     }
+   }
+
+   const dateInput = document.getElementById("input_date");
+   testValueAsDateGetter("date", dateInput, [
+     ["", null],
+     ["0000-12-10", null],
+     ["2019-00-12", null],
+     ["2019-12-00", null],
+     ["2019-13-10", null],
+     ["2019-02-29", null],
+     ["2019-12-10", new Date("2019-12-10T00:00:00.000Z")],
+     ["2016-02-29", new Date("2016-02-29T00:00:00.000Z")] // Leap year
+   ]);
+   testValueAsDateSetter("date", dateInput, [
+     [new Date("2019-12-10T00:00:00.000Z"), "2019-12-10"],
+     [new Date("2016-02-29T00:00:00.000Z"), "2016-02-29"] // Leap year
+   ]);
+
+   const monthInput = document.getElementById("input_month");
+   testValueAsDateGetter("month", monthInput, [
+     ["", null],
+     ["0000-12", null],
+     ["2019-00", null],
+     ["2019-12", new Date("2019-12-01T00:00:00.000Z")]
+   ]);
+   testValueAsDateSetter("month", monthInput, [[new Date("2019-12-01T00:00:00.000Z"), "2019-12"]]);
+
+   const weekInput = document.getElementById("input_week");
+   testValueAsDateGetter("week", weekInput, [
+     ["", null],
+     ["0000-W50", null],
+     ["2019-W00", null],
+     ["2019-W60", null],
+     ["2019-W50", new Date("2019-12-09T00:00:00.000Z")]
+   ]);
+   testValueAsDateSetter("week", weekInput, [[new Date("2019-12-09T00:00:00.000Z"), "2019-W50"]]);
+
+   const timeInput = document.getElementById("input_time");
+   testValueAsDateGetter("time", timeInput, [
+     ["", null],
+     ["24:00", null],
+     ["00:60", null],
+     ["00:00", new Date("1970-01-01T00:00:00.000Z")],
+     ["12:00", new Date("1970-01-01T12:00:00.000Z")],
+     ["23:59", new Date("1970-01-01T23:59:00.000Z")]
+   ]);
+   testValueAsDateSetter("time", timeInput, [
+     [new Date("1970-01-01T00:00:00.000Z"), "00:00"],
+     [new Date("1970-01-01T12:00:00.000Z"), "12:00"],
+     [new Date("1970-01-01T23:59:00.000Z"), "23:59"]
+   ]);
+  </script>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html
new file mode 100644
index 0000000..321c981
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/input-valueasnumber.html
@@ -0,0 +1,146 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<html>
+ <head>
+  <title>HTMLInputElement valueAsNumber</title>
+  <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com">
+  <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasnumber">
+
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+  <h3>input_valueAsNumber</h3>
+  <hr>
+  <div id="log"></div>
+
+  <input id="input_date" type="date" />
+  <input id="input_month" type="month" />
+  <input id="input_week" type="week" />
+  <input id="input_time" type="time" />
+  <input id="input_datetime-local" type="datetime-local" />
+  <input id="input_number" type="number" />
+  <input id="input_range" type="range" min="0" max="100" />
+
+  <script>
+   "use strict";
+
+   function testValueAsNumberGetter(type, element, cases) {
+     for (const [value, expectedValueAsNumber] of cases) {
+       test(
+         () => {
+           element.value = value;
+           assert_equals(element.valueAsNumber, expectedValueAsNumber);
+         },
+         `valueAsNumber getter on type ${type} (actual value: ${value}, ` +
+         `expected valueAsNumber: ${expectedValueAsNumber})`
+       );
+     }
+   }
+
+   function testValueAsNumberSetter(type, element, cases) {
+     for (const [valueAsNumber, expectedValue] of cases) {
+       test(
+         () => {
+           element.valueAsNumber = valueAsNumber;
+           assert_equals(element.value, expectedValue);
+         },
+         `valueAsNumber setter on type ${type} (actual valueAsNumber: ${valueAsNumber}, ` +
+         `expected value: ${expectedValue})`
+       );
+     }
+   }
+
+   const dateInput = document.getElementById("input_date");
+   testValueAsNumberGetter("date", dateInput, [
+     ["", NaN],
+     ["0000-12-10", NaN],
+     ["2019-00-12", NaN],
+     ["2019-12-00", NaN],
+     ["2019-13-10", NaN],
+     ["2019-02-29", NaN],
+     ["2019-12-10", 1575936000000],
+     ["2016-02-29", 1456704000000] // Leap year
+   ]);
+   testValueAsNumberSetter("date", dateInput, [
+     [0, "1970-01-01"],
+     [1575936000000, "2019-12-10"],
+     [1456704000000, "2016-02-29"] // Leap year
+   ]);
+
+   const monthInput = document.getElementById("input_month");
+   testValueAsNumberGetter("month", monthInput, [
+     ["", NaN],
+     ["0000-12", NaN],
+     ["2019-00", NaN],
+     ["2019-12", 599]
+   ]);
+   testValueAsNumberSetter("month", monthInput, [[599, "2019-12"]]);
+
+   const weekInput = document.getElementById("input_week");
+   testValueAsNumberGetter("week", weekInput, [
+     ["", NaN],
+     ["0000-W50", NaN],
+     ["2019-W00", NaN],
+     ["2019-W60", NaN],
+     ["2019-W50", 1575849600000]
+   ]);
+   testValueAsNumberSetter("week", weekInput, [
+     [0, "1970-W01"],
+     [1575849600000, "2019-W50"]
+   ]);
+
+   const timeInput = document.getElementById("input_time");
+   testValueAsNumberGetter("time", timeInput, [
+     ["", NaN],
+     ["24:00", NaN],
+     ["00:60", NaN],
+     ["00:00", 0],
+     ["12:00", 12 * 3600 * 1000],
+     ["23:59", ((23 * 3600) + (59 * 60)) * 1000]
+   ]);
+   testValueAsNumberSetter("time", timeInput, [
+     [0, "00:00"],
+     [12 * 3600 * 1000, "12:00"],
+     [((23 * 3600) + (59 * 60)) * 1000, "23:59"]
+   ]);
+
+   const dateTimeLocalInput = document.getElementById("input_datetime-local");
+   testValueAsNumberGetter("datetime-local", dateTimeLocalInput, [
+     ["", NaN],
+     ["2019-12-10T00:00", 1575936000000],
+     ["2019-12-10T12:00", 1575979200000]
+   ]);
+   testValueAsNumberSetter("datetime-local", dateTimeLocalInput, [
+     [1575936000000, "2019-12-10T00:00"],
+     [1575979200000, "2019-12-10T12:00"]
+   ]);
+
+   const numberInput = document.getElementById("input_number");
+   testValueAsNumberGetter("number", numberInput, [
+     ["", NaN],
+     ["123", 123],
+     ["123.456", 123.456]
+   ]);
+   testValueAsNumberSetter("number", numberInput, [
+     [123, "123"],
+     [123.456, "123.456"]
+   ]);
+
+   const rangeInput = document.getElementById("input_range");
+   testValueAsNumberGetter("range", rangeInput, [
+     ["", 50],
+     ["0", 0],
+     ["50", 50],
+     ["100", 100],
+     ["-10", 0], // Realign to the min
+     ["110", 100] // Realign to the max
+   ]);
+   testValueAsNumberSetter("range", rangeInput, [
+     [0, "0"],
+     [50, "50"],
+     [100, "100"]
+   ]);
+  </script>
+ </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html
index 9525d3ca..55020117 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/valueMode.html
@@ -302,4 +302,31 @@
   input.value = "foo\r\r\n\n\0";
   assert_equals(input.value, "#000000");
 }, "value IDL attribute of input type color with value attribute");
+
+// MODE FILENAME
+test(function () {
+  var input = document.createElement("input");
+  input.type = "file";
+
+  for (const emptyValue of ["", null]) {
+    input.value = emptyValue;
+    assert_equals(input.value, "", `input.value is empty after assigning ${emptyValue}`);
+  }
+
+  for (const invalidValue of ["foo", 10, undefined]) {
+    assert_throws("InvalidStateError", () => {
+      input.value = invalidValue;
+    });
+    assert_equals(input.value, "", `input.value is empty after assigning ${invalidValue}`);
+  }
+}, "value IDL attribute of input type file without value attribute");
+test(function() {
+  var input = document.createElement("input");
+  input.type = "file";
+  input.setAttribute("value", "bar");
+  assert_equals(input.value, "", "input.value is empty even with a value attribute");
+
+  input.value = "";
+  assert_equals(input.getAttribute("value"), "bar", "Setting input.value does not change the value attribute");
+}, "value IDL attribute of input type file with value attribute");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
index 4c50670..33264dd 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
@@ -46,7 +46,7 @@
           assert_equals(input_sources[1].handedness, "none");
         });
 
-        fakeDeviceController.removeInputSource(input_source_1);
+        input_source_1.disconnect();
 
         session.requestAnimationFrame((time, xrFrame) => {
           let input_sources = session.inputSources;
diff --git a/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html b/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html
index 5ab8f4e..c96b87fd 100644
--- a/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html
+++ b/third_party/blink/web_tests/fast/css/usecounter-summary-display-block.html
@@ -7,10 +7,14 @@
 }
 
 summary.second {
-    display: some-invalid-value;
+    display: flex;
 }
 
 summary.third {
+    display: some-invalid-value;
+}
+
+summary.fourth {
     display: block;
 }
 </style>
@@ -34,14 +38,23 @@
 
     summary.classList.add('first');
     assert_equals(
-        'list-item', window.getComputedStyle(summary).display,
-        'the author stylsheet display property should be in effect');
+        'block', window.getComputedStyle(summary).display,
+        'the summary is prevented from generating a ::marker since it already has a disclosure symbol');
+    assert_false(
+        isCounted(),
+        'the author did not specify `display: block` so it should not not be counted');
+
+    summary.classList.remove('first');
+    summary.classList.add('second');
+    assert_equals(
+        'flex', window.getComputedStyle(summary).display,
+        'the author stylesheet display property should be in effect');
     assert_false(
         isCounted(),
         'valid values other than block should not be counted');
 
-    summary.classList.remove('first');
-    summary.classList.add('second');
+    summary.classList.remove('second');
+    summary.classList.add('third');
     assert_equals(
         'block', window.getComputedStyle(summary).display,
         'the user agent stylesheet display property should be in effect ' +
@@ -50,8 +63,8 @@
         isCounted(),
         'only values from an author rule should be counted');
 
-    summary.classList.remove('second');
-    summary.classList.add('third');
+    summary.classList.remove('third');
+    summary.classList.add('fourth');
     assert_equals(
         'block', window.getComputedStyle(summary).display,
         'the author stylesheet display property should be in effect');
diff --git a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
index 97bc453..a87c14e6 100644
--- a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
+++ b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
@@ -1,30 +1,7 @@
 <!DOCTYPE html>
-<script>
-document.addEventListener('change', e => {
-  parent.inputOrChangeEvents.push('change/' + e.target.id);
-});
-document.addEventListener('input', e => {
-  parent.inputOrChangeEvents.push('input/' + e.target.id);
-});
-</script>
 <div></div>
-<input type=checkbox disabled id="checkbox-disabled">
-<input type=text disabled id="text-disabled">
-<input type=checkbox id="checkbox-unmodified">
-<input type=text id="text-unmodified">
-<input type=file id="file-modified">
-<input type=file id="file-unmodified">
-<input type=date id="date-modified">
-<input type=date id="date-unmodified">
-<textarea id="textarea-modified"></textarea>
-<textarea id="textarea-unmodified">abc
-def</textarea>
-<select id="select-modified"><option>1<option>2</select>
-<select id="select-unmodified" multiple>
-<option selected>1</option>
-<option>2</option>
-<option selected>3</option>
-</select>
+<input type=checkbox disabled>
+<input type=text disabled>
 <script>
-document.querySelector('div').innerHTML = '<input type=checkbox id="checkbox-modified"><input type=text id="text-modified">';
+document.querySelector('div').innerHTML = '<input type=checkbox><input type=text>'
 </script>
diff --git a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
index 6e7be469..af57ac4 100644
--- a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
+++ b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
@@ -2,72 +2,33 @@
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../../external/wpt/html/interaction/focus/the-autofocus-attribute/resources/utils.js"></script>
-<script src="file/resources/file-drag-common.js"></script>
-<style>
-/* Make the top-left corner of the iframe is equal to the top-left corner
-   of the body.  It's required for dragFilesOntoInput(). */
-body {
-  margin: 0;
-}
-iframe {
-  border: none;
-}
-</style>
 <body>
 <iframe src="resources/state-restore-dynamic-controls-frame.html"></iframe>
 <script>
-window.inputOrChangeEvents = [];
-
 promise_test(async t => {
   await waitForEvent(window, 'load', {once:true});
   const iframe = document.querySelector('iframe');
-  let doc = iframe.contentDocument;
-  const container = doc.querySelector('div');
+  const container = iframe.contentDocument.querySelector('div');
   // Change states of controls
   container.firstChild.click();
   container.lastChild.focus();
   eventSender.keyDown('z');
-  dragFilesOntoInput(doc.querySelector('#file-modified'), ['foo.txt']);
-  doc.querySelector('#date-modified').value = '2020-01-08';
-  doc.querySelector('#textarea-modified').focus();
-  eventSender.keyDown('y');
-  doc.querySelector('#select-modified').focus();
-  eventSender.keyDown('2');
   assert_true(container.firstChild.checked, 'sanity check for a checkbox');
   assert_equals(container.lastChild.value, 'z', 'sanity check for a text field');
-  assert_equals(doc.querySelector('#textarea-modified').value, 'y', 'sanity check for a textarea');
-  assert_equals(doc.querySelector('#select-modified').value, '2', 'sanity check for a select');
-
-  // Flush asynchronous input/change events
-  await timeOut(t, 0);
 
   // Navigate
   iframe.src = 'data:text/html,<h1></h1>';
   await waitForEvent(iframe, 'load', {once:true});
 
-  inputOrChangeEvents = []
   // Navigate back
   history.back();
   await waitForEvent(iframe, 'load', {once:true});
   // Wait until finishing the restore task.
   await timeOut(t, 0);
-  doc = iframe.contentDocument;
-  const inputs = doc.querySelectorAll('input');
+  const inputs = iframe.contentDocument.querySelectorAll('input');
   assert_true(inputs[0].checked, 'Checkbox state should be restored.');
   assert_equals(inputs[1].value, 'z', 'Text field state should be restored.');
   assert_false(inputs[2].checked, 'Checkbox should have initial value.');
   assert_equals(inputs[3].value, '', 'Text field should have initial value.');
-  assert_equals(doc.querySelector('textarea').value, 'y');
-  assert_equals(doc.querySelector('select').value, '2');
-
-  // Wait for asynchronous input/change events
-  await timeOut(t, 0);
-  assert_array_equals(inputOrChangeEvents, [
-      'input/file-modified', 'change/file-modified',
-      'input/checkbox-modified', 'change/checkbox-modified',
-      'input/text-modified', 'change/text-modified',
-      'input/date-modified', 'change/date-modified',
-      'input/textarea-modified', 'change/textarea-modified',
-      'input/select-modified', 'change/select-modified']);
 }, 'Control states should be restored correctly even if controls were inserted before existing controls.');
 </script>
diff --git a/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html
new file mode 100644
index 0000000..58b1d2d3
--- /dev/null
+++ b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc-expected.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+#scroller {
+  height: 200px;
+  overflow: scroll;
+}
+#wrapper {
+  margin-top: 100px;
+  width: 200px;
+  height: 200px;
+  background: green;
+}
+</style>
+<p>Test passes if there is <strong>no red</strong>.</p>
+<div id="scroller">
+  <div id="wrapper">
+</div>
diff --git a/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html
new file mode 100644
index 0000000..d9e6ae8
--- /dev/null
+++ b/third_party/blink/web_tests/fast/overflow/visual-overflow-recalc.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<script src="../../resources/run-after-layout-and-paint.js"></script>
+<style>
+#scroller {
+  height: 200px;
+  overflow: scroll;
+  position: relative;
+}
+#wrapper {
+  margin-top: 100px;
+  width: 200px;
+  height: 200px;
+  overflow: hidden;
+  font-family: Ahem;
+  color: green;
+}
+#red {
+  background: red;
+  width: 200px;
+  height: 200px;
+  position: absolute;
+  top: 100px;
+  z-index: -1;
+}
+</style>
+<p>Test passes if there is <strong>no red</strong>.</p>
+<div id="scroller">
+  <div id="wrapper">
+    <span id="inlineouter">
+      <span id="inlineinner">X</span>
+    </span>
+  </div>
+  <div id="red"></div>
+</div>
+
+<script>
+  runAfterLayoutAndPaint(function() {
+    inlineinner.style.fontSize = "200px";
+  }, true);
+</script>
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt
deleted file mode 100644
index 379ff10..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/pointerevent_coalesced_events_attributes-expected.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-This is a testharness.js-based test.
-PASS touch coalesced events attributes in pointerevents
-PASS touch pointercancel should not have any coalesced events
-PASS touch pointerover should not have any coalesced events
-PASS touch pointerenter should not have any coalesced events
-PASS touch pointerdown should not have any coalesced events
-PASS touch pointermove should have >2 coalesced events as main thread is busy.
-PASS touch pointermove coalesced events should all be marked as trusted.
-PASS touch time stamps of coalesced events must be ascending.
-PASS touch pointermove coalesced events should all bubbles and cancelable as false.
-PASS touch pointerup should not have any coalesced events
-PASS touch pointerout should not have any coalesced events
-PASS touch pointerleave should not have any coalesced events
-Harness: the test ran to completion.
-
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index ab981ac3..5f47b92 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -535,7 +535,6 @@
     'chromium.swarm': {
       'Android N5 Swarm': 'android_release_bot_minimal_symbols',
       'Android N5X Swarm': 'android_release_bot_minimal_symbols_arm64',
-      'ChromeOS Swarm': 'cros_chrome_sdk',
       'Linux Swarm': 'release_bot_minimal_symbols',
       'Mac Swarm': 'release_bot_mac_strip_minimal_symbols',
       'Windows Swarm': 'release_bot_minimal_symbols',
@@ -573,7 +572,6 @@
       'Linux Debug Builder': 'debug_bot',
       'Linux V8 FYI Release (NVIDIA)': 'gpu_tests_release_trybot',
       'Linux V8 FYI Release - pointer compression (NVIDIA)': 'gpu_tests_release_trybot_ptr_comp',
-      'Linux Snapshot Builder': 'release_bot',
       'Mac V8 FYI Release (Intel)': 'gpu_tests_release_trybot',
       'V8 Android GN (dbg)': 'android_debug_bot',
       'V8 Blink Linux': 'release_bot',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9fe5413..90f3260 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -21710,6 +21710,7 @@
   <int value="1426" label="WEBCAMPRIVATE_SET_HOME"/>
   <int value="1427" label="INPUTMETHODPRIVATE_RESET"/>
   <int value="1428" label="PRINTING_GETPRINTERINFO"/>
+  <int value="1429" label="AUTOTESTPRIVATE_ISARCPACKAGELISTINITIALREFRESHED"/>
 </enum>
 
 <enum name="ExtensionIconState">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 3e80e62d..5773eb3 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -7086,9 +7086,9 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.ImeCount" units="units" expires_after="2020-07-06">
-  <owner>yhanada@google.com</owner>
-  <owner>tetsui@google.com</owner>
+<histogram name="Arc.ImeCount" units="units" expires_after="2020-07-30">
+  <owner>yhanada@chromium.org</owner>
+  <owner>tetsui@chromium.org</owner>
   <summary>
     The number of IME apps installed. Collected at startup and when an IME app
     is installed or uninstalled.
@@ -42132,8 +42132,18 @@
   </summary>
 </histogram>
 
+<histogram name="EphemeralTab.BottomSheet.CloseReason"
+    enum="BottomSheet.StateChangeReason" expires_after="M84">
+  <owner>donnd@chromium.org</owner>
+  <owner>jinsukkim@chromium.org</owner>
+  <summary>
+    Records the reason that the BottomSheet-based Ephemeral Tab panel was
+    closed. Recorded when the UX is hidden. Implemented for Android.
+  </summary>
+</histogram>
+
 <histogram name="EphemeralTab.CloseReason"
-    enum="OverlayPanel.StateChangeReason" expires_after="M82">
+    enum="OverlayPanel.StateChangeReason" expires_after="M84">
   <owner>donnd@chromium.org</owner>
   <owner>jinsukkim@chromium.org</owner>
   <summary>
@@ -42142,7 +42152,7 @@
   </summary>
 </histogram>
 
-<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M82">
+<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M84">
   <owner>donnd@chromium.org</owner>
   <owner>jinsukkim@chromium.org</owner>
   <summary>
@@ -42151,7 +42161,7 @@
   </summary>
 </histogram>
 
-<histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="M82">
+<histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="M84">
   <owner>donnd@chromium.org</owner>
   <owner>jinsukkim@chromium.org</owner>
   <summary>
@@ -42160,7 +42170,7 @@
   </summary>
 </histogram>
 
-<histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="M82">
+<histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="M84">
   <owner>donnd@chromium.org</owner>
   <owner>jinsukkim@chromium.org</owner>
   <summary>
@@ -56234,6 +56244,9 @@
 
 <histogram name="GPU.GPUChannelHostWaitTime.MicroSeconds" units="microseconds"
     expires_after="2020-06-28">
+  <obsolete>
+    Removed 01/2020.
+  </obsolete>
   <owner>kylechar@chromium.org</owner>
   <summary>
     Records how long the browser UI thread spent blocked for a sync IPC sent
@@ -109389,7 +109402,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ManagePasswordsReferrer"
-    enum="ManagePasswordsReferrer" expires_after="M81">
+    enum="ManagePasswordsReferrer" expires_after="M87">
   <owner>jdoerrie@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -109400,7 +109413,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ManagePasswordsReferrerSignedInAndSyncing"
-    enum="ManagePasswordsReferrer" expires_after="M81">
+    enum="ManagePasswordsReferrer" expires_after="M87">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index cbe58186..e4e8d67 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -1,6 +1,7 @@
 AUTOGENERATED FILE DO NOT EDIT
 See https://bit.ly/update-benchmarks-info to make changes
 Benchmark name,Individual owners,Component,Documentation,Tags
+UNSCHEDULED_blink_perf.service_worker,"shimazu@chromium.org, falken@chromium.org, ting.shao@intel.com",Blink>ServiceWorker,https://bit.ly/blink-perf-benchmarks,
 angle_perftests,"jmadill@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU>ANGLE,,
 base_perftests,"skyostil@chromium.org, gab@chromium.org",Internals>SequenceManager,https://chromium.googlesource.com/chromium/src/+/HEAD/base/README.md#performance-testing,
 blink_perf.accessibility,dmazzoni@chromium.org,Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py
index ee18b1881..63aa2fc 100644
--- a/tools/perf/benchmarks/blink_perf.py
+++ b/tools/perf/benchmarks/blink_perf.py
@@ -4,8 +4,8 @@
 
 from __future__ import print_function
 
-import os
 import collections
+import os
 
 from core import path_util
 from core import perf_benchmark
@@ -14,6 +14,7 @@
 
 from telemetry import benchmark
 from telemetry import page as page_module
+from telemetry.core import memory_cache_http_server
 from telemetry.page import legacy_page_test
 from telemetry.page import shared_page_state
 from telemetry import story
@@ -393,6 +394,40 @@
     return 'blink_perf.bindings'
 
 
+class ServiceWorkerRequestHandler(
+    memory_cache_http_server.MemoryCacheDynamicHTTPRequestHandler):
+  """This handler returns dynamic responses for service worker perf tests.
+  """
+  _SIZE_10K = 10240
+  _SIZE_1M = 1048576
+
+  def ResponseFromHandler(self, path):
+    if path.endswith('/service_worker/resources/data/10K.txt'):
+      return self.MakeResponse('c' * self._SIZE_10K, 'text/plain', False)
+    elif path.endswith('/service_worker/resources/data/1M.txt'):
+      return self.MakeResponse('c' * self._SIZE_1M, 'text/plain', False)
+    return None
+
+
+@benchmark.Info(
+    component='Blink>ServiceWorker',
+    emails=[
+        'shimazu@chromium.org', 'falken@chromium.org', 'ting.shao@intel.com'
+    ],
+    documentation_url='https://bit.ly/blink-perf-benchmarks')
+class BlinkPerfServiceWorker(_BlinkPerfBenchmark):
+  SUBDIR = 'service_worker'
+
+  @classmethod
+  def Name(cls):
+    return 'UNSCHEDULED_blink_perf.service_worker'
+
+  def CreateStorySet(self, options):
+    story_set = super(BlinkPerfServiceWorker, self).CreateStorySet(options)
+    story_set.SetRequestHandlerClass(ServiceWorkerRequestHandler)
+    return story_set
+
+
 @benchmark.Info(emails=['futhark@chromium.org', 'andruud@chromium.org'],
                 documentation_url='https://bit.ly/blink-perf-benchmarks',
                 component='Blink>CSS')
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 2d0d953..69fefda 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -292,9 +292,6 @@
 crbug.com/1030735 [ android-weblayer ] startup.mobile/maps_pwa:with_http_cache [ Skip ]
 
 # Benchmark: system_health.common_desktop
-crbug.com/984599 [ linux ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/984599 [ win10 ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027686 [ desktop ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/773084 [ mac ] system_health.common_desktop/browse:tools:maps [ Skip ]
 crbug.com/903417 [ mac ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ]
 crbug.com/903417 [ win ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ]
@@ -305,7 +302,6 @@
 crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24:2018 [ Skip ]
 crbug.com/931185 [ win7 ] system_health.common_desktop/browse:media:youtubetv:2019 [ Skip ]
-crbug.com/958422 [ win7 ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/1008028 [ desktop ] system_health.common_desktop/browse:news:hackernews:2018 [ Skip ]
 crbug.com/1009838 [ mac ] system_health.common_desktop/browse:tools:maps:2019 [ Skip ]
 crbug.com/1008001 [ win ] system_health.common_desktop/browse:tools:sheets:2019 [ Skip ]
@@ -329,8 +325,6 @@
 crbug.com/923116 [ android ] system_health.common_mobile/browse:shopping:avito [ Skip ]
 crbug.com/923527 [ android-webview ] system_health.common_mobile/load:media:soundcloud:2018 [ Skip ]
 crbug.com/954949 [ android-nexus-5x android-webview ] system_health.common_mobile/browse:news:washingtonpost [ Skip ]
-crbug.com/961417 [ android-go ] system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027686 [ android ] system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/979786 [ android-nexus-5x android-webview ] system_health.common_mobile/browse:news:cricbuzz [ Skip ]
 crbug.com/1002640 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:omnibox [ Skip ]
@@ -340,9 +334,6 @@
 crbug.com/1039801 [ android-webview ] system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
 
 # Benchmark: system_health.memory_desktop
-crbug.com/1027686 [ linux ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027902 [ win ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027902 [ mac ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/984599 [ linux ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ]
 crbug.com/984599 [ mac ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ]
 crbug.com/1000426 [ win ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ]
@@ -408,9 +399,6 @@
 crbug.com/923527 [ android-webview ] system_health.memory_mobile/load:media:soundcloud:2018 [ Skip ]
 crbug.com/947267 [ android-nexus-5x ] system_health.memory_mobile/background:media:imgur [ Skip ]
 crbug.com/954949 [ android-nexus-5x android-webview ] system_health.memory_mobile/browse:news:washingtonpost [ Skip ]
-crbug.com/961417 [ android-go ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027686 [ android ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1016701 [ android-nexus-5x ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/1002640 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:omnibox [ Skip ]
 crbug.com/1017661 [ android-nexus-5x ] system_health.memory_mobile/browse:media:flickr_infinite_scroll [ Skip ]
@@ -429,7 +417,6 @@
 crbug.com/875159 [ win10 ] v8.browsing_desktop/browse:media:imgur [ Skip ]
 crbug.com/954959 [ linux ] v8.browsing_desktop/browse:media:pinterest:2018 [ Skip ]
 crbug.com/954959 [ linux ] v8.browsing_desktop/browse:tools:maps [ Skip ]
-crbug.com/958422 v8.browsing_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/958507 [ desktop ] v8.browsing_desktop/browse:media:imgur [ Skip ]
 crbug.com/1008028 [ desktop ] v8.browsing_desktop/browse:news:hackernews:2018 [ Skip ]
 crbug.com/1009838 [ mac ] v8.browsing_desktop/browse:tools:maps:2019 [ Skip ]
@@ -440,7 +427,6 @@
 crbug.com/788796 [ linux ] v8.browsing_desktop-future/browse:media:imgur [ Skip ]
 crbug.com/773084 [ mac ] v8.browsing_desktop-future/browse:tools:maps [ Skip ]
 crbug.com/906654 v8.browsing_desktop-future/browse:search:google [ Skip ]
-crbug.com/958422 v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/958507 [ desktop ] v8.browsing_desktop-future/browse:media:imgur [ Skip ]
 crbug.com/1008028 [ desktop ] v8.browsing_desktop-future/browse:news:hackernews:2018 [ Skip ]
 crbug.com/1008001 [ win ] v8.browsing_desktop-future/browse:tools:sheets:2019 [ Skip ]
@@ -461,8 +447,6 @@
 crbug.com/923116 [ android ] v8.browsing_mobile/browse:shopping:avito [ Skip ]
 crbug.com/929839 [ android-go ] v8.browsing_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/954949 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:news:washingtonpost [ Skip ]
-crbug.com/961417 [ android-go ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
-crbug.com/1027686 [ android ] v8.browsing_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/979786 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:media:flickr_infinite_scroll [ Skip ]
 crbug.com/1002640 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] v8.browsing_mobile/browse:chrome:omnibox [ Skip ]
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc
index a49a34f..89506ba 100644
--- a/ui/aura/native_window_occlusion_tracker_win.cc
+++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -7,7 +7,9 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/synchronization/waitable_event.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -26,10 +28,15 @@
 const base::TimeDelta kUpdateOcclusionDelay =
     base::TimeDelta::FromMilliseconds(16);
 
+// This global variable can be accessed only on main thread.
 NativeWindowOcclusionTrackerWin* g_tracker = nullptr;
 
 }  // namespace
 
+NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator*
+    NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::instance_ =
+        nullptr;
+
 NativeWindowOcclusionTrackerWin*
 NativeWindowOcclusionTrackerWin::GetOrCreateInstance() {
   if (!g_tracker)
@@ -38,6 +45,11 @@
   return g_tracker;
 }
 
+void NativeWindowOcclusionTrackerWin::DeleteInstanceForTesting() {
+  delete g_tracker;
+  g_tracker = nullptr;
+}
+
 void NativeWindowOcclusionTrackerWin::Enable(Window* window) {
   DCHECK(window->IsRootWindow());
   if (window->HasObserver(this)) {
@@ -56,7 +68,8 @@
       FROM_HERE,
       base::BindOnce(
           &WindowOcclusionCalculator::EnableOcclusionTrackingForWindow,
-          base::Unretained(occlusion_calculator_.get()), root_window_hwnd));
+          base::Unretained(WindowOcclusionCalculator::GetInstance()),
+          root_window_hwnd));
 }
 
 void NativeWindowOcclusionTrackerWin::Disable(Window* window) {
@@ -70,7 +83,8 @@
       FROM_HERE,
       base::BindOnce(
           &WindowOcclusionCalculator::DisableOcclusionTrackingForWindow,
-          base::Unretained(occlusion_calculator_.get()), root_window_hwnd));
+          base::Unretained(WindowOcclusionCalculator::GetInstance()),
+          root_window_hwnd));
 }
 
 void NativeWindowOcclusionTrackerWin::OnWindowVisibilityChanged(Window* window,
@@ -83,18 +97,14 @@
   update_occlusion_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&WindowOcclusionCalculator::HandleVisibilityChanged,
-                     base::Unretained(occlusion_calculator_.get()), visible));
+                     base::Unretained(WindowOcclusionCalculator::GetInstance()),
+                     visible));
 }
 
 void NativeWindowOcclusionTrackerWin::OnWindowDestroying(Window* window) {
   Disable(window);
 }
 
-NativeWindowOcclusionTrackerWin**
-NativeWindowOcclusionTrackerWin::GetInstanceForTesting() {
-  return &g_tracker;
-}
-
 NativeWindowOcclusionTrackerWin::NativeWindowOcclusionTrackerWin()
     :  // Use a COMSTATaskRunner so that registering and unregistering
        // event hooks will happen on the same thread, as required by Windows,
@@ -111,15 +121,24 @@
       session_change_observer_(
           base::BindRepeating(&NativeWindowOcclusionTrackerWin::OnSessionChange,
                               base::Unretained(this))) {
-  occlusion_calculator_ = std::make_unique<WindowOcclusionCalculator>(
-      update_occlusion_task_runner_, base::SequencedTaskRunnerHandle::Get());
+  WindowOcclusionCalculator::CreateInstance(
+      update_occlusion_task_runner_, base::SequencedTaskRunnerHandle::Get(),
+      base::BindRepeating(
+          &NativeWindowOcclusionTrackerWin::UpdateOcclusionState,
+          weak_factory_.GetWeakPtr()));
 }
 
 NativeWindowOcclusionTrackerWin::~NativeWindowOcclusionTrackerWin() {
-  // This shouldn't be reached in production code, because if it is,
-  // |occlusion_calculator_| will be deleted on the ui thread, which is
-  // problematic if there tasks scheduled on the background thread.
-  // Tests are allowed to delete the instance after running all pending tasks.
+  // |occlusion_calculator_| must be deleted on its sequence because it needs
+  // to unregister event hooks on COMSTA thread.
+  // This code is intended to be used in tests and shouldn't be reached in
+  // production code because it blocks the main thread.
+  base::WaitableEvent done_event;
+  update_occlusion_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WindowOcclusionCalculator::DeleteInstanceForTesting,
+                     &done_event));
+  done_event.Wait();
 }
 
 // static
@@ -246,8 +265,11 @@
 NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
     WindowOcclusionCalculator(
         scoped_refptr<base::SequencedTaskRunner> task_runner,
-        scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner)
-    : task_runner_(task_runner), ui_thread_task_runner_(ui_thread_task_runner) {
+        scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner,
+        UpdateOcclusionStateCallback update_occlusion_state_callback)
+    : task_runner_(task_runner),
+      ui_thread_task_runner_(ui_thread_task_runner),
+      update_occlusion_state_callback_(update_occlusion_state_callback) {
   if (base::win::GetVersion() >= base::win::Version::WIN10) {
     ::CoCreateInstance(__uuidof(VirtualDesktopManager), nullptr, CLSCTX_ALL,
                        IID_PPV_ARGS(&virtual_desktop_manager_));
@@ -257,7 +279,25 @@
 
 NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
     ~WindowOcclusionCalculator() {
-  DCHECK(global_event_hooks_.empty());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  UnregisterEventHooks();
+}
+
+void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::CreateInstance(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner,
+    UpdateOcclusionStateCallback update_occlusion_state_callback) {
+  DCHECK(!instance_);
+  instance_ = new WindowOcclusionCalculator(task_runner, ui_thread_task_runner,
+                                            update_occlusion_state_callback);
+}
+
+void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
+    DeleteInstanceForTesting(base::WaitableEvent* done_event) {
+  DCHECK(instance_);
+  delete instance_;
+  instance_ = nullptr;
+  done_event->Signal();
 }
 
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
@@ -312,24 +352,28 @@
     LONG idChild,
     DWORD dwEventThread,
     DWORD dwmsEventTime) {
-  g_tracker->occlusion_calculator_->ProcessEventHookCallback(event, hwnd,
-                                                             idObject, idChild);
+  if (instance_)
+    instance_->ProcessEventHookCallback(event, hwnd, idObject, idChild);
 }
 
 // static
 BOOL CALLBACK NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
     ComputeNativeWindowOcclusionStatusCallback(HWND hwnd, LPARAM lParam) {
-  return g_tracker->occlusion_calculator_
-      ->ProcessComputeNativeWindowOcclusionStatusCallback(
-          hwnd, reinterpret_cast<base::flat_set<DWORD>*>(lParam));
+  if (instance_) {
+    return instance_->ProcessComputeNativeWindowOcclusionStatusCallback(
+        hwnd, reinterpret_cast<base::flat_set<DWORD>*>(lParam));
+  }
+  return FALSE;
 }
 
 // static
 BOOL CALLBACK NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
     UpdateVisibleWindowProcessIdsCallback(HWND hwnd, LPARAM lParam) {
-  g_tracker->occlusion_calculator_
-      ->ProcessUpdateVisibleWindowProcessIdsCallback(hwnd);
-  return TRUE;
+  if (instance_) {
+    instance_->ProcessUpdateVisibleWindowProcessIdsCallback(hwnd);
+    return TRUE;
+  }
+  return FALSE;
 }
 
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
@@ -416,10 +460,8 @@
   // Post a task to the browser ui thread to update the window occlusion state
   // on the root windows.
   ui_thread_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&NativeWindowOcclusionTrackerWin::UpdateOcclusionState,
-                     base::Unretained(g_tracker),
-                     root_window_hwnds_occlusion_state_));
+      FROM_HERE, base::BindOnce(update_occlusion_state_callback_,
+                                root_window_hwnds_occlusion_state_));
 }
 
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
@@ -598,7 +640,7 @@
       FROM_HERE,
       base::BindOnce(
           &WindowOcclusionCalculator::ScheduleOcclusionCalculationIfNeeded,
-          base::Unretained(this)));
+          weak_factory_.GetWeakPtr()));
 }
 
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
diff --git a/ui/aura/native_window_occlusion_tracker_win.h b/ui/aura/native_window_occlusion_tracker_win.h
index 7746998..751562e9 100644
--- a/ui/aura/native_window_occlusion_tracker_win.h
+++ b/ui/aura/native_window_occlusion_tracker_win.h
@@ -13,8 +13,10 @@
 #include <memory>
 #include <vector>
 
+#include "base/callback_forward.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
+#include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -23,13 +25,16 @@
 #include "ui/aura/window_observer.h"
 #include "ui/base/win/session_change_observer.h"
 
-namespace aura {
-
-// Required to declare a friend class.
-namespace test {
-class AuraTestHelper;
+namespace base {
+class WaitableEvent;
 }
 
+namespace gfx {
+class Rect;
+}
+
+namespace aura {
+
 // This class keeps track of whether any HWNDs are occluding any app windows.
 // It notifies the host of any app window whose occlusion state changes. Most
 // code should not need to use this; it's an implementation detail.
@@ -37,6 +42,8 @@
  public:
   static NativeWindowOcclusionTrackerWin* GetOrCreateInstance();
 
+  static void DeleteInstanceForTesting();
+
   // Enables notifying the host of |window| via SetNativeWindowOcclusionState()
   // when the occlusion state has been computed.
   void Enable(Window* window);
@@ -53,20 +60,27 @@
 
  private:
   friend class NativeWindowOcclusionTrackerTest;
-  friend class test::AuraTestHelper;
-
-  // Returns a pointer to global instance.
-  static NativeWindowOcclusionTrackerWin** GetInstanceForTesting();
 
   // This class computes the occlusion state of the tracked windows.
   // It runs on a separate thread, and notifies the main thread of
   // the occlusion state of the tracked windows.
-  class AURA_EXPORT WindowOcclusionCalculator {
+  class WindowOcclusionCalculator {
    public:
-    WindowOcclusionCalculator(
+    using UpdateOcclusionStateCallback = base::RepeatingCallback<void(
+        const base::flat_map<HWND, Window::OcclusionState>&)>;
+
+    // Creates WindowOcclusionCalculator instance. Must be called on UI thread.
+    static void CreateInstance(
         scoped_refptr<base::SequencedTaskRunner> task_runner,
-        scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner);
-    ~WindowOcclusionCalculator();
+        scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner,
+        UpdateOcclusionStateCallback update_occlusion_state_callback);
+
+    // Returns existing WindowOcclusionCalculator instance.
+    static WindowOcclusionCalculator* GetInstance() { return instance_; }
+
+    // Deletes |instance_| and signals |done_event|. Must be called on COMSTA
+    // thread.
+    static void DeleteInstanceForTesting(base::WaitableEvent* done_event);
 
     void EnableOcclusionTrackingForWindow(HWND hwnd);
     void DisableOcclusionTrackingForWindow(HWND hwnd);
@@ -75,8 +89,11 @@
     void HandleVisibilityChanged(bool visible);
 
    private:
-    friend class NativeWindowOcclusionTrackerTest;
-    friend class test::AuraTestHelper;
+    WindowOcclusionCalculator(
+        scoped_refptr<base::SequencedTaskRunner> task_runner,
+        scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner,
+        UpdateOcclusionStateCallback update_occlusion_state_callback);
+    ~WindowOcclusionCalculator();
 
     // Registers event hooks, if not registered.
     void MaybeRegisterEventHooks();
@@ -164,6 +181,8 @@
     // if we we can't tell for sure.
     base::Optional<bool> IsWindowOnCurrentVirtualDesktop(HWND hwnd);
 
+    static WindowOcclusionCalculator* instance_;
+
     // Task runner for our thread.
     scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
@@ -171,6 +190,9 @@
     // task is posted to this task runner.
     const scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner_;
 
+    // Callback used to update occlusion state on UI thread.
+    UpdateOcclusionStateCallback update_occlusion_state_callback_;
+
     // Map of root app window hwnds and their occlusion state. This contains
     // both visible and hidden windows.
     base::flat_map<HWND, Window::OcclusionState>
@@ -214,6 +236,8 @@
 
     SEQUENCE_CHECKER(sequence_checker_);
 
+    base::WeakPtrFactory<WindowOcclusionCalculator> weak_factory_{this};
+
     DISALLOW_COPY_AND_ASSIGN(WindowOcclusionCalculator);
   };
 
@@ -246,14 +270,14 @@
   // This is set by UpdateOcclusionState. It is currently only used by tests.
   int num_visible_root_windows_ = 0;
 
-  std::unique_ptr<WindowOcclusionCalculator> occlusion_calculator_;
-
   // Manages observation of Windows Session Change messages.
   ui::SessionChangeObserver session_change_observer_;
 
   // If the screen is locked, windows are considered occluded.
   bool screen_locked_ = false;
 
+  base::WeakPtrFactory<NativeWindowOcclusionTrackerWin> weak_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(NativeWindowOcclusionTrackerWin);
 };
 
diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc
index a0bf299..2074c2e 100644
--- a/ui/aura/test/aura_test_helper.cc
+++ b/ui/aura/test/aura_test_helper.cc
@@ -34,8 +34,6 @@
 
 #if defined(OS_WIN)
 #include "base/sequenced_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/bind_test_util.h"
 #include "ui/aura/native_window_occlusion_tracker_win.h"
 #endif
 
@@ -168,7 +166,7 @@
   // task runner. Since ThreadPool is destroyed together with TaskEnvironment,
   // NativeWindowOcclusionTrackerWin instance must be deleted as well and
   // recreated on demand in other test.
-  DeleteNativeWindowOcclusionTrackerWin();
+  NativeWindowOcclusionTrackerWin::DeleteInstanceForTesting();
 #endif
 }
 
@@ -187,32 +185,5 @@
   return env_ ? env_.get() : Env::HasInstance() ? Env::GetInstance() : nullptr;
 }
 
-#if defined(OS_WIN)
-void AuraTestHelper::DeleteNativeWindowOcclusionTrackerWin() {
-  NativeWindowOcclusionTrackerWin** global_ptr =
-      NativeWindowOcclusionTrackerWin::GetInstanceForTesting();
-  if (NativeWindowOcclusionTrackerWin* tracker = *global_ptr) {
-    // WindowOcclusionCalculator must be deleted on its sequence. Wait until
-    // it's deleted and then delete the tracker.
-    base::WaitableEvent waitable_event;
-    DCHECK(
-        !tracker->update_occlusion_task_runner_->RunsTasksInCurrentSequence());
-    tracker->update_occlusion_task_runner_->PostTask(
-        FROM_HERE, base::BindLambdaForTesting([tracker, &waitable_event]() {
-          if (tracker->occlusion_calculator_) {
-            tracker->occlusion_calculator_->root_window_hwnds_occlusion_state_
-                .clear();
-            tracker->occlusion_calculator_->UnregisterEventHooks();
-            tracker->occlusion_calculator_.reset();
-          }
-          waitable_event.Signal();
-        }));
-    waitable_event.Wait();
-    delete tracker;
-    *global_ptr = nullptr;
-  }
-}
-#endif  // defined(OS_WIN)
-
 }  // namespace test
 }  // namespace aura
diff --git a/ui/aura/test/aura_test_helper.h b/ui/aura/test/aura_test_helper.h
index d5cb0983..8d636b5 100644
--- a/ui/aura/test/aura_test_helper.h
+++ b/ui/aura/test/aura_test_helper.h
@@ -70,11 +70,6 @@
   Env* GetEnv();
 
  private:
-#if defined(OS_WIN)
-  // Deletes existing NativeWindowOcclusionTrackerWin instance.
-  void DeleteNativeWindowOcclusionTrackerWin();
-#endif  // defined(OS_WIN)
-
   bool setup_called_ = false;
   bool teardown_called_ = false;
   ui::ContextFactory* context_factory_to_restore_ = nullptr;
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn
index 390c198..9ac9d51 100644
--- a/ui/events/BUILD.gn
+++ b/ui/events/BUILD.gn
@@ -50,9 +50,9 @@
   ]
 
   sources = [
+    "keycodes/dom/dom_code_data.inc",
     "keycodes/dom/dom_key_data.inc",
     "keycodes/dom/keycode_converter.cc",
-    "keycodes/dom/keycode_converter_data.inc",
   ]
 
   deps = [
diff --git a/ui/events/keycodes/dom/dom_code.h b/ui/events/keycodes/dom/dom_code.h
index 8da553c..138be7a 100644
--- a/ui/events/keycodes/dom/dom_code.h
+++ b/ui/events/keycodes/dom/dom_code.h
@@ -9,7 +9,7 @@
 
 #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) id = usb
 #define USB_KEYMAP_DECLARATION enum class DomCode
-#include "ui/events/keycodes/dom/keycode_converter_data.inc"
+#include "ui/events/keycodes/dom/dom_code_data.inc"
 #undef USB_KEYMAP
 #undef USB_KEYMAP_DECLARATION
 
diff --git a/ui/events/keycodes/dom/keycode_converter_data.inc b/ui/events/keycodes/dom/dom_code_data.inc
similarity index 100%
rename from ui/events/keycodes/dom/keycode_converter_data.inc
rename to ui/events/keycodes/dom/dom_code_data.inc
diff --git a/ui/events/keycodes/dom/dom_codes.h b/ui/events/keycodes/dom/dom_codes.h
index 2728dc95..481ac5d7 100644
--- a/ui/events/keycodes/dom/dom_codes.h
+++ b/ui/events/keycodes/dom/dom_codes.h
@@ -12,7 +12,7 @@
 #define DOM_CODE_TYPE(x) static_cast<DomCode>(x)
 #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) DOM_CODE_TYPE(usb)
 #define USB_KEYMAP_DECLARATION constexpr DomCode dom_codes[] =
-#include "ui/events/keycodes/dom/keycode_converter_data.inc"
+#include "ui/events/keycodes/dom/dom_code_data.inc"
 #undef DOM_CODE_TYPE
 #undef USB_KEYMAP
 #undef USB_KEYMAP_DECLARATION
diff --git a/ui/events/keycodes/dom/keycode_converter.cc b/ui/events/keycodes/dom/keycode_converter.cc
index df479d0..1eeb38e 100644
--- a/ui/events/keycodes/dom/keycode_converter.cc
+++ b/ui/events/keycodes/dom/keycode_converter.cc
@@ -29,7 +29,7 @@
 #define USB_KEYMAP(usb, evdev, xkb, win, mac, code, id) {usb, 0, code}
 #endif
 #define USB_KEYMAP_DECLARATION const KeycodeMapEntry usb_keycode_map[] =
-#include "ui/events/keycodes/dom/keycode_converter_data.inc"
+#include "ui/events/keycodes/dom/dom_code_data.inc"
 #undef USB_KEYMAP
 #undef USB_KEYMAP_DECLARATION
 
diff --git a/ui/events/keycodes/dom/keycode_converter_unittest.cc b/ui/events/keycodes/dom/keycode_converter_unittest.cc
index 7a266ecf..22e44ac 100644
--- a/ui/events/keycodes/dom/keycode_converter_unittest.cc
+++ b/ui/events/keycodes/dom/keycode_converter_unittest.cc
@@ -21,7 +21,7 @@
 namespace {
 
 // Number of native codes expected to be mapped for each kind of native code.
-// These are in the same order as the columns in keycode_converter_data.inc
+// These are in the same order as the columns in dom_code_data.inc
 // as reflected in the USB_KEYMAP() macro below.
 const size_t expected_mapped_key_count[] = {
   212,  // evdev
@@ -43,7 +43,7 @@
   { usb, code, #id, { evdev, xkb, win, mac } }
 #define USB_KEYMAP_DECLARATION \
   const KeycodeConverterData kKeycodeConverterData[] =
-#include "ui/events/keycodes/dom/keycode_converter_data.inc"
+#include "ui/events/keycodes/dom/dom_code_data.inc"
 #undef USB_KEYMAP
 #undef USB_KEYMAP_DECLARATION
 
diff --git a/ui/events/win/events_win_utils.cc b/ui/events/win/events_win_utils.cc
index fba2f13..81618d7 100644
--- a/ui/events/win/events_win_utils.cc
+++ b/ui/events/win/events_win_utils.cc
@@ -399,7 +399,7 @@
 
 // Conversion scan_code and LParam each other.
 // uint16_t scan_code:
-//     ui/events/keycodes/dom/keycode_converter_data.inc
+//     ui/events/keycodes/dom/dom_code_data.inc
 // 0 - 15bits: represetns the scan code.
 // 28 - 30 bits (0xE000): represents whether this is an extended key or not.
 //
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
index 4c61eca6..b2b673f 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -26,13 +26,16 @@
 import org.chromium.weblayer.NavigationCallback;
 import org.chromium.weblayer.NavigationController;
 import org.chromium.weblayer.NavigationState;
+import org.chromium.weblayer.Tab;
 import org.chromium.weblayer.shell.InstrumentationActivity;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Example test that just starts the weblayer shell.
@@ -47,6 +50,7 @@
     private static final String URL1 = "data:text,foo";
     private static final String URL2 = "data:text,bar";
     private static final String URL3 = "data:text,baz";
+    private static final String URL4 = "data:text,bat";
 
     private static class Callback extends NavigationCallback {
         public static class NavigationCallbackHelper extends CallbackHelper {
@@ -275,6 +279,23 @@
 
     @Test
     @SmallTest
+    public void testGoToIndex() throws Exception {
+        InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
+        setNavigationCallback(activity);
+
+        mActivityTestRule.navigateAndWait(URL2);
+        mActivityTestRule.navigateAndWait(URL3);
+        mActivityTestRule.navigateAndWait(URL4);
+
+        // Navigate back to the 2nd url.
+        assertEquals(URL2, goToIndexAndReturnUrl(activity.getTab(), 1));
+
+        // Navigate forwards to the 4th url.
+        assertEquals(URL4, goToIndexAndReturnUrl(activity.getTab(), 3));
+    }
+
+    @Test
+    @SmallTest
     public void testSameDocument() throws Exception {
         InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(URL1);
         setNavigationCallback(activity);
@@ -396,4 +417,31 @@
         runOnUiThreadBlocking(navigateRunnable);
         mCallback.onCompletedCallback.assertCalledWith(currentCallCount, expectedUrl);
     }
+
+    private String goToIndexAndReturnUrl(Tab tab, int index) throws Exception {
+        NavigationController navigationController =
+                runOnUiThreadBlocking(() -> tab.getNavigationController());
+
+        final CountDownLatch navigationComplete = new CountDownLatch(1);
+        final AtomicReference<String> navigationUrl = new AtomicReference<String>();
+        NavigationCallback navigationCallback = new NavigationCallback() {
+            @Override
+            public void onNavigationCompleted(Navigation navigation) {
+                navigationComplete.countDown();
+                navigationUrl.set(navigation.getUri().toString());
+            }
+        };
+
+        runOnUiThreadBlocking(() -> {
+            navigationController.registerNavigationCallback(navigationCallback);
+            navigationController.goToIndex(index);
+        });
+
+        navigationComplete.await();
+
+        runOnUiThreadBlocking(
+                () -> { navigationController.unregisterNavigationCallback(navigationCallback); });
+
+        return navigationUrl.get();
+    }
 }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
index 6fadce47..f1184178 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
@@ -109,6 +109,10 @@
     }
 
     public Context getContext() {
+        if (mWindowAndroid == null) {
+            return null;
+        }
+
         return mWindowAndroid.getContext().get();
     }
 
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java
index 9362f44..bd085b8 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/NavigationControllerImpl.java
@@ -67,6 +67,13 @@
     }
 
     @Override
+    public void goToIndex(int index) {
+        StrictModeWorkaround.apply();
+        NavigationControllerImplJni.get().goToIndex(
+                mNativeNavigationController, NavigationControllerImpl.this, index);
+    }
+
+    @Override
     public void reload() {
         StrictModeWorkaround.apply();
         NavigationControllerImplJni.get().reload(
@@ -158,6 +165,8 @@
         void goForward(long nativeNavigationControllerImpl, NavigationControllerImpl caller);
         boolean canGoBack(long nativeNavigationControllerImpl, NavigationControllerImpl caller);
         boolean canGoForward(long nativeNavigationControllerImpl, NavigationControllerImpl caller);
+        void goToIndex(
+                long nativeNavigationControllerImpl, NavigationControllerImpl caller, int index);
         void reload(long nativeNavigationControllerImpl, NavigationControllerImpl caller);
         void stop(long nativeNavigationControllerImpl, NavigationControllerImpl caller);
         int getNavigationListSize(
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl
index 08467c4..b087977 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl
+++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigationController.aidl
@@ -24,4 +24,6 @@
   boolean canGoBack() = 8;
 
   boolean canGoForward() = 9;
+
+  void goToIndex(in int index) = 10;
 }
diff --git a/weblayer/browser/navigation_controller_impl.cc b/weblayer/browser/navigation_controller_impl.cc
index 6321e06a65..2aaa1272 100644
--- a/weblayer/browser/navigation_controller_impl.cc
+++ b/weblayer/browser/navigation_controller_impl.cc
@@ -36,6 +36,13 @@
   java_controller_.Reset(env, java_controller);
 }
 
+void NavigationControllerImpl::GoToIndex(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    int index) {
+  return GoToIndex(index);
+}
+
 void NavigationControllerImpl::Navigate(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
@@ -88,6 +95,10 @@
   return web_contents()->GetController().CanGoForward();
 }
 
+void NavigationControllerImpl::GoToIndex(int index) {
+  web_contents()->GetController().GoToIndex(index);
+}
+
 void NavigationControllerImpl::Reload() {
   web_contents()->GetController().Reload(content::ReloadType::NORMAL, false);
 }
diff --git a/weblayer/browser/navigation_controller_impl.h b/weblayer/browser/navigation_controller_impl.h
index 5b4e21f..9e37a7fd 100644
--- a/weblayer/browser/navigation_controller_impl.h
+++ b/weblayer/browser/navigation_controller_impl.h
@@ -47,6 +47,9 @@
                     const base::android::JavaParamRef<jobject>& obj) {
     return CanGoForward();
   }
+  void GoToIndex(JNIEnv* env,
+                 const base::android::JavaParamRef<jobject>& obj,
+                 int index);
   void Reload(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj) {
     Reload();
   }
@@ -77,6 +80,7 @@
   void GoForward() override;
   bool CanGoBack() override;
   bool CanGoForward() override;
+  void GoToIndex(int index) override;
   void Reload() override;
   void Stop() override;
   int GetNavigationListSize() override;
diff --git a/weblayer/public/java/org/chromium/weblayer/NavigationController.java b/weblayer/public/java/org/chromium/weblayer/NavigationController.java
index 7111b3d8..3c59c8d 100644
--- a/weblayer/public/java/org/chromium/weblayer/NavigationController.java
+++ b/weblayer/public/java/org/chromium/weblayer/NavigationController.java
@@ -84,6 +84,15 @@
         }
     }
 
+    public void goToIndex(int index) {
+        ThreadCheck.ensureOnUiThread();
+        try {
+            mNavigationController.goToIndex(index);
+        } catch (RemoteException e) {
+            throw new APICallException(e);
+        }
+    }
+
     public void reload() {
         ThreadCheck.ensureOnUiThread();
         try {
diff --git a/weblayer/public/navigation_controller.h b/weblayer/public/navigation_controller.h
index 25b7c111..6ea9c11 100644
--- a/weblayer/public/navigation_controller.h
+++ b/weblayer/public/navigation_controller.h
@@ -30,6 +30,9 @@
 
   virtual bool CanGoForward() = 0;
 
+  // Navigates to the specified absolute index.
+  virtual void GoToIndex(int index) = 0;
+
   virtual void Reload() = 0;
 
   virtual void Stop() = 0;